我知道可以使用不同的框架,如prototype或jQuery来附加函数到window.onload
,但这不是我想要的。
我需要像.readyState
这样的东西,这样我就可以做出这样的事情:
if(document.isReady){
var id = document.getElem ...
}
除了使用框架提供的方法,还有其他方法吗?
我知道可以使用不同的框架,如prototype或jQuery来附加函数到window.onload
,但这不是我想要的。
我需要像.readyState
这样的东西,这样我就可以做出这样的事情:
if(document.isReady){
var id = document.getElem ...
}
除了使用框架提供的方法,还有其他方法吗?
编辑: 随着2018年的到来,我认为安全起见应该监听DOMContentLoaded
事件。
function fireOnReady() { /* ... */ }
if (document.readyState === 'complete') {
fireOnReady();
} else {
document.addEventListener("DOMContentLoaded", fireOnReady);
}
请注意,事件仅会在页面加载时触发一次!如果你需要支持非常老的浏览器,请查看下面我编写的超级轻量级脚本。
仅供历史参考:
jQuery有一个未记录的属性叫做isReady,它在内部用于确定DOM就绪事件是否已经触发:
if($.isReady) {
// DOM is ready
} else {
// DOM is not yet ready
}
我从1.5.2版本开始测试,一直回溯到1.3.2版本,该属性一直存在。虽然没有文档说明,但我认为您可以依赖此属性在未来版本的jQuery中使用。$.isReady
,仍未经过记录,请自行承担风险。升级时要小心。$.isReady
,仍未经过记录。$.isReady
,仍未经过记录。if( !/in/.test(document.readyState) ) {
// document is ready
} else {
// document is NOT ready
}
这个方法之所以有效,是因为浏览器有3种加载状态:“loading”,“interactive”和“complete”(旧的 WebKit 还使用了“loaded”,但现在您不必担心它)。你会注意到,“loading”和“interactive”都包含文本“in”...所以如果在document.readyState
中找到字符串“in”,那么我们就知道还没有准备好。自从这个问题被提出5年以来,DOMContentLoaded事件已成为一个普遍支持的事件,您可以直接使用它。
document.addEventListener('DOMContentLoaded', function() {
//.. do stuff ..
}, false);
虽然我通常主张避免使用框架,除非必要,但在这种情况下使用一个是完全可以的。这里是jQuery:
$(function () {
// do stuff after DOM has loaded
});
window.onload
事件不同,因为onload
在其他资源(如图像等)加载完毕后首先执行。我在示例中使用的代码将在DOM完成加载时执行,即在完整的HTML结构可用时(不一定是在图像、CSS等可用时)。如果您想要一个可检查的变量,可以在ready函数中设置一个。var documentIsReady = false;
$(function () { documentIsReady = true; });
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允许多个回调,并检查以确保您不能添加相同的函数等。
callback
最多两次(因为 window.onload
应该在所有浏览器中执行)。处理事件时,请检查是否已经调用了 callback
,如果已经调用,则返回(这就是 DOMAssistant 所做的,但我删除了那部分内容)。 - Blixtwindow.onload
的值而不考虑实际值可能会在其他脚本代码中产生意外行为。此外,我们不能调用两次 domLoaded
,因为只有最后一个会被使用。 - fguillenelse if
,否则Firefox会触发两次。 - jisaacstonevar 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;
}
})()
看看这个来自微软的演示。-> 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
在谷歌Chrome和IE 9上,它运行良好。非常好!
document.addEventListener(...
而不是 window
。 - banderson623addEventListener('DOMContentLoaded', load2, false)
的末尾加上false。DOMContentLoaded没有要遍历的父项。 - Patrick W. McMahondocument.addEventListener("DOMContentLoaded", function(e){
console.log("dom ready");//output to web browser console
});
不需要使用JQuery。在DOMContentLoaded事件中不需要传递第三个参数,因为该事件没有父元素来遍历事件。也不需要过于花哨,只需使用下面的代码即可检测DOM何时完全加载并准备好使用。当我注意到DOM助手库时,我笑了。那个库绝对是无用的。
DOMContentLoaded事件在文档完全加载和解析完成时触发,而无需等待样式表、图像和子框架完成加载。
addEventListener()
是一个很好的函数,可以检查任何事件,包括DOM就绪状态。当使用"DOMContentLoaded"时,在addEventListener()
中不需要第三个参数,因为这个触发器没有父项来传递事件。在上面的示例中,您会注意到第二个参数是一个匿名函数。您也可以将函数的名称传递给第二个参数。
document.addEventListener([(string)event trigger], [function],[(boolean)traverse DOM tree]);
使用此方法的另一个好处是在更新JQuery时不会出现问题。这实际上是大多数人使用像jQuery这样的框架的最大原因之一,因为解决此问题在不同浏览器中并不一致。
document.addEventListener("DOMContentLoaded", function(e){/*dom ready do something*/});
,为什么需要使用框架来实现DOM准备好的功能呢? - Patrick W. McMahonif(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上测试过了。其他浏览器还没有测试过。如果有测试过的,请告诉我。
注意:我还没有上传存储库,但我会在闲暇时间尽快上传。
document.addEventListener('DOMContentLoaded' ...
,而不是使用库中的方法。 - Pierre H.