A situação é um pouco parecida.
var someVar = some_other_function();
someObj.addEventListener("click", function(){
some_function(someVar);
}, false);
O problema é que o valor de someVar
não é visível dentro da função listener do addEventListener
, onde provavelmente está sendo tratado como uma nova variável.
javascript
dom
addeventlistener
Abhishek Yadav
fonte
fonte
Respostas:
Não há absolutamente nada de errado com o código que você escreveu. Ambos
some_function
esomeVar
devem estar acessíveis, caso estejam disponíveis no contexto em quefoi criado.
Verifique se o alerta fornece o valor que você estava procurando, verifique se ele estará acessível no escopo da função anônima (a menos que você tenha mais código que opera na mesma
someVar
variável ao lado da chamada paraaddEventListener
)fonte
bound function
usando o.bind()
método vai resolver a questão com loops developer.mozilla.org/en/docs/Web/JavaScript/Reference/...Por que não apenas obter os argumentos do atributo target do evento?
Exemplo:
JavaScript é uma linguagem orientada a protótipo, lembre-se!
fonte
evt.currentTarget.myParam
? Se houver outro elemento dentro de 'someInput',evt.target
pode ser que se refira ao elemento interno. ( jsfiddle.net/qp5zguay/1 )this
! O uso desse método no texto datilografado exige que o elemento sejaany
ou crie um subtipo.addEventListener
for paradocument
,evt.target.myParam
não funcionou para mim. Eu tive que usar em seuevt.currentTarget.myParam
lugar.Esta pergunta é antiga, mas pensei em oferecer uma alternativa usando o .bind () do ES5 - para a posteridade. :)
Lembre-se de que você precisa configurar sua função de ouvinte com o primeiro parâmetro como o argumento que você está passando para o bind (sua outra função) e o segundo parâmetro agora é o evento (em vez do primeiro, como teria sido) .
fonte
Function.prototype.bind()
você não pode remover o ouvinte de evento , melhor usar uma função currying vez (ver @ tomcek112 resposta)some_other_func
é uma variável, você pode passar o valor que desejarsome_func
.Você pode simplesmente ligar todos os argumentos necessários com 'bind':
Desta forma, você sempre terá a
event
,arg1
e outras coisas passadas paramyPrettyHandler
.http://passy.svbtle.com/partial-application-in-javascript-using-bind
fonte
.bind()
mas sem o nulo como primeiro parâmetro. o que não funcionou.null
, ele funciona bem com.bind(event, arg1)
, pelo menos com o VueJS.Questão antiga e antiga, mas tive o mesmo problema hoje. A solução mais limpa que encontrei é usar o conceito de curry.
O código para isso:
Ao nomear a função ao curry, é possível chamar Object.removeEventListener para cancelar o registro do eventListener em um momento de execução posterior.
fonte
Você pode adicionar e remover listener de eventos com argumentos declarando uma função como uma variável.
myaudio.addEventListener('ended',funcName=function(){newSrc(myaudio)},false);
newSrc
é o método com myaudio como parâmetrofuncName
é a variável do nome da funçãoVocê pode remover o ouvinte com
myaudio.removeEventListener('ended',func,false);
fonte
Você pode passar algum valor por valor (não por referência) por meio de um recurso javascript conhecido como encerramento :
Ou você pode escrever uma função de quebra automática comum, como
wrapEventCallback
:Aqui
wrapEventCallback(func,var1,var2)
está como:fonte
someVar
O valor deve ser acessível apenas nosome_function()
contexto, não no ouvinte. Se você deseja tê-lo no ouvinte, deve fazer algo como:e use em seu
newVar
lugar.A outra maneira é retornar o
someVar
valorsome_function()
para usá-lo ainda mais no listener (como uma nova var local):fonte
Aqui está outra maneira (esta funciona dentro de loops):
fonte
Function.prototype.bind () é a maneira de vincular uma função de destino a um escopo específico e, opcionalmente, definir o
this
objeto na função de destino.Ou para capturar parte do escopo lexical, por exemplo, em um loop:
Por fim, se o
this
parâmetro não for necessário na função de destino:fonte
Usar
E se você deseja passar qualquer valor personalizado para essa função anônima, a maneira mais fácil de fazer isso é
Funciona perfeitamente no meu projeto. Espero que isso ajude
fonte
for
loop.É assim que eu recebo o evento corretamente.
fonte
O envio de argumentos para a função de retorno de chamada de eventListener requer a criação de uma função isolada e a passagem de argumentos para essa função isolada.
Aqui está uma pequena função auxiliar que você pode usar. Com base no exemplo "olá mundo" acima.)
Uma coisa que também é necessária é manter uma referência à função para que possamos remover o ouvinte corretamente.
fonte
storeFunc
deve ser sua variável ref. Coloque a remoção do seu ouvinte em um useEffect como este e você está pronto para ir:useEffect(() => { return () => { window.removeEventListener('scroll', storeFunc, false); } }, [storeFunc])
Uma maneira é fazer isso com uma função externa :
Esse método de agrupar uma função anônima entre parênteses e chamá-la imediatamente é chamado de IIFE (Expressão de Função Imediatamente Invocada)
Você pode verificar um exemplo com dois parâmetros em http://codepen.io/froucher/pen/BoWwgz .
fonte
Se não me engano, chamar a função com
bind
cria uma nova função retornada pelobind
método Isso causará problemas mais tarde ou se você deseja remover o ouvinte de eventos, pois é basicamente como uma função anônima:Então, tenha isso em mente.
Se você estiver usando o ES6, poderá fazer o mesmo que o sugerido, mas um pouco mais limpo:
fonte
boa alternativa de uma linha
fonte
Tente também estes (IE8 + Chrome. Não sei por FF):
Espero que não haja erros de digitação :-)
fonte
Eu estava preso nisso enquanto o usava em um loop para encontrar elementos e adicionar listner a ele. Se você estiver usando em loop, isso funcionará perfeitamente
fonte
Em 2019, muitas alterações na API, a melhor resposta não funciona mais, sem correção de bug.
compartilhe algum código de trabalho.
Inspirado por todas as respostas acima.
fonte
Há uma variável especial dentro de todas as funções: argumentos . Você pode passar seus parâmetros como parâmetros anônimos e acessá-los (por ordem) através da variável de argumentos .
Exemplo:
fonte
fonte
A abordagem a seguir funcionou bem para mim. Modificado a partir daqui .
fonte
A resposta a seguir está correta, mas o código abaixo não está funcionando no IE8 se suponha que você compactou o arquivo js usando o yuicompressor. (De fato, ainda a maioria dos povos dos EUA usa o IE8)
Portanto, podemos corrigir o problema acima da seguinte maneira e ele funciona bem em todos os navegadores
Espero que seja útil para alguém que está compactando o arquivo js no ambiente de produção.
Boa sorte!!
fonte
O código a seguir funcionou bem para mim (firefox):
Resultado:
fonte
Você precisa:
fonte
Provavelmente não é o ideal, mas é simples o suficiente para aqueles que não são super experientes. Coloque a função que chama addEventListener em sua própria função. Dessa forma, quaisquer valores de função passados para ele mantêm seu próprio escopo e você pode iterar sobre essa função quantas vezes quiser.
Exemplo Eu trabalhei com a leitura de arquivos, pois precisava capturar e renderizar uma visualização da imagem e do nome do arquivo. Levei um tempo para evitar problemas assíncronos ao utilizar um tipo de upload de vários arquivos. Eu veria acidentalmente o mesmo 'nome' em todas as renderizações, apesar de enviar arquivos diferentes.
Originalmente, toda a função readFile () estava dentro da função readFiles (). Isso causou problemas de escopo assíncrono.
fonte
apenas gostaria de adicionar. se alguém estiver adicionando uma função que atualize caixas de seleção para um ouvinte de evento, você precisará usar em
event.target
vez dethis
atualizar as caixas de seleção.fonte
Eu tenho uma abordagem muito simplista. Isso pode funcionar para os outros, pois me ajudou. É ... Quando você está tendo vários elementos / variáveis atribuídos a uma mesma função e deseja passar a referência, a solução mais simples é ...
É isso aí. Funcionou para mim. Tão simples.
fonte
Outra alternativa, talvez não tão elegante quanto o uso de bind, mas é válida para eventos em um loop
Foi testado para extensões do google chrome e talvez o e.srcElement deva ser substituído pelo e.source em outros navegadores
Encontrei esta solução usando o comentário postado por Imatoria, mas não posso marcar como útil porque não tenho reputação suficiente: D
fonte
Esta solução pode ser boa para procurar
ou vincular valores válidos também será bom
fonte