我已使用此解决方案中的代码更新了您的jsFiddle。
(function($){
$.event.special.destroyed = {
remove: function(o) {
if (o.handler) {
o.handler()
}
}
}
})(jQuery)
$('#btn').on('mouseover', function() {
$('#tt').show();
}).on('mouseleave', function() {
$('#tt').hide();
}).on('click', function() {
$(this).remove();
}).on('destroyed', function() {
$('#tt').hide();
})
或者,您可以绑定到 DOMNodeRemoved 突变事件,但W3 规范指出,由于性能和跨浏览器支持问题,不推荐使用此事件类型。
$(document).bind('DOMNodeRemoved', function(e) {
if(e.target.id=='btn') {
$('#tt').hide();
}
});
在较新的浏览器(Chrome 18+、Firefox 14+)中,支持MutationObserver对象,该对象旨在替换突变事件。在您的情况下,它可以这样工作:
var target = document.querySelector('body');
var observer = new MutationObserver(function(mutations) {
mutations.forEach(function(mutation) {
if(mutation.removedNodes[0]!=undefined) {
if(mutation.removedNodes[0].id=='btn') {
$('#tt').hide();
}
}
});
});
var config = { attributes: true, childList: true, characterData: true };
observer.observe(target, config);
这是Code Review 上一个问题的链接,其中有人正在编写一个 DOM MutationObserver shim,当 MutationObserver 对象不可用时,它会依赖于突变事件。