如果你看看:
http://www.w3.org/TR/DOM-Level-2-Events/events.html#Events-MutationEvent
它指出,关于 DOMSubtreeModified,“它可能会在对文档进行一次修改后触发,或者根据实现的判断,在发生多次更改后触发。”
因此,如果您使用不同的 MutationEvent,例如 DOMNodeInserted,您可能会获得更具确定性的事件触发(在特定情况下,您只需向节点添加一个元素)。
见下文:
$('body').prepend( $('<div id="cow">Hello</div>') );
$('#cow').bind("DOMNodeInserted",function(){ alert('hi'); } );
$('#cow').prepend( $("<div></div>") );
顺便说一句,这是在 Chrome 中测试的。
希望有帮助...
更新:或者,您可以在一个函数调用中添加多个事件类型。例如,为 DOMNodeInserted、DOMNodeRemoved、DOMAttrModified、DOMCharacterDataModified 添加四个事件处理程序,然后所有处理程序调用一个处理程序。
更新:我写了一个小脚本来完成我在之前的更新中写的:
$('body').prepend( $('<div id="cow">Hello</div>') );
/**
* This function registers event handlers which invoke the mutateHandler
* handler when any of the MutationEvents are fired on a node: DOMNodeInserted,
* DOMNodeRemoved, DOMAttrModified, DOMCharacterDataModified.
*
*/
var onMutate = function( mutateHandler ){
var that = this;
$(this).bind( "DOMNodeInserted", function( event ){
mutateHandler.call( that, event );
});
$(this).bind( "DOMNodeRemoved", function( event ){
mutateHandler.call( that, event );
});
$(this).bind( "DOMAttrModified", function( event ){
mutateHandler.call( that, event );
});
$(this).bind( "DOMCharacterDataModified", function( event ){
mutateHandler.call( that, event );
});
};
onMutate.call( $('#cow')[0], function(){
alert( $(this).attr('id') );
});
$('#cow').prepend( $("<div></div>") );
$('#cow').addClass( 'my_class' );