2

在某些情况下,由于下载速度或其他异步问题,即使我在包含 jquery.js 之后,有时也会收到有关is 的$(document).ready()抱怨。等等等等等等。$undefined

我不想这样做:

setTimeout(function() {$(document).ready()... }, 1000);

这似乎很蹩脚。

那么,是否有一种聪明的方法或正确的方法或好的方法来确保 document.ready 真的准备好被调用?:)

4

3 回答 3

4

我相信这实际上是不可能的,(事实是$这样undefined),文件头同步加载意味着每一行在下一行之前完全加载

这里有一个视频,对这个确切的测试进行了测试,看来我是对的

视频:http ://www.bennadel.com/blog/1915-How-Javascript-Loading-And-Blocking-Works-By-Default.htm

您是否正确加载文件,例如

<!DOCTYPE html>
<html>
    <head>
        <title>...</title>
        <script type="text/javascript" src="...."></script>
        <script type="text/javascript" src="...."></script>
        <script type="text/javascript" src="...."></script>
        <script type="text/javascript" src="...."></script>
        <script type="text/javascript">
            jQuery.ready(function(){
               //This is executed once all 4 above have been loaded
            });
        </script>
        <script type="text/javascript" src="...."></script>
        <script type="text/javascript" src="...."></script>
        <!-- The above to scripts are loaded in order after the jquery function has run. -->
    </head>
</html>

readyjQuery的方法只有在洞文档被加载后才会</html>被触发,直到 DOM 看到最终的结束标记,通常[引用需要]

说了不可能,在IE8或更低版本中可能是可能的,原因是IE可能是有史以来最糟糕的浏览器,但他们说IE9已经彻底大修,应该满足谷歌之类的,苹果、Mozilla 等

如果您使用多个库或覆盖$变量,您可以在锁定范围内获取它,如下所示:

(function($){
    $.ready(function(){
        //Do your jQuery here !
    });
})(jQuery)
于 2011-03-22T18:35:50.557 回答
2

您可以通过执行检查是否加载了 jQuery。

if (typeof jQuery !== 'undefined') {
  //do whatever here
}

您不必这样做。最好在 HTML 的末尾和之前包含所有 JavaScript,</body>首先是 jQuery。这是雅虎推荐的方法。您可以在http://developer.yahoo.com/performance/rules.html阅读更多内容。这不会减慢您的页面加载速度,也不会给您带来未定义 jQuery 的问题。

于 2011-03-22T18:29:50.203 回答
2

丹尼斯提供了一个很好的解决方案的链接。我现在正在使用它。

JavaScript - 如何确保已加载 jQuery?

请参阅链接中的答案和解释。

解决方案是:

<script type='text/javascript'>
runScript();

function runScript() {
    // Script that does something and depends on jQuery being there.
    if( window.$ ) {
        // do your action that depends on jQuery.
    } else {
        // wait 50 milliseconds and try again.
        window.setTimeout( runScript, 50 );
    }
}
</script>
于 2011-04-05T16:24:04.713 回答