首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >jquery .remove()方法不触发.on('remove')事件

jquery .remove()方法不触发.on('remove')事件
EN

Stack Overflow用户
提问于 2013-08-23 19:01:26
回答 3查看 6.1K关注 0票数 4

我使用.remove()方法删除一个html元素,同时,对于这个元素,我有一个事件处理程序,但它不会被触发。为什么会这样?下面是jsFiddle和代码:

代码语言:javascript
复制
<span id='del_span'>Delete</span><br>
<span id='to_del'>I'm going to be deleted</span>

JS

代码语言:javascript
复制
$('#del_span').click(function() {
    $('#to_del').remove();
});
$('#to_del').on('remove', function() {
    alert("I'm being deleted"); //is never triggered
});
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-08-23 19:03:05

remove()方法不会自动触发remove事件(因为不存在这样的事件),但是可以使用自定义事件手动执行:

代码语言:javascript
复制
$('#del_span').click(function() {
    $('#to_del').trigger('remove').remove();
});
$('#to_del').on('remove', function() {
    alert("I'm being deleted"); //is never triggered
});

JS Fiddle演示

顺便说一句,在那些支持突变事件的浏览器中,您可以使用:

代码语言:javascript
复制
$('#del_span').click(function() {
    $('#to_del').remove();
});
$('body').on('DOMNodeRemoved', '#to_del', function() {
    alert("I, " + this.id + " am being deleted");
});

JS Fiddle演示

参考文献:

  • trigger()
票数 13
EN

Stack Overflow用户

发布于 2013-08-23 19:09:58

当您包含jQuery UI时,$.cleanData方法也会被重写以触发一个remove事件。您可以很容易地模仿这种行为:

代码语言:javascript
复制
// copied from jQuery UI Github, link below
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 );
};

https://github.com/jquery/jquery-ui/blob/master/ui/jquery.ui.widget.js#L16

$.cleanData.remove方法调用,以清理存储在元素上的任何数据和事件。注意,这还将导致在通过其他方法(如.empty() )删除元素时触发删除事件。

票数 4
EN

Stack Overflow用户

发布于 2013-08-23 19:10:25

为了加入戴维·托马斯回答,我制作了一个小插件来做你想做的事情。

将此代码添加到您的文件中。

代码语言:javascript
复制
//@Author Karl-André Gagnon
$.hook = function(){
    $.each(arguments, function(){
        var fn = this
        if(!$.fn['hooked'+fn]){
            $.fn['hooked'+fn] = $.fn[fn];
            $.fn[fn] = function(){
                $.fn['hooked'+fn](arguments);
                $(this).trigger(fn, arguments);
            }
        }
    })
}

然后,这个代码:

代码语言:javascript
复制
$.hook('remove')

这是在.remove()上添加一个事件侦听器。不对代码进行任何更改,它都会工作的。

一个很小的例子

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18410050

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档