Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/375.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Can';无法删除事件侦听器_Javascript_Javascript Events_Event Handling - Fatal编程技术网

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!!