我试图弄清楚如何执行一些js代码时,一个元素从页面删除:

jQuery('#some-element').remove(); // remove some element from the page
/* need to figure out how to independently detect the above happened */

有没有专门的活动,比如:

jQuery('#some-element').onremoval( function() {
    // do post-mortem stuff here
});

当前回答

jQuery的“remove”事件工作正常,没有添加。它可能是更可靠的使用一个简单的技巧,而不是补丁jQuery。

只需在要从DOM中删除的元素中修改或添加一个属性。因此,您可以使用属性“do_not_count_it”触发任何更新函数,该函数将忽略正在被销毁的元素。

假设我们有一个表格,单元格对应的价格,你只需要显示最后的价格: 这是在价格单元格被删除时触发的选择器(我们在表格的每一行中都有一个按钮,这里没有显示)

$('td[validity="count_it"]').on("remove", function () {
    $(this).attr("validity","do_not_count_it");
    update_prices();
});

这里有一个函数查找表中最后一个价格,不考虑最后一个价格,如果它是被删除的价格。实际上,当"remove"事件被触发,并且当这个函数被调用时,元素还没有被删除。

function update_prices(){
      var mytable=$("#pricestable");
      var lastpricecell = mytable.find('td[validity="count_it"]').last();
}

最后,update_prices()函数正常工作,然后,DOM元素被删除。

其他回答

只需要jQuery(不需要jQuery UI)

(我已经从jQuery UI框架中提取了这个扩展)

适用于:empty()和html()和remove()

$.cleanData = ( function( orig ) {
    return function( elems ) {
        var events, elem, i;
        for ( i = 0; ( elem = elems[ i ] ) != null; i++ ) {
            try {

                // Only trigger remove when necessary to save time
                events = $._data( elem, "events" );
                if ( events && events.remove ) {
                    $( elem ).triggerHandler( "remove" );
                }

            // Http://bugs.jquery.com/ticket/8235
            } catch ( e ) {}
        }
        orig( elems );
    };
} )( $.cleanData );

使用此解决方案,还可以解除事件处理程序的绑定。

$("YourElemSelector").off("remove");

试一试!——示例

$.cleanData = (function(orig) { return function(elems) { var events, elem, i; for (i = 0; (elem = elems[i]) != null; i++) { try { // Only trigger remove when necessary to save time events = $._data(elem, "events"); if (events && events.remove) { $(elem).triggerHandler("remove"); } // Http://bugs.jquery.com/ticket/8235 } catch (e) {} } orig(elems); }; })($.cleanData); $("#DivToBeRemoved").on("remove", function() { console.log("div was removed event fired"); }); $("p").on("remove", function() { console.log("p was removed event fired"); }); $("span").on("remove", function() { console.log("span was removed event fired"); }); // $("span").off("remove"); $("#DivToBeRemoved").on("click", function() { console.log("Div was clicked"); }); function RemoveDiv() { // $("#DivToBeRemoved").parent().html(""); $("#DivToBeRemoved").remove(); } <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> <h3>OnRemove event handler attached to elements `div`, `p` and `span`.</h3> <div class="container"> <br> <button onclick="RemoveDiv();">Click here to remove div below</button> <div id="DivToBeRemoved"> DIV TO BE REMOVED contains 1 p element which in turn contains a span element <p>i am p (within div) <br><br><span>i am span (within div)</span></p> </div> </div>

附加演示- jsBin

对于那些使用jQuery UI的人:

jQuery UI已经覆盖了一些jQuery方法来实现remove事件,该事件不仅在你显式删除给定元素时被处理,而且在元素被任何自清理jQuery方法(例如replace, html等)从DOM中删除时也会被处理。这基本上允许您在jQuery“清理”与DOM元素相关的事件和数据时,将钩子放入相同的事件中。

John Resig表示,他愿意在未来版本的jQuery核心中实现这个事件,但我不确定它目前的位置。

挂钩.remove()并不是最好的处理方法,因为有很多方法可以从页面中删除元素(例如,通过使用.html(), .replace()等)。

为了防止各种内存泄漏危险,jQuery将在内部尝试为每个被删除的元素调用jQuery. cleandata()函数,而不管使用什么方法来删除它。

查看这个答案了解更多细节:javascript内存泄漏

所以,为了得到最好的结果,你应该钩子cleanData函数,这正是jquery.event.destroyed插件所做的:

http://v3.javascriptmvc.com/jquery/dist/jquery.event.destroyed.js

我不确定是否有此事件句柄,因此您必须保留DOM的副本,并在某种轮询循环中与现有DOM进行比较——这可能相当麻烦。Firebug可以做到这一点——如果您检查HTML并运行一些dom更改,它会在Firebug控制台中以黄色高亮显示更改。

或者,你可以创建一个删除函数…

var removeElements = function(selector) {
    var elems = jQuery(selector);

    // Your code to notify the removal of the element here...
    alert(elems.length + " elements removed");

    jQuery(selector).remove();
};

// Sample usage
removeElements("#some-element");
removeElements("p");
removeElements(".myclass");

我喜欢mtkopone使用jQuery特殊事件的答案,但请注意,它不能工作a)当元素被分离而不是删除或b)当一些旧的非jQuery库使用innerHTML破坏你的元素