我使用此代码将JS异步加载到头部

<script type='text/javascript'>
 // Add a script element as a child of the body
 function downloadJSAtOnload() {
var element4= document.createElement("script");
var element5= document.createElement("script");
element4.src="http:///ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js"
element5.src="http://yourjavascript.com/301810712121/slidemenu_horiz.js"
element4.async=true;
element5.async=true;
document.body.appendChild(element4);
document.body.appendChild(element5);
}
 // Check for browser support of event handling capability
 if (window.addEventListener)
 window.addEventListener("load", downloadJSAtOnload, false);
 else if (window.attachEvent)
 window.attachEvent("onload", downloadJSAtOnload);
 else window.onload = downloadJSAtOnload;
</script>


在IE和Firefox中工作正常,但在Chrome中,我出现此错误:
“未捕获的ReferenceError:未定义jQuery”

当我第二次(或第三次)刷新页面时,脚本在Chrome中运行良好,请我需要知道如何解决此问题。

最佳答案

鉴于您的需求,并且因为我过去已经成功使用过它,所以建议您使用LABjs-http://labjs.com/

如前所述,有大量脚本加载器可供选择-LABjs更加注重性能,并且不包含其他许多额外功能,例如requirejs(AMD加载器),YepNope(基于功能检测的条件加载器)有。如果您需要的是异步加载脚本并控制执行顺序,则LABjs是一个非常小的脚本,可以很好地处理这一问题。

使用LABjs,您需要执行以下操作以复制上面的代码:

<script src="js/libs/LAB.js"></script>
<script>
$LAB
.script('http://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js').wait()
.script('http://yourjavascript.com/301810712121/slidemenu_horiz.js')
.wait(function () {
    // Check jQuery has loaded (could do this for the slider as well)
    if (window.jQuery) {
        // Do something with your slider
    }
});
</script>


在上面的示例中,.wait()函数确保jQuery在slidemenu_horiz.js(最后一个.wait()作为匿名函数传递给匿名函数)之前已执行-在此范围内,您可以测试所有内容是否已加载,然后进行初始化。

值得一查脚本加载器的所有选项。确实有很多负载,每个负载都有不同的功能集,您可能会发现可以更好地解决您的问题。

编辑:为清楚起见,在代码示例中向LABjs添加了脚本引用

07-24 17:56