Eu tenho um objeto que contém métodos. Esses métodos são colocados no objeto dentro de uma função anônima. Se parece com isso:
var t = {};
window.document.addEventListener("keydown", function(e) {
t.scroll = function(x, y) {
window.scrollBy(x, y);
};
t.scrollTo = function(x, y) {
window.scrollTo(x, y);
};
});
(há muito mais código, mas isso é o suficiente para mostrar o problema)
Agora, quero interromper o ouvinte de eventos em alguns casos. Portanto, estou tentando fazer um removeEventListener, mas não consigo descobrir como fazer isso. Eu li em outras perguntas que não é possível chamar removeEventListener em funções anônimas, mas isso também acontece nesta situação?
Tenho um método em t criado dentro da função anônima e, portanto, pensei que fosse possível. Se parece com isso:
t.disable = function() {
window.document.removeEventListener("keydown", this, false);
}
Por que não posso fazer isso?
Existe alguma outra (boa) maneira de fazer isso?
Informações de bônus; isso só precisa funcionar no Safari, daí a falta de suporte ao IE.
(Elem.setUserData('eventListener', function(e){console.log('Event fired.');}, null);
e, em seguida, faça Elem.addEventListener ('event', Elem.getUserData ('eventListener'), false); ... e o mesmo para removeEventListener. Espero que você possa ver isso bem.Respostas:
Acredito que seja o ponto de uma função anônima, falta um nome ou uma forma de referenciá-la.
Se eu fosse você, apenas criaria uma função nomeada ou a colocaria em uma variável para que você tenha uma referência a ela.
Você pode então removê-lo por
fonte
this
palavra-chave pode ser confusa. Um bom lugar para ler sobre isso é quirksmode.org/js/this.htmlthis
refere-se ao elemento ao qual o ouvinte é adicionado, não ao próprio evento (que seria o parâmetroe
). Portantothis === e.currentTarget
. leia developer.mozilla.org/en-US/docs/Web/API/EventTarget/…se você estiver dentro da função real, pode usar arguments.callee como referência para a função. como em:
EDITAR: Isso não funcionará se você estiver trabalhando no modo estrito (
"use strict";
)fonte
button.addEventListener('click', function handler() { this.removeEventListener('click', handler); });
Uma versão da solução de Otto Nascarella que funciona em modo estrito é:
fonte
Podem ser várias funções anônimas, tecla 1
Aviso: só funciona
Chrome Dev Tools
e não pode ser usado no código : linkfonte
getEventListeners
parece fazer parte das ferramentas Chrome Dev, então não pode ser usado para nada além de depuração.em navegadores modernos, você pode fazer o seguinte ...
https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/addEventListener#Parameters
fonte
Uma opção não tão anônima
Desde que recebi feedback de Andy ( certo, mas como acontece com muitos exemplos, eu gostaria de mostrar uma expansão contextual da ideia ), aqui está uma exposição menos complicada :
Isto permite uma estrutura de função efetivamente anônimo, evita o uso do praticamente obsoleto receptor e permite a remoção fácil.
Incidentalmente : a remoção do elemento de script imediatamente após definir o ouvinte é um truque engraçado para esconder o código que alguém preferiria que não fosse totalmente óbvio para olhos curiosos ( estragaria a surpresa ;-)
Portanto, o método ( mais simplesmente ) é:
fonte
Isso não é ideal, pois remove tudo, mas pode funcionar para suas necessidades:
Node.cloneNode ()
fonte
JavaScript : o método addEventListener registra o ouvinte especificado no EventTarget (Element | document | Window) em que é chamado.
EventTarget. addEventListener ( event_type , handler_function , Bubbling | Capturing );
Eventos de mouse, teclado Exemplo de teste no WebConsole:
O método removeEventListener remove o ouvinte de evento registrado anteriormente com EventTarget.addEventListener ().
eu posso usar
fonte
Para fornecer uma abordagem mais atualizada para isso:
fonte
Encontrei o mesmo problema e esta foi a melhor solução que consegui:
Lembre-se de que testei isso apenas para o
window
elemento e para o'mousemove'
evento, portanto, pode haver alguns problemas com essa abordagem.fonte
Possivelmente não é a melhor solução em termos do que você está pedindo. Ainda não determinei um método eficiente para remover a função anônima declarada em linha com a invocação do ouvinte de evento.
Eu pessoalmente uso uma variável para armazenar
<target>
e declarar a função fora da invocação do ouvinte de evento, por exemplo:const target = document.querySelector('<identifier>');
function myFunc(event) {
function code;
}
target.addEventListener('click', myFunc);
Em seguida, para remover o ouvinte:
target.removeEventListener('click', myFunc);
Não é a recomendação principal que você receberá, mas para remover funções anônimas, a única solução que achei útil é remover e substituir o elemento HTML. Tenho certeza de que deve haver um método JS vanilla melhor, mas ainda não o vi.
fonte
Sei que esse é um tópico bastante antigo, mas achei melhor colocar meus dois centavos para aqueles que o acharem útil.
O script (desculpas pelos nomes dos métodos não criativos):
E você pode usá-lo assim:
fonte
fonte
addEventListener
.