DOMNodeInserted已知会使动态页面变慢,MDN甚至建议完全不使用它,但没有提供任何替代方案。
我对被插入的元素不感兴趣,我只需要知道某些脚本何时修改了DOM。是否有比突变事件监听器更好的替代方案(也许是在nsiTimer内部使用getElementsByTagName)?
DOMNodeInserted已知会使动态页面变慢,MDN甚至建议完全不使用它,但没有提供任何替代方案。
我对被插入的元素不感兴趣,我只需要知道某些脚本何时修改了DOM。是否有比突变事件监听器更好的替代方案(也许是在nsiTimer内部使用getElementsByTagName)?
@keyframes nodeInserted {
from {
outline-color: #fff;
}
to {
outline-color: #000;
}
}
div.some-control {
animation-duration: 0.01s;
animation-name: nodeInserted;
}
JavaScript:
document.addEventListener('animationstart', function(event){
if (event.animationName == 'nodeInserted'){
// Do something here
}
}, true);
这使得一些使用变动观察者几乎不可能实现的功能成为可能。
CSS:
@keyframes adjacentFocusSequence {
from {
outline-color: #fff;
}
to {
outline-color: #000;
}
}
.one + .two + .three:focus {
animation-duration: 0.01s;
animation-name: adjacentFocusSequence;
}
JavaScript:
document.addEventListener('animationstart', function(event){
if (event.animationName == 'adjacentFocusSequence'){
// Do something here when '.one + .two + .three' are
// adjacent siblings AND node '.three' is focused
}
}, true);
DOMNodeInserted
最好的选择。事实上,我已经使用它几个月了,效果非常好。 - OpenGGnaugtur简要提到的一个新选择是MutationObserver。它被设计成替代已弃用的mutation事件,如果你开发的浏览器(如开发浏览器扩展)支持它。
attributes
),以及更多内容(节点删除、文本节点更改)。 - BarneycustomElements
,但不要用于已创建的元素!customElements.define( 'insertion-triggerable', class extends HTMLElement {
connectedCallback() {
console.log( 'connected' )
}
disconnectedCallback() {
console.log( 'disconnected' )
}
adoptedCallback() {
console.log( 'adopted' )
}
} );
let element = document.createElement( 'insertion-triggerable' );
或者
customElements.define( 'insertion-triggerable', class extends HTMLDivElement {
// --||--
}, { extends: 'div' } );
let divElement = document.createElement( 'div', { is: 'insertion-triggerable' } );
基本上,我们将放弃使用DOMNodeInserted并使用End Request来加载我们的事件处理程序:
旧代码:
$(document).ready(function() {
$(document).bind('DOMNodeInserted', function(event){
My jQuery event handler...
});
});
===================================
新消息:
function Ajax_EndRequest {
function2();
}
function2 (a,b){
My jQuery event handler...
}
$(document).ready(function(){
add_endRequest(Ajax_EndRequest); //this is what actually invokes the function upon request end.
My jQuery event handler...//REMOVED -- don't need this now
});
var nodes=document.getElementsByTagName('*')||document.all;
function domchange(){
alert('Hello');
}
window.setInterval(function(){
var newnodes=document.getElementsByTagName('*')||document.all;
if(newnodes!=nodes){
nodes=newnodes;
domchange();
}
},1);
*
操作符本身就很昂贵。请不要再加上alert(...)
操作。还有那个1毫秒的轮询,天哪! - Matt W
object
还是整个DOM感兴趣? - Radu