【问题标题】:document.readyState analog for gecko-based browsers基于 gecko 的浏览器的 document.readyState 模拟
【发布时间】:2009-10-06 16:01:26
【问题描述】:

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

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

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

稍后添加:无论如何,这对我来说似乎不是一个大问题。因为这个属性will be added in FF3.6,当你在未完成的DOM(unlike IE)上操作时,它不会在Firefox中严重破坏事情。

【问题讨论】:

  • 在你的动态
  • 嗯,这是一个 bookmakrlet,所以不可能有回调方法。

标签: javascript dom-events gecko domready


【解决方案1】:

不,这是不可能的。对不起。但这是你可以做的。如果你不能在行动之前测试你想要在那里的东西:

window.setTimeout(function () {
    // do your stuff here
}, 0);

(这肯定会在页面渲染后执行,但可能是在 onload 之后,而不是在 DOMContentLoaded 之后。)

如果您确实知道如何测试您正在寻找的内容:

(function () {
    if (/* test if what you're looking for is there */) {
        // do your stuff
    } else {
        window.setTimeout(arguments.callee, 0);
    }
})();

这将立即执行,除非您要查找的内容不存在,在这种情况下,它将等到 onload 事件之后。

编辑:

Check out this solution.

它所做的是,在边缘情况下,检查 document.getElementsByTagName("*") 的最后一个元素是否未定义。这似乎对他有用,即使在 Opera 中也是如此。

【讨论】:

  • 这将在 Opera 中准备好 DOM 之前运行该函数,并且可能会在 IE 中出错,如stackoverflow.com/questions/1381481/… 所示
  • 它并不完美,但它可能是最好的选择,特别是如果测试版本可以实现的话。 IE 尚无定论,因为您可以检查就绪状态。我可以忍受在 Opera 中可能过早运行是唯一的重大弱点。
  • @Anthony:我觉得棘手的是Opera也支持readyState,但与IE的实现不一致。例如,如果readyState == "interactive",在 IE 中这意味着您可以与 DOM 交互(但不是 iframe),但在 Opera 中,DOM 还没有准备好!我真的很想为所有浏览器找出一个解决方案。
  • @crescentfresh:查看我在上述帖子中找到并链接的解决方案。我还没有检查过,但是这家伙似乎为 Opera 开发了很多东西。
  • @Anthony:我还没有尝试过该链接中的解决方案,但从外观上看,它解决了问题并深入研究。伟大的工作。
【解决方案2】:

可以执行吗?只需通知 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 );

【讨论】:

  • 如果在文档加载后它本身被包含(例如书签、动态
  • 这是解释我所说内容的错误报告:dev.jquery.com/ticket/4196 8 个月以来没有任何事情发生。 :(
猜你喜欢
  • 1970-01-01
  • 2012-06-24
  • 2011-01-19
  • 2010-12-29
  • 2010-09-20
  • 1970-01-01
  • 2011-04-22
  • 1970-01-01
  • 2016-09-10
相关资源
最近更新 更多