关闭后,jQuery事件仍保留在文档中

时间:2012-03-13 06:48:00

标签: javascript jquery bho

我正在创建一个BHO并在facebook页面中插入脚本。我的问题如下。有时我将一个脚本插入一个页面(比方说)并将一些事件绑定到一个事件持有者,即

 $('#contentArea').on('click','#myId',Dosomething); 

他们工作正常。

在此之后,我从此页面中删除脚本,然后再将它们添加回去(请不要问为什么,这是因为 facebook 并不总是为新页面生成新文档,而是它改变了文档的一部分),这次事件运行多次(取决于我删除然后添加它们的次数,因此1次删除和1次添加它们运行两次,2次删除和2次添加他们运行了3次等等。尽管脚本的第一行是

 $('#contentArea').off();

我在这里缺少什么,因为我知道处理程序不会从文档或节点中删除......也许这是一个事件冒泡问题? 顺便说一句,我在internet explorer 9工作。

4 个答案:

答案 0 :(得分:2)

我认为你至少应该这样做

 $('#contentArea').off("click");

或者可能不会删除事件监听器,甚至可能

$('#contentArea').on('click','#myId'); 

答案 1 :(得分:0)

如果要删除调用函数的委托处理程序,那么你应该删除绑定到该事件和元素的函数吗?

$('#contentArea').off('click','#myId',Dosomething); 

答案 2 :(得分:0)

根据API文档off()至少需要一个参数。

  

事件一个或多个以空格分隔的事件类型和可选命名空间,   或者只是名称空间,例如“click”,“keydown.myPlugin”或   “.myPlugin”。

尝试以这种方式解除所有click事件的绑定; $('#contentArea').off('click');

您也可以使用unbind()取消绑定所有事件。

  

在最简单的情况下,没有参数,.unbind()会删除所有参数   附加到元素的处理程序。

答案 3 :(得分:0)

更好的解决方案是为什么不首先检查元素以查看它是否有处理程序?怎么能完成这样的任务。很容易,我们在元素上留下痕迹,告诉我们是否已经安装了处理程序。毕竟元素是一个dom所以我们可以添加一个对象成员,或者我们可以添加一个属性

$(this).attr('myBHOInstalled','true');

然后

if( $(this).attr('myBHOInstalled') !== 'true' ) {
    installMyBHO($(this)); 

}