首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Javascript domready?

Javascript domready?
EN

Stack Overflow用户
提问于 2009-07-30 14:25:04
回答 9查看 100.6K关注 0票数 51

我知道我可以使用不同的框架,如prototype或jQuery来将函数附加到window.onload,但这不是我想要的。

我需要像.readyState这样的东西,这样我才能做这样的事情:

代码语言:javascript
运行
复制
if(document.isReady){
  var id = document.getElem ...
}

除了使用框架所做的事情之外,还有其他方法吗?

EN

回答 9

Stack Overflow用户

回答已采纳

发布于 2013-08-13 01:54:53

我已经更新了 DOMAssistant library的代码,它在我身上运行得很好

代码语言:javascript
运行
复制
var domReady = (function (){
  var arrDomReadyCallBacks = [] ;
  function excuteDomReadyCallBacks(){
       for (var i=0; i < arrDomReadyCallBacks.length; i++) {
         arrDomReadyCallBacks[i]();
       }
       arrDomReadyCallBacks = [] ;
  }

  return function (callback){
    arrDomReadyCallBacks.push(callback);
     /* Mozilla, Chrome, Opera */
      if (document.addEventListener ) {
          document.addEventListener('DOMContentLoaded', excuteDomReadyCallBacks, false);
      }
    /* Safari, iCab, Konqueror */
    if (/KHTML|WebKit|iCab/i.test(navigator.userAgent)) {
        browserTypeSet = true ;
        var DOMLoadTimer = setInterval(function () {
            if (/loaded|complete/i.test(document.readyState)) {
                //callback();
                excuteDomReadyCallBacks();
                clearInterval(DOMLoadTimer);
            }
        }, 10);
    }
    /* Other web browsers */

    window.onload = excuteDomReadyCallBacks;
}
})()
票数 10
EN

Stack Overflow用户

发布于 2011-06-14 00:56:15

编辑:随着2018年的到来,我认为可以安全地倾听DOMContentLoaded事件。

代码语言:javascript
运行
复制
function fireOnReady() { /* ... */ }
if (document.readyState === 'complete') {
    fireOnReady();
} else {
    document.addEventListener("DOMContentLoaded", fireOnReady);
}

请注意,该事件只会在页面加载时触发一次!如果你必须支持非常老的浏览器,那么看看我在下面放在一起的超轻量级脚本。

仅供历史参考的

jQuery有一个名为isReady的未记录属性,该属性在内部用于确定DOM就绪事件是否已触发:

代码语言:javascript
运行
复制
if($.isReady) {
    // DOM is ready
} else {
    // DOM is not yet ready
}

我从1.5.2开始,一直追溯到1.3.2,属性就在那里。虽然没有文档记录,但我想说您可以在jQuery的未来版本中依赖此属性。编辑:和一年后的v1.7.2,他们仍然使用$.isReady -仍然没有文档,所以请自行承担使用风险。升级时要小心。

编辑: v1.9,他们仍然使用$.isReady -仍未记录

编辑: v2.0,尽管它的所有“主要”变化,仍然使用$.isReady -仍然没有文档

编辑: v3.x仍使用$.isReady -仍未记录

编辑:正如一些人所指出的,以上并没有真正回答这个问题。因此,我刚刚创建了一个受Dustin Diaz的even smaller DOM ready snippet启发的mini DOM ready snippet。Dustin创建了一种简洁的方法来检查文档readyState,如下所示:

代码语言:javascript
运行
复制
if( !/in/.test(document.readyState) ) {
    // document is ready
} else {
    // document is NOT ready
}

这样做的原因是因为浏览器有3种加载状态:“加载”、“交互”和“完成”(较早的WebKit也使用“已加载”,但您不必再担心这些)。您会注意到,“正在加载”和“交互”都包含文本"in"...因此,如果在document.readyState内部找到字符串"in“,那么我们知道我们还没有准备好。

票数 43
EN

Stack Overflow用户

发布于 2009-07-30 14:33:19

虽然我通常主张在没有必要的情况下避免使用框架,但我想说在这种情况下使用框架是完全可以的。下面是jQuery:

代码语言:javascript
运行
复制
$(function () {
    // do stuff after DOM has loaded
});

请注意,它与window.onload事件不同,因为onload在加载其他资源(图像等)后首先执行。我在示例中使用的代码将在DOM完成加载时执行,即当完整的HTML结构可用时(不一定当图像、CSS等可用时)。

如果你想要一个可检查的变量,你可以在ready-function中设置一个:

代码语言:javascript
运行
复制
var documentIsReady = false;
$(function () { documentIsReady = true; });

当然,如果您要做的只是检查是否支持DOM,那么您可以找到比jQuery更多的轻量级库。但是,在不同浏览器行为非常不同的情况下使用库(这就是这样的一种情况)。

使用DOMAssistant library中的一些代码,创建您自己的"DOM就绪“函数应该不会太难:

代码语言:javascript
运行
复制
var domLoaded = function (callback) {
    /* Internet Explorer */
    /*@cc_on
    @if (@_win32 || @_win64)
        document.write('<script id="ieScriptLoad" defer src="//:"><\/script>');
        document.getElementById('ieScriptLoad').onreadystatechange = function() {
            if (this.readyState == 'complete') {
                callback();
            }
        };
    @end @*/
    /* Mozilla, Chrome, Opera */
    if (document.addEventListener) {
        document.addEventListener('DOMContentLoaded', callback, false);
    }
    /* Safari, iCab, Konqueror */
    if (/KHTML|WebKit|iCab/i.test(navigator.userAgent)) {
        var DOMLoadTimer = setInterval(function () {
            if (/loaded|complete/i.test(document.readyState)) {
                callback();
                clearInterval(DOMLoadTimer);
            }
        }, 10);
    }
    /* Other web browsers */
    window.onload = callback;
};

未经过测试,但它应该可以工作。我从DOMAssistant简化了它,因为DOMAssistant允许多个回调,并有检查,以确保您不能添加相同的函数两次等等。

票数 32
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1206937

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档