Javascript document.readyState模拟用于基于gecko的浏览器
IE在document对象中具有属性readyState,指示当前状态,例如“加载”、“完成”等 有没有办法在基于Mozilla的浏览器中找到文档的当前加载状态? 我知道DOMContentLoaded事件,但它不适合我的情况,因为我的代码可以在触发该事件后执行 补充:不,我不能使用任何框架,也不要混淆XHR对象的.readyState属性。 它是一个bookmarklet,因此可以在任何加载阶段插入Javascript document.readyState模拟用于基于gecko的浏览器,javascript,javascript-events,gecko,domready,Javascript,Javascript Events,Gecko,Domready,IE在document对象中具有属性readyState,指示当前状态,例如“加载”、“完成”等 有没有办法在基于Mozilla的浏览器中找到文档的当前加载状态? 我知道DOMContentLoaded事件,但它不适合我的情况,因为我的代码可以在触发该事件后执行 补充:不,我不能使用任何框架,也不要混淆XHR对象的.readyState属性。 它是一个bookmarklet,因此可以在任何加载阶段插入 后来又说:不管怎样,这对我来说似乎不是什么大问题。因为这个属性在firefox中不会严重破坏,
后来又说:不管怎样,这对我来说似乎不是什么大问题。因为这个属性在firefox中不会严重破坏,当你在未完成的DOM()上操作时。可以执行吗?只需通知DOM事件并存储其状态即可。我不明白你的根本问题是什么。当然,你可以挖掘这种方法的精髓,并根据你的情况加以调整 jQuery的做法:
// Mozilla, Opera and webkit nightlies currently support this event
if ( document.addEventListener ) {
// Use the handy event callback
document.addEventListener( "DOMContentLoaded", function(){
//do stuff
}, false );
// If IE event model is used
} else if ( document.attachEvent ) {
// ensure firing before onload,
// maybe late but safe also for iframes
document.attachEvent("onreadystatechange", function(){
if ( document.readyState === "complete" ) {
document.detachEvent( "onreadystatechange", arguments.callee );
jQuery.ready();
}
});
// If IE and not an iframe
// continually check to see if the document is ready
if ( document.documentElement.doScroll && window == window.top ) (function(){
if ( jQuery.isReady ) return;
try {
// If IE is used, use the trick by Diego Perini
// http://javascript.nwbox.com/IEContentLoaded/
document.documentElement.doScroll("left");
} catch( error ) {
setTimeout( arguments.callee, 0 );
return;
}
// and execute any waiting functions
jQuery.ready();
})();
}
// A fallback to window.onload, that will always work
jQuery.event.add( window, "load", jQuery.ready );
不,不可能。很抱歉但这是你能做的。如果你不能在行动前测试你想去那里的东西:
window.setTimeout(function () {
// do your stuff here
}, 0);
(这肯定会在页面呈现后执行,但可能是在onload之后,而不是在domcontentload之后。)
如果您确实知道如何测试您正在寻找的内容:
(function () {
if (/* test if what you're looking for is there */) {
// do your stuff
} else {
window.setTimeout(arguments.callee, 0);
}
})();
这将立即执行,除非您要查找的内容不存在,在这种情况下,它将等到onload事件之后
编辑:
它所做的是,在边缘情况下,检查document.getElementsByTagName(“*”)的最后一个元素是否未定义。即使在Opera中,这似乎也适用于他。如果在非IE浏览器中加载文档(例如bookmarklet、dynamic inclusion等)后包含了文档,则此代码无法检测文档是否已加载。我相信这就是OP所问的问题。下面是一份bug报告,解释了我所说的:8个月来,它什么也没发生过(在无法使用jQuery或类似工具加载的动态内容结束时,为什么不直接抛出回调?这很草率,但也可以工作。好吧,这是一个BookMakerlet,因此不可能使用回调方法。这将在DOM在Opera中准备好之前运行函数,在IE中可能会出错,很明显,这并不完美,但可能是best选项,特别是在测试版本可以实现的情况下。IE是一个没有实际意义的点,因为您可以检查就绪状态。我可以接受Opera中可能出现的过早运行是唯一显著的缺点。@Anthony:我发现棘手的是Opera也支持readyState,但它与IE的实现不一致。例如,如果
readyState==“interactive”
,在IE中,这意味着您可以与DOM交互(但不是iFrame)但是在Opera中,DOM还没有准备好!我真的很想为所有浏览器找到一个解决方案。@crescentfresh:查看我在上面的帖子中找到并链接的解决方案。我还没有检查,但这个家伙似乎为Opera开发了很多东西。@Anthony:我还没有在该链接中尝试该解决方案,但从外观上看,它解决了问题解决问题并深入研究。做得很好。