Javascript JQuery-在自我/垃圾收集上检测域删除
我为这个糟糕的标题道歉,但我不知道该怎么说。我有附加到元素的逻辑,并且希望在移除元素时调用类似析构函数的函数。我已尝试使用DOMNodeRemoved作为此触发器,但无法正常工作,因为:Javascript JQuery-在自我/垃圾收集上检测域删除,javascript,jquery,garbage-collection,Javascript,Jquery,Garbage Collection,我为这个糟糕的标题道歉,但我不知道该怎么说。我有附加到元素的逻辑,并且希望在移除元素时调用类似析构函数的函数。我已尝试使用DOMNodeRemoved作为此触发器,但无法正常工作,因为: DOMNodeRemoved仅为元素的父元素而不是元素本身激发 它似乎是以一种特殊的顺序发射的,所以有时我不能正确地处理事件 代码:(或) 上述代码应输出: // ADD TO SOME MANAGER widget // ADD TO SOME MANAGER widget2 // REMOVE FROM
- DOMNodeRemoved仅为元素的父元素而不是元素本身激发
- 它似乎是以一种特殊的顺序发射的,所以有时我不能正确地处理事件
// ADD TO SOME MANAGER widget
// ADD TO SOME MANAGER widget2
// REMOVE FROM SOME MANAGER widget2 (this should be here but isn't)
// REMOVE FROM SOME MANAGER widget
在jQuery中是否有某种用于将逻辑绑定到元素的标准?或者我必须做一些猴子补丁来覆盖“remove”方法(不是首选,因为有些元素可能不使用jquery的方法被删除)
编辑:我一点也不关心IE。jQuery UI对cleanData内部jQuery方法进行了内置更改,该方法触发了删除事件。如果您将其实现到代码中,就可以使用它来解决您的问题
var _cleanData = $.cleanData;
$.cleanData = function( elems ) {
for ( var i = 0, elem; (elem = elems[i]) != null; i++ ) {
try {
$( elem ).triggerHandler( "remove" );
// http://bugs.jquery.com/ticket/8235
} catch( e ) {}
}
_cleanData( elems );
};
现在,只要使用jQuery方法(如.empty()
、.remove()
或.html()
)删除元素,就可以使用remove事件
当然,如果包含jQuery UI,则根本不需要上述代码,只需绑定到移除事件即可。jQuery UI对cleanData内部jQuery方法进行了内置更改,该方法触发移除事件。如果您将其实现到代码中,就可以使用它来解决您的问题
var _cleanData = $.cleanData;
$.cleanData = function( elems ) {
for ( var i = 0, elem; (elem = elems[i]) != null; i++ ) {
try {
$( elem ).triggerHandler( "remove" );
// http://bugs.jquery.com/ticket/8235
} catch( e ) {}
}
_cleanData( elems );
};
现在,只要使用jQuery方法(如.empty()
、.remove()
或.html()
)删除元素,就可以使用remove事件
当然,如果包含jQuery UI,则根本不需要上述代码,只需绑定到remove事件即可。让jQuery为您完成这项工作:看看
.remove()
和.detach
之间的区别!errrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr???????????????这与为元素删除而触发回调无关?啊,您需要显式地触发removeFromManager
函数,我以为您只关心数据
垃圾。如果是这样,我建议公开一个Widget.destroy
方法,该方法可以从DOM和该管理器中删除Widget,而不是挂接不可靠的变异事件,并尝试使用DOMremove
触发它们。让jQuery为您完成这项工作:看看和之间的区别
和。分离!errrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr???????????????这与为元素删除而触发回调无关?啊,您需要显式地触发removeFromManager
函数,我以为您只关心数据
垃圾。如果是这样的话,我建议公开一个小部件。destroy
方法,该方法将小部件从DOM和该管理器中删除,而不是挂接不可靠的突变事件,并尝试使用DOMremove
触发它们。谢谢,这会让它旋转。谢谢,这会让它旋转。
var _cleanData = $.cleanData;
$.cleanData = function( elems ) {
for ( var i = 0, elem; (elem = elems[i]) != null; i++ ) {
try {
$( elem ).triggerHandler( "remove" );
// http://bugs.jquery.com/ticket/8235
} catch( e ) {}
}
_cleanData( elems );
};