Прокси-сервер Javascript по клику

Я хочу проксировать onclick событие

Вот что я пробовал:

HTMLElement.prototype.onclick = new Proxy(HTMLElement.prototype.onclick, {
  set: (target, thisArgs, argsList) => {
    console.log(thisArgs)
    return target.apply(thisArgs, argsList)
  }
}

используя ловушку apply:, я мог бы использовать приведенный выше код для проксирования getElementById. Но когда я пытаюсь проксировать onclick, я получаю ошибку Illegal invocation. Как я могу исправить свой код?


person PapiQ    schedule 21.09.2020    source источник


Ответы (1)


HTMLElement.prototype.onclick является геттером/сеттером. Когда вы ссылаетесь

HTMLElement.prototype.onclick

вы вызываете геттер с контекстом вызова HTMLElement.prototype, но геттер ожидает контекст вызова фактического элемента, поэтому он выбрасывает.

Вместо этого вы можете использовать Object.defineProperty - и, похоже, прокси не нужен, просто перехватите вызов:

const { get, set } = Object.getOwnPropertyDescriptor(HTMLElement.prototype, 'onclick');
Object.defineProperty(HTMLElement.prototype, 'onclick', {
  set: function(newHandler) {
    console.log(newHandler)
    return set.call(this, newHandler)
  },
  get
});

document.body.onclick = () => console.log('foo');
click

person CertainPerformance    schedule 21.09.2020