关于JavaScript的异步加载问题

这样引入一个JavaScript:

<script type="text/javascript" async src="//somedomain.com/somefile.js"></script>

这里用到了async,在使用这个脚本的时候,如果同时执行其它操作,如:

$("div.foo").click(function(){
  // 1. 运行和引用的somefile.js有关的事件
  // 2. 窗体跳转
});

在这个过程中,期待按顺序执行1和2,实际上却是有时先执行1,有时先执行2,这个异步加载如何处理能达到希望的效果呢?

阅读 4.9k
3 个回答

简单的做法是建议考虑在script载入完成后再绑定。

<script type="text/javascript" async src="//somedomain.com/somefile.js" onload="bindClick"></script>
function bindClick(){
  $("div.foo").click(function(){
    // 1. 运行和引用的somefile.js有关的事件
    // 2. 窗体跳转
  });
}

在比较复杂的系统里,通常采用模块化开发,比如你的somefile.js就作为一个模块,在文件内部暴露某些方法和变量,然后在somefile.js模块加载完成后进行相关操作。以sea.js为例:
somefile.js:

define(function(require, exports, module) {
        exports.foo = function() { //暴露foo方法
            //todo
        };
});

index.html:



其实现原理和一楼说的基本类似,另外,如果你关注js的执行顺序,同时又不希望js下载时阻塞html的解析,那么可以使用defer而非async,这两者的区别可以参考以下网址:http://peter.sh/experiments/asynchronous-and-deferred-javascript-execution-explained/

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题