JS异步加载的三种方式

  js加载的缺点:加载工具方法没必要阻塞文档,过得js加载会影响页面效率,一旦网速不好,那么整个网站将等待js加载而不进行后续渲染等工作。 有些工具方法需要按需加载,用到再加载,不用不加载,。

  默认正常模式下下,JS是同步加载的,即优先记载JS,只有当JS文件下载完,dom和css才开始加载,当某些事后我们需要JS异步加载,我们可以通过以下方式来设置异步加载,不同情况下选取不同方式即可

1.defer:defer
  JS异步下载,dom结构解析完(标签 + 样式(内容不一定下载完))才异步执行
  仅IE能用
  内部JS也能用该属性
  异步加载js不允许使用document.write,因为document.write会清除文档流,js标签还未加载就会被清除
  document.write()可用于初始化页面
2.(h5)async:async(asynchronous) ajax(asynchronous javascript and XML)
  JS异步加载,加载完毕后立刻异步执行
  IE8及以下不兼容
  内部JS不能用该属性

3.除了以上两种方法,还有一种兼容自己封装的异步加载方式

  

function asyncLoaded(url,callBack){/*url为js的链接,callBack为url的js中的函数(该函数调用应该写到匿名函数中,如function(){console.log(div.getScrollOffset())})*/
    var script = document.createElement(‘script‘);
    script.type = ‘text/javascript‘;
    /*if else 这几句话必须要写到这位置处,不能放最后,因为if中js加载中script.readyState存在好几种状态,
    只有状态改变‘readystatechange’事件才会触发,但现在浏览器加载速度很快,当解析到该事件时JS有可能以加载完,
    所以事件根本不会触发,所以要写到前面*/
    if(script.readystate){//兼容IE
        script.onreadystatechange = function() {//状态改变事件才触发
            if(script.readyState == ‘loaded‘ || script.readyState == ‘complete‘){
                callBack();
                script.onreadystatechange = null;
            }
        }
    }else{
        script.onload = function(e){
            callBack();
        }
    }
    script.src = url;
    document.body.appendChild(script);
}
时间: 2024-12-29 12:17:26

JS异步加载的三种方式的相关文章

点评js异步加载的4种方式

主要介绍了点评js异步加载的4种方式,帮助大家更全面的了解js异步加载方式,感兴趣的小伙伴们可以参考一下 js异步加载的4种方式,点评开始. <!DOCTYPE html> <html> <head> <script src="http://common.cnblogs.com/script/jquery.js" type="text/javascript"></script> <script typ

JS异步加载的几种方式

一:同步加载 我们平时使用的最多的一种方式. <script src="http://yourdomain.com/script.js"></script> <script src="http://yourdomain.com/script.js"></script> 同步模式,又称阻塞模式,会阻止浏览器的后续处理,停止后续的解析,只有当当前加载完成,才能进行下一步操作.所以默认同步执行才是安全的.但这样如果js中有输

js异步加载的3种方式(转载)

1.defer标签 只支持IE    defer属性的定义和用法: 属性规定是否对脚本执行进行延迟,直到页面加载为止.有的 javascript 脚本 document.write 方法来创建当前的文档内容,其他脚本就不一定是了.如果您的脚本不会改变文档的内容,可将 defer 属性加入到 <script> 标签中,以便加快处理文档的速度.因为浏览器知道它将能够安全地读取文档的剩余部分而不用执行脚本,它将推迟对脚本的解释,直到文档已经显示给用户为止. <script type="

js异步加载的三种解决方案

默认情况javascript是同步加载的,也就是javascript的加载时阻塞的,后面的元素要等待javascript加载完毕后才能进行再加载,对于一些意义不是很大的javascript,如果放在页头会导致加载很慢的话,是会严重影响用户体验的. (1) defer,只支持IE defer属性的定义和用法(我摘自w3school网站) defer 属性规定是否对脚本执行进行延迟,直到页面加载为止. 有的 javascript 脚本 document.write 方法来创建当前的文档内容,其他脚本

javascript脚本异步加载的几种方式

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

Flask程序相关配置加载的三种方式

方式一:从对象中加载配置 1.定义配置类,在配置类中添加相应的配置 2.通过app.config.from_object(配置类)进行加载 代码如下: from flask import Flask app=Flask(__name__) # =======从对象中加载配置========= class Config(object): DEBUG=True app.config.from_object(Config) @app.route("/") def index(): retur

加载图片三种方式

这里用的是CIImage,同样可以转换成UIImage.内容比较简单,适合初学者.(自己忘记时看看,严禁商业转载) //第一种,从应用程序包中(资源文件)加载图像 NSString * path = [[NSBundle mainBundle] pathForResource:@"1" ofType:@"png"]; NSURL * pathURL = [NSURL URLWithString:path]; CIImage * img = [CIImage imag

vue+webpack实现懒加载的三种方式

实现方式: 1.webpack method require.ensure([''], callback, chunkName) ; 2.es6 motehod import() import().then() import(/* webpackChunkName: async-chunk-name */ /* webpackMode: lazy */ modulename) 需要安装bable插件 syntax-dynamic-import,因为import只能出现在页面顶部 具体实现: 第一

js异步加载

加载顺序是怎样的? 动态的和静态的都加载完之后才执行ready 还是只有静态的加载完之后就执行了? 页面加载完成之后是指什么才是完全加载完? 什么是并行,什么是异步 脚本的加载应该与文档的加载同时进行,并且不影响DOM的渲染. 文档加载?DOM加载 async属性是HTML5新增的.作用和defer类似,即允许在下载脚本的同时进行DOM的渲染.但是它将在下载后尽快执行(即JS引擎空闲了立马执行),不能保证脚本会按顺序执行.它们将在onload 事件之前完成. 异步加载的三种方式 http://w