Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/460.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_Garbage Collection - Fatal编程技术网

Javascript JQuery-在自我/垃圾收集上检测域删除

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作为此触发器,但无法正常工作,因为:

  • 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,而不是挂接不可靠的变异事件,并尝试使用DOM
remove
触发它们。让jQuery为您完成这项工作:看看
之间的区别
。分离
!errrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr???????????????这与为元素删除而触发回调无关?啊,您需要显式地触发
removeFromManager
函数,我以为您只关心
数据
垃圾。如果是这样的话,我建议公开一个
小部件。destroy
方法,该方法将小部件从DOM和该管理器中删除,而不是挂接不可靠的突变事件,并尝试使用DOM
remove
触发它们。谢谢,这会让它旋转。谢谢,这会让它旋转。
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 );
};