如何动态加载js?

简介: 第三方的js文件,自己写的js文件,js越来越多了怎么办?   提出问题: 1、js文件太多了,每个页面都写太麻烦。 2、如果路径变化了,或者js名称变化了怎么办?每个页面都改一遍吗? 3、如何约束js文件的加载顺序?a.js定义了一个函数,b.js要调用,但是b.js先加载了,a.js还没加载完成,造成函数未定义,无法调用。

第三方的js文件,自己写的js文件,js越来越多了怎么办?

 

提出问题:

1、js文件太多了,每个页面都写<script src="...">太麻烦。

2、如果路径变化了,或者js名称变化了怎么办?每个页面都改一遍吗?

3、如何约束js文件的加载顺序?a.js定义了一个函数,b.js要调用,但是b.js先加载了,a.js还没加载完成,造成函数未定义,无法调用。

4、js文件的合并。开发阶段,js会分成多个文件,这样便于开发。但是成熟了之后会合并成一个文件。这样引用方式就会变化,原先引用一堆js,现在只需要引用一个js。同样不能每个页面都改一遍。

5、加载js完毕之后,要可以执行回调函数。 

 

解决问题:

如何解决这些问题呢?我想到的办法是——动态加载js。就是通过js代码的方式来加载。

在网上找了一些资料,最后确定借鉴 张经纬 的代码 http://www.zhangjingwei.com/archives/asynchronous-loading-js/

其中这段代码挺符合我的需求。

var loadscript =
{
    $$:function(id){return document.getElementById(id)},
    tag:function(element){return document.getElementsByTagName(element)},
    ce:function(element){return document.createElement(element)},
    js:function(url,callback)
    {
        s = loadscript.ce('script');
        s.type = "text/javascript";
        s.onreadystatechange = ready;
        s.onerror = s.onload = callback;
        s.src = url;
        loadscript.tag('head')[0].appendChild(s);
        function ready(){
            if (s.readyState == 'loaded' || s.readyState == 'complete') {
                callback();
            }
        };
    }
}

 

一开始把代码copy过来使用,在ie8和chrome里面都没有问题。既然没有问题那就用呗,虽然还不知道为啥要这么写代码。

 

遇到新问题:

但是没过多久就遇到了问题,在IE10里面,树、分页、表格等,都会多出来好几份?

把IE10设置为兼容IE7的模式,就一切正常。看了是IE10的新特性照成的。那么到底是怎么回事呢?断点跟踪吧。

 

弄了好久才发现,原来是js文件会被加载多次。

为什么被加载了多次呢?原因在于 onreadystatechange 和 onload 。为什么这两个事件都调用了callback?为什么其他浏览器没事,IE10有事呢?

根据断点跟踪得到了原因。

原来 chrome只会触发 onload, 而不会触发onreadystatechange(不会进入断点)。

而IE7只会触发 onreadystatechange,而不会触发onload。

那么IE10呢?两个都会被触发。

 

继续解决:

一开始是想做一个标志位。做一个标志,如果callback了就不再次callback。但是实际效果有点不稳定,当然很可能是俺代码没处理好。

于是还是换一种方法吧。老办法,判断浏览器类型。

如果是IE10,那么只设置onload。然后,世界安静了。当然这里浏览器的类型判断还不完全。浏览器太多了,遇到不兼容的在考虑吧,俺js其实很烂的。

 

var loadscript =
{
    $$: function(id) { return document.getElementById(id); },
    tag: function(element) { return document.getElementsByTagName(element); },
    ce: function(element) { return document.createElement(element); },
    js: function(url, callback) {
        var s = loadscript.ce('script');
        s.type = "text/javascript";
        s.src = url;
        if (document.documentMode == 10 || document.documentMode == 9) {
            s.onerror = s.onload = loaded;
        } else {
            s.onreadystatechange = ready;
            s.onerror = s.onload = loaded;
        }
        loadscript.tag('head')[0].appendChild(s);

        function ready() { /*IE7.0/IE10.0*/
            if (s.readyState == 'loaded' || s.readyState == 'complete') {
                callback();
            }
        }

        function loaded() { /*chrome/IE10.0*/
            callback();
        }
    }
};

 

 

小结:

看最后的代码,是没啥特别的,重点在于理解原有代码,发现问题,解决问题的过程。

 

下一步是如何管理js。还有js的客户端缓存、复用的问题。

 

 

 

 

 

 

相关文章
|
2月前
|
数据采集 Web App开发 JavaScript
利用Selenium和XPath抓取JavaScript动态加载内容的实践案例
利用Selenium和XPath抓取JavaScript动态加载内容的实践案例
|
5月前
|
JavaScript 前端开发 Go
动态加载与异步加载 JavaScript 详解:加载远程js,加载成功后执行回调函数
动态加载与异步加载 JavaScript 详解:加载远程js,加载成功后执行回调函数
781 2
|
20天前
|
Web App开发 数据采集 JavaScript
有JavaScript动态加载的内容如何抓取
有JavaScript动态加载的内容如何抓取
|
5月前
|
JavaScript 前端开发 iOS开发
js实用方法记录-动态加载css/js
js实用方法记录-动态加载css/js
47 0
|
JSON 前端开发 JavaScript
BootStrap框架下使用JS动态加载table并点击相关列弹出二级页面
在这里记录一下,也是在公司用到的一个例子,刚刚解决,正好趁热打铁。前端页面是采用BootStrap框架搭建的,主要的样式涉及到项目,在这里就不截图了,直接上代码:
105 1
|
数据采集 JavaScript 前端开发
如何采集javascript动态加载网页
从一个运行 javascript 的网站加载所有数据来加载内容,目前的问题是当运行启动代码时它无法加载 javascript 内容,因为用户应该向下滚动才能加载。如何编写启动代码来滚动整页呈现 javacript 并返回 html呢? 为了加载运行JavaScript来加载内容的网站上的所有数据,可以修改Splash代码以模拟滚动并确保整个页面呈现,从而能够检索所需的HTML内容
|
JavaScript 前端开发
HTML中的JavaScript中script元素 动态加载脚本
本文介绍了HTML中JavaScript的动态加载脚本的概念、优势和实现方式,并结合实例讲解了如何通过动态加载脚本实现更加灵活的控制和优化。
|
前端开发 JavaScript UED
HTML中的JavaScript中script元素动态加载脚本
在HTML中,<script>元素可以通过动态创建和添加来实现动态加载脚本。动态加载脚本可以优化页面性能和提高用户体验,但需要注意脚本的执行顺序和依赖关系。
|
JavaScript API 数据库
EasyUI+js实现动态加载导航栏
EasyUI+js实现动态加载导航栏
281 0
EasyUI+js实现动态加载导航栏
|
JavaScript 前端开发 iOS开发
js实用方法记录-动态加载css/js
动态加载js文件到head标签并执行回调
260 0
下一篇
无影云桌面