Javascript Can';无法删除事件侦听器
有人能告诉我为什么Javascript Can';无法删除事件侦听器,javascript,javascript-events,event-handling,Javascript,Javascript Events,Event Handling,有人能告诉我为什么bt2事件侦听器在if块中没有被删除吗。当我在p函数中删除事件侦听器时,它被删除时没有任何错误或bug。我很确定,由于没有删除事件侦听器,可能会出现任何堆栈或范围问题,但我不知道这可能是什么。我知道事件监听器并没有被删除,因为在随后单击bt2元素时,前面的所有事件监听器都再次运行,因为同一个函数运行了多次。请告诉我有什么问题 以下是完整的代码: (function() { if(window.addEventListener) window.ad
bt2
事件侦听器在if
块中没有被删除吗。当我在p
函数中删除事件侦听器时,它被删除时没有任何错误或bug。我很确定,由于没有删除事件侦听器,可能会出现任何堆栈或范围问题,但我不知道这可能是什么。我知道事件监听器并没有被删除,因为在随后单击bt2
元素时,前面的所有事件监听器都再次运行,因为同一个函数运行了多次。请告诉我有什么问题
以下是完整的代码:
(function()
{
if(window.addEventListener) window.addEventListener('load',init,false);
function init()
{ var i=0;
var get=document.getElementById('bt1').addEventListener('click',function() { pro(0);},false);
function pro(x)
{ alert('yeah');
if(!x) x=0
if(x!=0) //I dont want to remove event listener in the first time , so i want it to function with the next call to pro,in which the value of x is bigger than 0
{
//alert('right');
document.getElementById('bt2').removeEventListener('click',p,false); //event listener is not getting removed .
}
document.getElementById('bt2').innerHTML='this is a button '+x;
function passTo(y)
{
pro(y);
}
document.getElementById('bt2').addEventListener('click',p,false);
function p()
{ //document.getElementById('bt2').removeEventListener('click',p,false); //here the event listener is getting removed easily
passTo(x+1);
}
}
}
}());
removeEventListener
要求您向其传递相同的函数,但您的p
函数不同:每次调用pro
时都会创建一个新函数。因此,您试图删除的不是您添加的,因此它不会被删除
在p
中删除它是有效的,因为在每个p
函数中,标识符p
指的是特定的p
函数。因此,如果添加了一个,它将成功地删除自身
您可以通过在函数上添加唯一标识符来证明这一点(请参见注释):
(函数(){
if(window.addEventListener)window.addEventListener('load',init,false);
var functionId=0;//提供给我们唯一ID的东西
函数init(){
var i=0;
var get=document.getElementById('bt1')。addEventListener('click',function(){
pro(0);
},假);
函数pro(x){
log('yes');
//我们总是要进入这个身体的如果,状态
//这只是强调一下
如果(!p.id){
p、 id=++functionId;
}
如果(!x)x=0
如果(x!=0)
{
log(“删除#”+p.id);//有没有办法把你的snippet.js
?@JonatasWalker:在github上,所以是的。我只希望SE能够着手修复堆栈片段。我从来没有想过它们不是同一个函数,所以引用会不同,现在我将p函数设为全局函数,代码工作得很好,谢谢,你的建议奏效了!!我为此震惊了好几天@T.J.Crowder!!