我正在创建一个BHO并在facebook页面中插入脚本。我的问题如下。有时我将一个脚本插入一个页面(比方说)并将一些事件绑定到一个事件持有者,即
$('#contentArea').on('click','#myId',Dosomething);
他们工作正常。
在此之后,我从此页面中删除脚本,然后再将它们添加回去(请不要问为什么,这是因为 facebook 并不总是为新页面生成新文档,而是它改变了文档的一部分),这次事件运行多次(取决于我删除然后添加它们的次数,因此1次删除和1次添加它们运行两次,2次删除和2次添加他们运行了3次等等。尽管脚本的第一行是
$('#contentArea').off();
我在这里缺少什么,因为我知道处理程序不会从文档或节点中删除......也许这是一个事件冒泡问题?
顺便说一句,我在internet explorer 9
工作。
答案 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));
}