使用JQuery,当DOM元素调用.remove()时,是否可以运行函数?
正如问题所述,我正在尝试做的是从DOM中删除DOM元素时调用的函数,就像析构函数一样。
我查看卸载,但从我的理解,只有当浏览器导航离开页面时才会调用。
提前致谢!
我不知道你正在寻找的是什么。 不是很漂亮的代码,只是为了展示我想要使用的东西:
// Just for this script's sake, you'll want to do it differently var body = $("body"); var element = $('#loadingBlock'); // Bind the "destructor" firing event body.bind("elementDeleted", function (element) { // your "destructor" code }); // Trigger the event, delete element, can be placed in a function, overloaded, etc. body.trigger("elementDeleted", element); element.remove();
当然有基于直接观看DOM的解决方案,但问题是浏览器兼容性。 您应该查看突变事件 。
可以使用特殊事件来构建删除跟踪。 我创建了一个允许绑定到已removed
事件的示例 。 请注意,此方法仅在jQuery启动删除时才有效(例如,调用$(…).remove()
)。 对于更通用的解决方案,请使用DOMNodeRemoved
但这在IE中不起作用。
要启用对元素的跟踪,请调用$(…).trackRemoval()
,当您删除它或其中一个父元素时,该元素将触发已removed
事件。
// Create a scope so that our variables are not global (function(){ /** * True while unbinding removal tracking */ var isUntracking = false; /** * A reference that is only known here that nobody else can play with our special event. */ var dummy = function(){}; /** * Special event to track removals. This could have any name but is invoked during jQuery's cleanup on removal to detach event handlers. */ jQuery.event.special.elementRemoved = { remove: function(o){ if(o.handler===dummy && !isUntracking){ $(this).trigger('removed'); } } }; /** * Starts removal tracking on an element */ jQuery.fn.trackRemoval = function(){ this.bind('elementRemoved', dummy); }; /** * Stops removal tracking on an element */ jQuery.fn.untrackRemoval = function(){ isUntracking = true; this.unbind('elementRemoved', dummy); isUntracking = false; }; })();
jsFiddle包含使用示例代码。
试试这个:
(function($) { var _remove = $.fn.remove; $.fn.remove = function() { this.trigger('remove'); // notify removal return _remove.apply(this, arguments); // call original }; })(jQuery);
用法:
$(element).bind('remove', callback); ... // some time later $(element).remove();
请参阅http://jsfiddle.net/alnitak/25Pnn/上的工作示例
您可以随时重载Remove函数(所有javascript对象都可以在运行时动态更改)并将其替换为您自己的函数,该函数会触发您可以用来响应删除的事件。