Em JavaScript, qual é a melhor maneira de remover uma função adicionada como ouvinte de eventos usando bind ()?
Exemplo
(function(){
// constructor
MyClass = function() {
this.myButton = document.getElementById("myButtonID");
this.myButton.addEventListener("click", this.clickListener.bind(this));
};
MyClass.prototype.clickListener = function(event) {
console.log(this); // must be MyClass
};
// public method
MyClass.prototype.disableButton = function() {
this.myButton.removeEventListener("click", ___________);
};
})();
A única maneira de pensar é acompanhar todos os ouvintes adicionados ao bind.
Exemplo acima com este método:
(function(){
// constructor
MyClass = function() {
this.myButton = document.getElementById("myButtonID");
this.clickListenerBind = this.clickListener.bind(this);
this.myButton.addEventListener("click", this.clickListenerBind);
};
MyClass.prototype.clickListener = function(event) {
console.log(this); // must be MyClass
};
// public method
MyClass.prototype.disableButton = function() {
this.myButton.removeEventListener("click", this.clickListenerBind);
};
})();
Existem maneiras melhores de fazer isso?
javascript
events
listener
bind
takfuruya
fonte
fonte
this.clickListener = this.clickListener.bind(this);
ethis.myButton.addEventListener("click", this.clickListener);
bindAll
função que simplifica os métodos de ligação. Dentro do inicializador de objetos, você apenas faz_.bindAll(this)
para definir todos os métodos no seu objeto para uma versão vinculada. Alternativamente, se você só quer ligar alguns métodos (que eu recomendo, para evitar vazamentos de memória acidentais), você pode fornecê-los como argumentos:_.bindAll(this, "foo", "bar") // this.baz won't be bound
.Respostas:
Embora o que o @machineghost disse seja verdade, que os eventos sejam adicionados e removidos da mesma maneira, a parte que faltava da equação era a seguinte:
Consulte O bind () altera a referência da função? | Como definir permanentemente?
Portanto, para adicionar ou remover, atribua a referência a uma variável:
Isso funciona como esperado para mim.
fonte
.addEventListener(type, listener)
e.removeEventListener(type, listener)
adicionam e removem eventos em um elemento. Para ambos, você pode passar a referência de função descrita na solução comolistener
parâmetro, com"click"
como tipo. developer.mozilla.org/pt-BR/docs/Web/API/EventTarget/…Para quem tem esse problema ao registrar / remover o ouvinte do componente React de / para a loja Flux, adicione as linhas abaixo ao construtor do seu componente:
fonte
this.onChange = this.onChange.bind(this)
na verdade, era isso que eu estava procurando. A função ligado nathis
para sempre :)Não importa se você usa uma função vinculada ou não; você o remove da mesma maneira que qualquer outro manipulador de eventos. Se o seu problema é que a versão vinculada é sua própria função exclusiva, você pode acompanhar as versões associadas ou usar a
removeEventListener
assinatura que não aceita um manipulador específico (embora, é claro, isso remova outros manipuladores de eventos do mesmo tipo )(Como uma observação lateral,
addEventListener
não funciona em todos os navegadores; você realmente deve usar uma biblioteca como o jQuery para fazer suas conexões de eventos de uma maneira entre navegadores. Além disso, o jQuery tem o conceito de eventos no espaço de nomes, que permitem você deve vincular a "click.foo"; quando quiser remover o evento, pode dizer ao jQuery "remova todos os eventos foo" sem precisar conhecer o manipulador específico ou remover outros manipuladores.)fonte
off
ou nounbind
método. Para remover todos os ouvintes de um elemento, você deve acompanhá-los à medida que são adicionados (o que é algo que o jQuery ou outras bibliotecas podem fazer por você).solução jQuery:
fonte
Tivemos esse problema com uma biblioteca que não pudemos alterar. UI do Office Fabric, o que significava que não era possível alterar a maneira como os manipuladores de eventos foram adicionados. A maneira que resolvemos foi sobrescrever
addEventListener
oEventTarget
protótipo.Isso adicionará uma nova função aos objetos
element.removeAllEventListers("click")
(postagem original: Remover manipulador de cliques da sobreposição de caixa de diálogo de malha )
fonte
Aqui está a solução:
fonte
pode usar sobre o ES7:
fonte
Se você quiser usar o 'onclick', como sugerido acima, tente o seguinte:
Espero que ajude.
fonte
Já faz um tempo, mas o MDN tem uma super explicação sobre isso. Isso me ajudou mais do que as coisas aqui.
MDN :: EventTarget.addEventListener - O valor de "this" dentro do manipulador
Ele fornece uma ótima alternativa para a função handleEvent.
Este é um exemplo com e sem ligação:
Um problema no exemplo acima é que você não pode remover o ouvinte com ligação. Outra solução é usar uma função especial chamada handleEvent para capturar qualquer evento:
fonte