Javascript: событие onclick срабатывает дважды - PullRequest
0 голосов
/ 02 апреля 2019

Есть ли способ изменить обработчик onclick внутри себя, не вызывая его дважды?

class Xfoo extends HTMLElement {
  constructor() { super(); }

  foobar() {
    alert();
    this.onclick = this.foobar;
} }

let x = document.getElementById('xfoo');
x.onclick = function() { this.foobar(); };

При щелчке элемента xfoo появляются два предупреждения.

1 Ответ

2 голосов
/ 02 апреля 2019

Только не используйте функцию-обертку, напрямую назначьте ее bar.

let foo = document.getElementById("foo");
foo.onclick = function bar() {
  alert();
  this.onclick = function(){bar()};
};
<button id="foo">foo</button>

Что происходит из-за функции оболочки?

Когда вы устанавливаете onclick на function(){bar()}.вы изменяете привязку this. И она присоединяет событие к this, а также this, что составляет window, и послесловия, когда вы нажимаете кнопку из-за всплывающего события, событие вызывается два раза.

Вы также можете bind this и использовать функцию стрелки, если вам нужна функция обертки.

let foo = document.getElementById("foo");
foo.onclick = function bar() {
  alert();
  this.onclick = () => bar.bind(this)();
};
<button id="foo">foo</button>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...