2017-05-10 43 views
0

在一个简单的游戏应用中,我试图通过匿名事件回调函数的一些参数。我只能使用匿名函数来完成它,因为它适合上下文(它的范围标识参数)。问题是游戏有重新启动的选项。重新启动后,它将添加到相同节点的新事件监听器,在这里您可能会猜到旧的事件监听器仍然存在,这会导致不正确的功能和应用程序重载。我能想到的解决方案是在添加新事件之前通过删除旧的eventListeners来“刷新”。但我无法找到任何方式考虑事件回调函数是匿名的!在使用内联匿名函数时删除事件监听器

那么,有什么可能的替代解决方案?

var adder = function(colorBox, num){ 
    colorBox.addEventListener('click', function(){ 
     eventCall(this, num); 
    }); 
} 

var eventCall = function(t, num){ 
     var clickedBox = t.style.backgroundColor; 
.... 
+0

看看这个解决方法,从彩盒删除事件监听器 - http://stackoverflow.com/questions/19469881/remove-all-特定类型的事件侦听器 – vabii

+0

我尝试过..,我猜测它有一些缺点..,这使得它根本没有帮助。 –

回答

2

您可以将该功能存储在某处,以便以后在删除时参考。使用数组 ,可以存储多个事件处理程序,没有他们通过多次打电话给加法器功能被覆盖,然后有一个功能,消除所有的人等等,类似的:

function eventCall(t, num) { 
    var clickedBox = t.style.backgroundColor; 
} 

var fns = []; 

function adder(colorBox, num) { 
    function fn() { 
    eventCall(this, num); 
    } 

    colorBox.addEventListener('click', fn); 

    fns.push(fn); 
} 

function remover(colorBox) { 
    fns.forEach(function(fn) { 
    colorBox.removeEventListener('click', fn); 
    }); 
} 
+0

谢谢你帮助我。 –

0

您可以通过使用off功能(http://api.jquery.com/off/)删除通过jQuery的事件处理程序。例如

$("p").off(); 

删除所有段落中的所有事件处理程序。所以如果你把所有的dom元素用一个特定的类来分类的话,它仍然是可能的。

0

您可以删除所有事件通过使用outerHTML属性来监视元素上的侦听器。

colorBox.outerHTML = colorBox.outerHTML; 

设置outerHTML属性本身将消除任何附加事件监听器,让你重新开始与您要附加任何新的听众。

这种方法的详细信息可以在这里找到:

https://stackoverflow.com/a/32809957/5463636