Javascript 如何在JS/Mootools中实现OnDestroy/OnDispose事件?

Javascript 如何在JS/Mootools中实现OnDestroy/OnDispose事件?,javascript,events,mootools,Javascript,Events,Mootools,JavaScript中是否存在任何现有的OnDestroy/OnDispose事件,或者在普通JS或Mootools中是否存在任何已知的自定义实现?假设我想在元素被销毁/从DOM中删除时调用console.log('bye')。类似于此的东西虽然您可以这样做,但这样做并不实际 首先-destroy-事件用正在被销毁的元素的上下文填充火,在该点上,在事件cb期间,它将被删除,并可能被GCd 其次,IE6,7,8中的元素原型是只读的,元素通过$/document.id-本地添加方法,这意味着在DOM

JavaScript中是否存在任何现有的OnDestroy/OnDispose事件,或者在普通JS或Mootools中是否存在任何已知的自定义实现?假设我想在元素被销毁/从DOM中删除时调用console.log('bye')。类似于此的东西

虽然您可以这样做,但这样做并不实际

首先-
destroy
-事件用正在被销毁的元素的上下文填充火,在该点上,在事件cb期间,它将被删除,并可能被GCd

其次,IE6,7,8中的元素原型是只读的,元素通过
$
/
document.id
-本地添加方法,这意味着在DOM中访问任何内容之前需要加载修饰过的方法

第三,如果说,
el.parentNode.innerHTML='
,或者它们通过原始js/替代方法被删除,那么实际上不会触发。从这个意义上讲,它不是一个真正的观察者,它只捕获了两种方法


谢谢你的回答和提琴。第一点:这是否意味着事件可以在触发之前销毁?你是否介意进一步解释你的第二点?装饰的方法是什么?为什么/如何加载?所以。在普通浏览器中,您可以扩展
元素.prototype
。例如,
Element.prototype.foo='bar';var div=document.createElement('div');div.foo;//bar
-不在旧的IE中。因为mootools是原型,javascript也是原型,所以它使用了一个技巧——当在IE中接触一个元素时,它将扩展元素原型方法直接复制到元素对象上,然后允许您调用
el.foo
w/o从原型中解析属性,因为它将拥有自己的属性。至于修饰的方法,这是标准的重载-修改后的函数在旧func的基础上做一些事情,然后调用oldso来解释上面的内容,我们保存旧的ref,创建一个新的函数,做一些不同的事情,最后调用旧的原始方法-基本上是用额外的功能修饰原始方法。例如,
Function.prototype.bind
做类似的事情,接受旧函数,将其保存在包装函数中,并根据需要应用传递的范围来保留上下文。等等。对于第一点,事件将触发,但它将引用正在销毁的元素-取决于您使用它的目的-如果是异步的,则可能存在问题。此外,对el本身的引用可能会影响其他感兴趣的人的GCF:您可能希望为被销毁元素的所有子元素触发此事件。一个通过可观察的api(现代浏览器)进行操作的想法
(function(){
    // old methods
    var destroy = Element.prototype.destroy,
        dispose = Element.prototype.dispose;

    // redefine them and fire the events before calling old protos.
    [Element, Elements].invoke('implement', {
        destroy: function(){
            this.fireEvent('destroy');
            return destroy.apply(this, arguments);
        },
        dispose: function(){
            this.fireEvent('dispose');
            return dispose.apply(this, arguments);
        }
    });
}());


var foo = document.getElement('.foo');
foo.addEvents({
    dispose: function(){
        alert('we are not in the dom now');
    }
});

foo.dispose();