动态加载js文件

       平时我们做的项目如果在页面上有很多js特效,那么就会加载很多的js。那么就会按更能分开写在多个文件中,而且有些js是在满足某中情况才会执行。当页面加载过多的js文件时会很慢的,加载js是同步的,只有上一个js加载解析完成才会去加载下一个js文件。

       那么这个时候我们就想到了动态(延迟)加载,在我们需要那个js的时候,再去加载。这样效率会高很多的。

       动态加载js文件在jquery中已经实现了,调用getScript(url,fn);就可以把需要的js加载。

       当有时候没有jquery的时候,我们就应该向其他的办法。比如到用Ext做的时候,可能就不需要用到jquery。

       第一种方法:

     Ext.Ajax.request({
		url : url,
		success : function(data) {
			eval(data.responseText);
                        //调用函数
                     }
	});
    这种方式用 eval() 执行它的范围只在请求的这个范围内在外边是无效的,不能调用里边的方法


     第二种方法:

  var head = document.head
              || document.getElementsByTagName("head")[0]|| document.documentElement;
   var script = document.createElement("script");
   script.setAttribute("type","text/javascript");
   script.setAttribute("src",url);
   //好像只有IE支持
   script.onreadystatechange=function(){
   if(document.readyState=='complete'){
          callback();
       }
     };
   / //
   head.insertBefore(script, head.firstChild);

        这种方式就是创建一个script对象,在设置script的src属性,这种方式最简单。但是上边利用加载状态来处理,他的兼容不是很好,所以不可采取。

        所以我们还是没办法在js加载完成后,就马上调用函数。


     第三种方法:

function loadJs(url, callback) {
    Ext.Ajax.request({
        url : url,
        success : function(data) {
            var head = document.head
                    || document.getElementsByTagName("head")[0]
                    || document.documentElement;
            var script = document.createElement("script");
             //把返回的数据放在script对象中 这种在火狐可以,IE8不行  appendChild方法
            //script.appendChild(document.createTextNode(data.responseText));
            script.text=data.responseText;
            head.insertBefore(script, head.firstChild);
            head.removeChild(script);
            if (callback && "function" == typeof callback) {
                callback();
            }
        }
    });
}

          这种方式也就是jquery中采用的这种。是比较好的,和第二种一样,创建一个script对象但不同的是,这是不是设置src属性而是把返回来的js代码直接方法script对象体内(也就相当于执行了一次),这样他就是全局的了。可以随处调


               个人理解多多指点









评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值