Javascript document.readyState模拟用于基于gecko的浏览器

Javascript document.readyState模拟用于基于gecko的浏览器,javascript,javascript-events,gecko,domready,Javascript,Javascript Events,Gecko,Domready,IE在document对象中具有属性readyState,指示当前状态,例如“加载”、“完成”等 有没有办法在基于Mozilla的浏览器中找到文档的当前加载状态? 我知道DOMContentLoaded事件,但它不适合我的情况,因为我的代码可以在触发该事件后执行 补充:不,我不能使用任何框架,也不要混淆XHR对象的.readyState属性。 它是一个bookmarklet,因此可以在任何加载阶段插入 后来又说:不管怎样,这对我来说似乎不是什么大问题。因为这个属性在firefox中不会严重破坏,

IE在document对象中具有属性readyState,指示当前状态,例如“加载”、“完成”等

有没有办法在基于Mozilla的浏览器中找到文档的当前加载状态? 我知道DOMContentLoaded事件,但它不适合我的情况,因为我的代码可以在触发该事件后执行

补充:不,我不能使用任何框架,也不要混淆XHR对象的.readyState属性。 它是一个bookmarklet,因此可以在任何加载阶段插入


后来又说:不管怎样,这对我来说似乎不是什么大问题。因为这个属性在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:我还没有在该链接中尝试该解决方案,但从外观上看,它解决了问题解决问题并深入研究。做得很好。