jquery .remove()方法不会触发.on(’remove’)事件
我正在使用.remove()方法删除一个html元素,同时对于这个元素,我有一个事件处理程序,但它没有被触发。 为什么会这样? 这是jsFiddle和代码:HTML
Delete
I'm going to be deleted
JS
$('#del_span').click(function() { $('#to_del').remove(); }); $('#to_del').on('remove', function() { alert("I'm being deleted"); //is never triggered });
remove()
方法不会自动触发remove
事件(因为不存在此类事件),您可以使用自定义事件手动执行此操作:
$('#del_span').click(function() { $('#to_del').trigger('remove').remove(); }); $('#to_del').on('remove', function() { alert("I'm being deleted"); //is never triggered });
JS小提琴演示 。
顺便说一句,在那些支持突变事件的浏览器中,您可以使用:
$('#del_span').click(function() { $('#to_del').remove(); }); $('body').on('DOMNodeRemoved', '#to_del', function() { alert("I, " + this.id + " am being deleted"); });
JS小提琴演示 。
参考文献:
-
trigger()
。
当您包含jQuery UI时,将覆盖$.cleanData
方法以触发remove事件。 您可以非常轻松地以相同的方式模仿此行为:
// 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
方法调用,以.remove
存储在元素上的任何数据和事件。 注意,这也会导致在通过其他方式删除元素时触发remove事件,例如.empty()
为了增加大卫托马斯的答案 ,我做了一个litle插件来做你想要的。
在您的文件中添加此代码。
//@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); } } }) }
那么这段代码:
$.hook('remove')
这是在.remove()
上添加一个事件监听器。 不对代码进行任何更改,它将起作用。
一个很小的例子