怎样实现javascript代码的异步加载

 我来答
潭州教育
2017-02-13 · 上网学习,就来潭州!
潭州教育
潭州教育总部坐落于美丽的星城长沙,位于麓谷芯城科技园拥有两座办公大厦。办公面积4万多平方;6000多名师资教学力量。200多门课程;在线学习学员高达1100万名学员,30万VIP学员。
向TA提问
展开全部

实现javascript代码的异步加载方式:

1、常见异步加载(Script DOM Element)

(function() {
    var s = document.createElement('script');
    s.type = 'text/javascript';
    s.async = true;
    s.src = 'http://yourdomain.com/script.js';
    var x = document.getElementsByTagName('script')[0];
    x.parentNode.insertBefore(s, x);
})();

异步加载又叫非阻塞,浏览器在下载执行 js 同时,还会继续进行后续页面的处理。

这种方法是在页面中<script>标签内,用 js 创建一个 script 元素并插入到 document 中。这样就做到了非阻塞的下载 js 代码。

async属性是HTML5中新增的异步支持,见后文解释,加上好(不加也不影响)。

此方法被称为 Script DOM Element 法,不要求 js 同源。

将js代码包裹在匿名函数中并立即执行的方式是为了保护变量名泄露到外部可见,这是很常见的方式,尤其是在 js 库中被普遍使用。 

例如 Google Analytics 和 Google+ Badge 都使用了这种异步加载代码:

(function() {
    var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
    ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
    var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
})();
(function()
   {var po = document.createElement("script");
   po.type = "text/javascript"; po.async = true;po.src = "https://apis.google.com/js/plusone.js";
   var s = document.getElementsByTagName("script")[0];
   s.parentNode.insertBefore(po, s);
})();

但是,这种加载方式在加载执行完之前会阻止 onload 事件的触发,而现在很多页面的代码都在 onload 时还要执行额外的渲染工作等,所以还是会阻塞部分页面的初始化处理。

2、onload 时的异步加载

(function() {
    function async_load(){
        var s = document.createElement('script');
        s.type = 'text/javascript';
        s.async = true;
        s.src = 'http://yourdomain.com/script.js';
        var x = document.getElementsByTagName('script')[0];
        x.parentNode.insertBefore(s, x);
    }
    if (window.attachEvent)
        window.attachEvent('onload', async_load);
    else
        window.addEventListener('load', async_load, false);
})();

这和前面的方式差不多,但关键是它不是立即开始异步加载 js ,而是在 onload 时才开始异步加载。这样就解决了阻塞 onload 事件触发的问题。

补充:DOMContentLoaded 与 OnLoad 事件

DOMContentLoaded : 页面(document)已经解析完成,页面中的dom元素已经可用。但是页面中引用的图片、subframe可能还没有加载完。

OnLoad:页面的所有资源都加载完毕(包括图片)。浏览器的载入进度在这时才停止。

这两个时间点将页面加载的timeline分成了三个阶段。

3、异步加载的其它方法

由于Javascript的动态特性,还有很多异步加载方法:

XHR Eval 
XHR Injection
Script in Iframe
Script Defer
document.write Script Tag

还有一种方法是用 setTimeout 延迟0秒 与 其它方法组合。

XHR Eval :通过 ajax 获取js的内容,然后 eval 执行。

var xhrObj = getXHRObject(); 
xhrObj.onreadystatechange =  
  function() {  
    if ( xhrObj.readyState != 4 ) return; 
    eval(xhrObj.responseText); 
  }; 
xhrObj.open('GET', 'A.js', true); 
xhrObj.send('');

Script in Iframe:创建并插入一个iframe元素,让其异步执行 js 。

var iframe = document.createElement('iframe'); 
document.body.appendChild(iframe); 
var doc = iframe.contentWindow.document; 
doc.open().write('<body onload="insertJS()">'); 
doc.close();

GMail Mobile:页内 js 的内容被注释,所以不会执行,然后在需要的时候,获取script元素中 text 内容,去掉注释后 eval 执行。

<script type="text/javascript"> 
/* 
var ...  
*/ 
</script>

详见参考资料中2010年的Velocity 大会 Steve Souders 和淘宝的那两个讲义。

全国流窜
2016-11-17 · TA获得超过403个赞
知道小有建树答主
回答量:417
采纳率:50%
帮助的人:168万
展开全部
//jquery:

    $.ajax({
        url: "",
        //async: false, 默认异步:true
        type: "get", 
        data: {  },
        error: function (xhr) {
            alert(xhr.responseText);
        },
        success: function (str) {
            //...
        }
    });
本回答被网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
soul张佳妮
2016-11-17 · TA获得超过1441个赞
知道小有建树答主
回答量:682
采纳率:83%
帮助的人:43.2万
展开全部
因为浏览器发现该DOM结构发生变化后就会重新渲染一次界面,同时也就把JS加载到页面了。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式