动态载入js脚本的同步/异步问题

var script = document.createElement("script");
script.setAttribute("src", "script.js");
script.setAttribute("async", "false");
document.body.appendChild(script);

现在我用这种方式引入js脚本,但依然是异步的,如何使它同步?

阅读 15.5k
7 个回答
<head>
  <script>
    var src = 'js/test.js';
    var s = document.createElement('script');
    s.src = src;
    document.head.appendChild(s);
  </script>
</head>

async 属性看链接:链接描述

要同步引入外部js文件是可行的

<script>
    document.write('<scr'+'ipt type="text/javascript" src="jquery.js"></sc'+'ript>');
</script>
<script>
    //必须在另一个标签里才能调用引入的jQuery
    $...
</script>

但是有很多限制:

  1. document.write只能在文档加载完成前用

  2. document.write所引入的代码并不会在document.write之后立即执行,而是在它所在的script标签执行完成后才执行。

  3. 字符串里的script必须拆开成如scr'+'ipt形式,以免被浏览器视为关闭标签。

同步的话请使用 <script>标签,这个会阻塞浏览器

用ajax可以实现。
比如jquery的

jQuery.getScript( url [, success(script, textStatus, jqXHR) ] )

或者直接自己用ajax写。

$.ajax({
  url: url,
  async:false,
  dataType: "script",
  success: function(){
     //ok
  }
});

这本来就是异步加载的方式吧

同步:

<script src="a.js"></script>

appendChild的方法引入script都是异步的。
同步的话只能单独引入,或者把同步的javascript合并。

demo.js自执行,依赖jqurery.js中的$全局变量,优先加载jquery.js,再加载demo.js同步加载处理方法

第一种方法:纯js同步加载先后加载jqurery.js和demo.js。

var jqr = document.createElement('script');
jqr.type = 'text/javascript';
jqr.async = false; // 异步加载 true
jqr.src = '/js/jquery.js';
jqr.onload = function() {
    var demo= document.createElement('script');
    demo.type = 'text/javascript';
    demo.async = false; // 异步加载 true, onload方法中的内容放到外面同级执行
    demo.src = '/js/demo.js';
    var ss = document.getElementsByTagName('script')[0];
    ss.parentNode.insertBefore(sdk, ss);
};
var s = document.getElementsByTagName('script')[0];
s.parentNode.insertBefore(jqr, s);

第二种方法:html中引入script标签同步加载jqurery.js和demo.js。

<script type="text/javascript" src="/js/jquery.js"></script> // 异步加载加 async 属性
<script type="text/javascript" src="/js/demo.js"></script>   // 异步加载加 async 属性

图片描述

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