使用jQuery,我们都知道很棒的.ready()函数:
$('document').ready(function(){});
然而,假设我想运行一个用标准JavaScript编写的函数,而没有库支持它,并且我想在页面准备好处理它后立即启动一个函数。正确的方法是什么?
我知道我能做到:
window.onload="myFunction()";
或者我可以使用body标签:
<body onload="myFunction()">
或者,我甚至可以在页面底部尝试所有内容,但结尾正文或html标记如下:
<script type="text/javascript">
myFunction();
</script>
什么是以jQuery的$.ready()这样的方式发出一个或多个函数的跨浏览器(旧/新)兼容方法?
准备好的
function ready(fn){var d=document;(d.readyState=='loading')?d.addEventListener('DOMContentLoaded',fn):fn();}
像这样使用
ready(function(){
//some code
});
用于自调用代码
(function(fn){var d=document;(d.readyState=='loading')?d.addEventListener('DOMContentLoaded',fn):fn();})(function(){
//Some Code here
//DOM is avaliable
//var h1s = document.querySelector("h1");
});
支持:IE9+
这是Ramswaloop“适用于所有浏览器”的一个清理过的、非eval版本——适用于所有的浏览器!
function onReady(yourMethod) {
var readyStateCheckInterval = setInterval(function() {
if (document && document.readyState === 'complete') { // Or 'interactive'
clearInterval(readyStateCheckInterval);
yourMethod();
}
}, 10);
}
// use like
onReady(function() { alert('hello'); } );
然而,它确实需要额外等待10毫秒才能运行,所以这里有一个更复杂的方法不应该:
function onReady(yourMethod) {
if (document.readyState === 'complete') { // Or also compare to 'interactive'
setTimeout(yourMethod, 1); // Schedule to run immediately
}
else {
readyStateCheckInterval = setInterval(function() {
if (document.readyState === 'complete') { // Or also compare to 'interactive'
clearInterval(readyStateCheckInterval);
yourMethod();
}
}, 10);
}
}
// Use like
onReady(function() { alert('hello'); } );
// Or
onReady(functionName);
另请参阅How to check if DOM is ready without a framework?。
我想在这里提到一些可能的方法,以及一个适用于所有浏览器的纯javascript技巧:
// with jQuery
$(document).ready(function(){ /* ... */ });
// shorter jQuery version
$(function(){ /* ... */ });
// without jQuery (doesn't work in older IEs)
document.addEventListener('DOMContentLoaded', function(){
// your code goes here
}, false);
// and here's the trick (works everywhere)
function r(f){/in/.test(document.readyState)?setTimeout('r('+f+')',9):f()}
// use like
r(function(){
alert('DOM Ready!');
});
正如原作者所解释的,这里的技巧是我们正在检查document.readyState属性。如果它包含字符串(如未初始化和加载时,前两个DOM就绪状态(共5个)),我们将设置超时并再次检查。否则,我们执行传递的函数。
这是jsFiddle的技巧,适用于所有浏览器。
感谢Tutorialzine将此内容纳入他们的书中。