Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2008/2.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 JQuery事件在绑定到的内容被销毁后是否会自动解除绑定?_Javascript_Jquery_Javascript Events - Fatal编程技术网

Javascript JQuery事件在绑定到的内容被销毁后是否会自动解除绑定?

Javascript JQuery事件在绑定到的内容被销毁后是否会自动解除绑定?,javascript,jquery,javascript-events,Javascript,Jquery,Javascript Events,如果我在一个对象的两个函数中有以下代码: add: function() { // create trip. var trip = new Trip(); // add the trip using its id. this.trips[trip.id] = trip; }, remove: function(tripId) { // remove trip. delete this.trips[tripId]; } 注意:Trip对象的构造

如果我在一个对象的两个函数中有以下代码:

add: function()
{
    // create trip.
    var trip = new Trip();

    // add the trip using its id.
    this.trips[trip.id] = trip;
},

remove: function(tripId)
{
    // remove trip.
    delete this.trips[tripId];
}
注意:Trip对象的构造函数将一组自定义JQuery事件处理程序绑定到它自己

当Trip对象被删除时,绑定到Trip对象的事件处理程序是否会自动销毁/清理

如果dom节点被删除并绑定了事件处理程序,是否会发生同样的情况


此外,我还了解到,在所有对对象的引用都不存在之前,垃圾收集器不会清理对象,因此绑定到对象本身的事件处理程序是否算作引用并防止对象被清理,即使我不再引用它?

据我所知,您只能将事件处理程序绑定到节点,或者,在特殊情况下,对于DOM节点的窗口、文档等,事件处理程序将被删除。即使没有,它们也不会被触发。删除该对象将删除与其关联的事件处理程序。事件处理程序不应阻止对象被垃圾收集

对于dom节点,如果 它已被删除并具有事件处理程序 一定要吗

使用上述代码并在FireFox中使用FireQuery进行测试删除dom节点不会解除处理程序与事件的绑定

在删除dom节点之前,似乎必须显式解除绑定处理程序,如下所示:

$(this.testDomNode).unbind('click', this.handlerClick);

this.testDomNode.parentNode.removeChild(this.testDomNode);

不会删除该事件,因为jQuery维护所有绑定事件处理程序的中央存储库,并且知道是否或何时使用
delete
删除关联对象。试试这个小测试来确认。(仅限jQuery 1.4.2)

:

但是,对象删除不受影响,将按预期删除。然而,这是一种“墙上有洞”的情况,因为jQuery缓存中的某个地方有关联的数据将保留在那里

看起来,虽然可以将事件绑定到普通JavaScript对象,但无法解除绑定。在解除绑定时,jQuery似乎假定对象是DOM节点,并抛出以下错误:

Uncaught TypeError: Object #<an Object> has no method 'removeEventListener'

作为一种解决方法,在清理Trip对象时,可以显式调用
removeData
来执行此项工作

$(object).removeData();

正如我已经提到的,jQuery的内部结构已经深入到膝盖,因此您可能需要寻找一种替代解决方案,或者小心库升级可能会轻易破坏您的代码,这是不太可能的。

您是否可以粘贴构造函数中自定义事件附加到Trip对象的部分?这就是解决办法。这将删除对象的jQuery数据缓存(包括事件句柄)中存储的所有数据。谢谢,我将在早上测试并批准答案(如果可行)。关于JQuery维护事件的中央存储库,您所说的与我有关,因为这意味着对象可能也不会被删除。关于删除对象,请参见以下内容:如果任何引用仍然指向某个对象,垃圾收集器似乎不会清理它,因此如果JQuery正在存储有关事件及其绑定的信息,它可能引用对象和块集合?鉴于上述情况,我认为internalIndex也可能是块集合,因为它引用对象的属性?通过firebug手动检查$.cache可能更安全。@Gavin-据我所知,在这种情况下,jQuery不直接引用对象,但我可能错了。除非绑定的事件处理程序引用回对象,否则它应该被删除并进行gc处理,不会出现问题。否则,您必须同时删除这两个(事件处理程序、对象)才能对其进行垃圾收集。此外,在上述情况下,
internalIndex
不会干扰任何内容,因为它只保存一个整数值
o[prop]
▾ Object
  ▾ myEvent: Array (1)
    ▾ 0: Object
      ▸ handler: function () { alert("here"); }
        namespace: ""
        type: "myEvent"
      length: 1
Uncaught TypeError: Object #<an Object> has no method 'removeEventListener'
$(object).remove()
$(object).unbind(..)
$(object).removeData();