使用jQuery,我们都知道很棒的.ready()函数:

$('document').ready(function(){});

然而,假设我想运行一个用标准JavaScript编写的函数,而没有库支持它,并且我想在页面准备好处理它后立即启动一个函数。正确的方法是什么?

我知道我能做到:

window.onload="myFunction()";

或者我可以使用body标签:

<body onload="myFunction()">

或者,我甚至可以在页面底部尝试所有内容,但结尾正文或html标记如下:

<script type="text/javascript">
    myFunction();
</script>

什么是以jQuery的$.ready()这样的方式发出一个或多个函数的跨浏览器(旧/新)兼容方法?


当前回答

我不太确定你在问什么,但也许这会有所帮助:

window.onload = function(){
    // Code. . .

}

Or:

window.onload = main;

function main(){
    // Code. . .

}

其他回答

HubSpot的好人有一个资源,你可以在那里找到纯Javascript方法来实现jQuery的很多优点,包括准备好

http://youmightnotneedjquery.com/#ready

function ready(fn) {
  if (document.readyState != 'loading'){
    fn();
  } else if (document.addEventListener) {
    document.addEventListener('DOMContentLoaded', fn);
  } else {
    document.attachEvent('onreadystatechange', function() {
      if (document.readyState != 'loading')
        fn();
    });
  }
}

内联用法示例:

ready(function() { alert('hello'); });

如果您在不使用jQuery的情况下使用VANILLA纯JavaScript,则必须使用(Internet Explorer 9或更高版本):

document.addEventListener("DOMContentLoaded", function(event) {
    // Your code to run since DOM is loaded and ready
});

上面是jQuery.ready的等价物:

$(document).ready(function() {
    console.log("Ready!");
});

也可以这样编写SHORTHAND,jQuery将在就绪后运行。

$(function() {
    console.log("ready!");
});

不要与以下内容混淆(这并不意味着DOM准备就绪):

不要使用这种自动执行的IIFE:

 Example:

(function() {
   // Your page initialization code here  - WRONG
   // The DOM will be available here   - WRONG
})();

此IIFE不会等待DOM加载。(我甚至在谈论最新版本的Chrome浏览器!)

document.ondomcontentready=function(){}应该可以做到这一点,但它没有完全的浏览器兼容性。

看起来您应该使用jQuery min

您的方法(将脚本放在结束体标记之前)

<script>
   myFunction()
</script>
</body>
</html>

是支持新旧浏览器的可靠方式。

我想在这里提到一些可能的方法,以及一个适用于所有浏览器的纯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将此内容纳入他们的书中。