javascript domready?
我知道我可以使用不同的框架,如原型或jQuery的附加函数的window.onload,但不是我在找什么。
我需要类似.readyState的东西,这样我可以做这样的事情:
if(document.isReady){ var id = document.getElem ... }
除了使用框架之外还有别的方法吗?
我已经更新了DOMAssistant库的代码,它可以正常工作
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; } })()
jQuery有一个名为isReady的未公开的属性,它在内部用于确定DOM ready事件是否已经触发:
if($.isReady) { // DOM is ready } else { // DOM is not yet ready }
我从1.5.2开始回到1.3.2,房产就在那里。 虽然没有logging,但我会说,你可以在未来的jQuery版本中依赖这个属性。
编辑:一年后 – v1.7.2,他们仍然使用$.isReady
– 仍然没有logging,所以请使用风险自负。 升级时要小心。
编辑: v1.9,他们仍然使用$.isReady
– 仍然没有logging
编辑: v2.0,所有的“重大”的变化,仍然使用$.isReady
– 仍然没有文件
编辑: v3.x仍然使用$.isReady
– 仍然没有logging
更新:正如几位人士指出的那样,上述并没有真正回答这个问题。 所以我刚刚创build了一个微型DOM就绪片段 ,它受到了Dustin Diaz 更小的DOM准备片段的启发。 Dustin创build了一个简洁的方式来检查文档readyState,其中包含以下内容:
if( !/in/.test(document.readyState) ) { // document is ready } else { // document is NOT ready }
这样做的原因是因为浏览器有3个加载状态:“加载”,“交互”和“完整” (旧的WebKit也使用“加载”,但你不必担心这一点) 。 你会注意到,“加载”和“交互”包含文本“in”…所以如果在document.readyState
findstring“in”,那么我们知道我们还没有准备好。 你也可以尝试这个,它读起来容易得多,但是不会太酷(而且在旧的WebKit中不起作用) :
if( document.readyState === "complete" ) { // document is ready } else { // document is NOT ready }
虽然我通常主张避免使用框架,除非有必要,我会说在这种情况下使用一个是完全正确的。 这里是jQuery:
$(function () { // do stuff after DOM has loaded });
请注意,它与window.onload
事件不同,因为onload
在其他资源加载后首先执行(图像等)。在我的示例中使用的代码将在DOM完成加载时执行,即当满HTML结构可用(不一定在图像,CSS等可用时)。
如果你想要一个可选的variables,你可以在ready函数中设置一个:
var documentIsReady = false; $(function () { documentIsReady = true; });
当然,如果你想做的只是检查DOM准备就绪,你可以find比jQuery更轻的库。 但是在不同的浏览器行为不同的情况下使用一个库(这是一个这样的情况)。
使用DOMAssistant库中的一些代码,使你自己的“DOM就绪”function不应该太难:
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; };
没有testing,但它应该工作。 我简化它从DOMAssistant,因为DOMAssistant允许多个callback,并已检查,以确保您不能添加相同的function两次等。
在这个问题已经过去的5年中,DOMContentLoaded已经成为一个普遍支持的事件,您可以使用它。
document.addEventListener('DOMContentLoaded', function() { //.. do stuff .. }, false);
看看这个演示从微软。 – > http://ie.microsoft.com/testdrive/HTML5/DOMContentLoaded/Default.html这里是允许您在DOM上运行JS准备的代码的要点;…
(function () { function load2(){ // put whatever you need to load on DOM ready in here document.getElementById("but3").addEventListener("click", doMore, false); } if (window.addEventListener) { window.addEventListener('DOMContentLoaded', load2, false); } else { window.attachEvent('onload', load2); } } ());
这里是一些演示的JavaScript源代码。http://ie.microsoft.com/testdrive/Includes/Script/ReturnAndShareControls.js
它运作良好。 尼斯!!在谷歌浏览器和IE 9。
document.addEventListener("DOMContentLoaded", function(e){ console.log("dom ready");//output to web browser console });
没有JQuery需要这个。 没有必要传递DOMContentLoaded上的第三个参数,因为此事件没有父级来遍历事件。 也没有必要得到所有其他人都在说什么幻想。 这将告诉你什么时候DOM完全加载并准备使用。 当我注意到DOM助手lib时,我放声大笑。 这个lib是绝对没用的。
DOMContentLoaded事件在文档被完全加载和parsing时触发,而不等待样式表,图像和子帧完成加载
addEventListener()
对于检查包括DOM就绪状态的任何事件都是一个很好的function。 当使用“DOMContentLoaded”时, addEventListener()
的第三个参数是不需要的,因为这个触发器没有父项来传递事件。 在我上面的例子中,你会注意到第二个参数是一个匿名函数。 您也可以将函数的名称传递给第二个参数。
document.addEventListener([(string)event trigger], [function],[(boolean)traverse DOM tree]);
使用JQuery的另一个好处是在更新JQuery时不会中断。
jQuery不使用window.onload
。
$(document).ready()
等待直到DOM已经加载并且可以被遍历(其余的内容可能会或可能不会被加载)。
如果你拉起jQuery的源代码并对乱七八糟的东西进行sorting,你会发现这个工作是通过bindReady()
方法完成的,该方法针对不同的浏览器有几个不同的实现,只有当所有这些实现失败的时候,用于窗口的加载事件。
这实际上是大多数人使用jQuery之类的框架的最大原因之一,因为解决scheme在浏览器中是不一致的。
尝试这个:
链接: onDomReady在GitHub或下面的来源:
if(document.ondomready == undefined) { document.ondomready = {}; document.ondomready = null; } else { document.ondomready=document.ondomready; } var oldonload=document.onload; var isLaunched = 0; document.onload = function() { if(oldonload !== null) { oldonload.call(); } }; document.addEventListener("DOMContentLoaded", function onDom(evt) { var olddomready = document.ondomready; if(olddomready !== null) { if(isLaunched == 0) { olddomready.call(evt); isLaunched == 1; //We now launched the mapped DOMContentLoaded Event } else { //We already launched DOMContentLoaded Event } } }, false);
我已经在Opera 11.x / 12.x上testing过了。 尚未在其他人身上testing。 让我知道如果他们这样做。
注意:我还没有上传存储库,但我很快就会在业余时间。
如果你想要更小的库只做特定的事情,你可以使用微库中的库 。 对于这个问题,可以使用DOMStatic libs ready方法。