美文网首页
异步加载js的几种方式

异步加载js的几种方式

作者: 飞菲fly | 来源:发表于2017-09-13 10:35 被阅读717次

默认情况javascript是同步加载的,也就是javascript的加载时阻塞的,后面的元素要等待javascript加载完毕后才能进行再加载,对于一些意义不是很大的javascript,如果放在页头会导致加载很慢的话,是会严重影响用户体验的。

(1) defer,只支持IE
defer属性的定义和用法
defer 属性规定是否对脚本执行进行延迟,直到页面加载为止。
有的 javascript 脚本 document.write 方法来创建当前的文档内容,其他脚本就不一定是了。
如果您的脚本不会改变文档的内容,可将 defer 属性加入到
(2) async:
async的定义和用法(是HTML5的属性)
async 属性规定一旦脚本可用,则会异步执行。
示例: 代码如下:
//async 属性仅适用于外部脚本(只有在使用 src 属性时)。
//有多种执行外部脚本的方法:
•如果 async="async":脚本相对于页面的其余部分异步地执行(当页面继续进行解析时,脚本将被执行)
•如果不使用 async 且 defer="defer":脚本将在页面完成解析时执行
•如果既不使用 async 也不使用 defer:在浏览器继续解析页面之前,立即读取并执行脚本
(3) 创建script,插入到DOM中,加载完毕后callBack,见代码:
代码如下:

function loadScript(url, callback){
   var script = document.createElement_x("script");
   script.type = "text/javascript";
   if (script.readyState){
       //IE
      script.onreadystatechange = function(){
          if (script.readyState == "loaded" ||script.readyState == "complete"){
               script.onreadystatechange = null;callback();
              }
       };
      } else {
    //Others: Firefox, Safari, Chrome, and Opera
   script.onload = function(){callback();
        };
     }
   script.src = url;
   document.body.appendChild(script);
  }

第二个---关于异步加载js的几种方式:

一般而言,javascript脚本一般是建议放在body标签的底部,因为使用script标签加载js时,会停止加载后面的内容而停下来解析脚本并对页面进行渲染,使用src属性加载外部脚本也会造成这样的情况,这样的话,如果在head或者body的前面放入过多的script标签,并且内容很多的时候,会造成页面在解析完所有script标签的内容前有短暂的时间整个页面空白,给用户的体验会很差。但是如果所有的脚本都放在底部,又会造成dom加载完毕后有一段时间页面虽然能看到,但是和用户的交互却很差,因此需要让一些脚本与页面异步加载。

1.在html5中,script新增了async的属性,script添加了该属性之后,下载脚本时将可以与页面其他内容并行下载,但是该属性必须在ie9以上的浏览器中才可以使用,并且只能用于加载外部js脚本。

2.同样,在html4中也有一个defer属性,该属性的兼容性更好一点,但是与async一样,可以让js脚本实现异步加载,同样只能用于加载外部js脚本。
asyc与defer属性的不同点是,async会让脚本在加载完可用时立即执行,而defer脚本则会在dom加载完毕后执行,defer脚本的执行会在window.onload之前,其他没有添加defer属性的script标签之后。

<!DOCTYPE html>
<html lang="en">
<head> 
<title></title> 
<meta charset="UTF-8">
</head>
<script> window.onload = function() { console.log("window.onload"); }</script>
<script src="js/defer.js" defer></script>
<script> console.log("normal");</script>
<body>
</body>
</html>

显示的顺序为:normal defer window.onload

3.利用XHR异步加载js内容并执行,

<!DOCTYPE html>
<html lang="en">
<head>
<title></title> 
<meta charset="UTF-8">
</head>
<script> 
var xhr = new XMLHttpRequest(); 
xhr.open("get", "js/defer.js",true) ;
xhr.send(); 
xhr.onreadystatechange = function() {
if (xhr.readyState == 4 && xhr.status == 200) {
     eval(xhr.responseText); 
    }
}
</script>
<body></body>
</html>

4.动态创建script标签,主要代码如下

var script = document.createElement("script"); 
script.src = "js/test.js"; 
document.head.appendChild(script);

该方式还可以通过script的onreadyState监视加载的状态。

5.iframe方式,利用iframe加载一个同源的子页面,让子页面内的js影响当前父页面的一种方式。

第三个----关于js异步加载的几种方式

原文链接 - http://www.cnblogs.com/huangcong/p/3747038.html

方案一、$(document).ready()

需要引入jquery
兼容所有浏览器

$(document).ready(function() {
alert("加载完成!");
 });

方案二、<script>标签的async="async"属性

1.async属性是HTML5新增属性,需要Chrome、FireFox、IE9+浏览器支持
2.async属性规定一旦脚本可用,则会异步执行
3.async属性仅适用于外部脚本
4.此方法不能保证脚本按顺序执行

<script type="text/javascript" src="xxx.js" async="async"></script>

方案三、<script>标签的defer="defer"属性

1.defer属性规定是否对脚本执行进行延迟,直到页面加载为止
2.如果脚本不会改变文档的内容,可将defer属性加入到<script>标签中,以便加快处理文档的速度
3.兼容所有浏览器
4.此方法可以确保所有设置了defer属性的脚本按顺序执行

方案四、动态创建<script>标签

兼容所有浏览器

(function(){
    var script = document.createElement('script');
    script.type = 'text/javascript';
    script.src = "http://code.jquery.com/jquery-1.7.2.min.js";
    var tmp = document.getElementsByTagName('script')[0];
    tmp.parentNode.insertBefore(script, tmp);
})();

相关文章

  • 异步加载js的几种方式

    默认情况javascript是同步加载的,也就是javascript的加载时阻塞的,后面的元素要等待javascr...

  • java_Ajax

    Ajax:(asynchronous js and xml) 异步的js和xml 指的是一种交互方式 异步加载,客...

  • 网页优化

    1. 资源代码压缩合并,减少HTTP请求 2. 非核心代码的异步加载 异步加载方式:动态脚本加载(js创建SCRI...

  • html,css,js加载顺序

    1. 加载方式 css 异步加载(不阻塞)js 同步加载(阻塞) 2. 放置顺序 css 放置于 标签中原因:...

  • js加载同步还是异步? JSONP原理?

    1、浏览器端的js加载默认是同步还是异步?同步,可以人为设置异步;async让js异步加载,需要每个script标...

  • Unity3D 贴图异步同步加载方式

    Unity3D加载贴图几种常用的方式 第一种 通过WWW异步加载 通过WWW 加载完成后 ,用www.textur...

  • Node.js 逐行读取文件的 4 种方法

    Node.js可以同步或异步的方式逐行读取文件内容。其中,异步方式可以读取大型文件而不需要同时加载文件所有内容。 ...

  • 优化大量图片加载recyclerview列表的滑动效果

    通用的几种方式 viewHolder复用机制 图片异步加载、缓存、压缩(使用glide等解决,最好后台反2套:缩略...

  • js面试题-3(ajax)

    1. 阐述一下异步加载 JS 异步加载的方案: 动态插入script标签 通过ajax去获取js代码,然后通过e...

  • 系统源码简析

    同步加载 异步加载 页面的懒加载,只针对vue文件,js文件被放到app.js中了, 比如 share.js。 a...

网友评论

      本文标题:异步加载js的几种方式

      本文链接:https://www.haomeiwen.com/subject/mxjksxtx.html