也说JS脚本加载控制

问题背景

  前端采用的 iframe + html 做后台管理系统。现在js、jquery插件非常多,每次页面都是引用就类似这样:

    <script src="../Scripts/jquery-1.7.1.js"></script>
    <script src="../Scripts/uploadify/jquery.uploadify.js"></script>
    <script src="../Scripts/uploadify/swfobject.js"></script>
    <link href="../Scripts/uploadify/uploadify.css" rel="stylesheet" />

  有时候需要更新其中一个组件,为了避免客户端浏览器手动刷新,一般的做法是增加版本号,比如 xxx.js?v=1111。

或者说,需要删掉某个组件,引用某个组件。

在这2种情况下,都需要针对每个页面,增加 script 引用。每次新建一个html,就要把之前的页面的 script 引用都复制过来,有木有?

解决办法

  现在有Require.js , sea.js ,labjs 等等各种高大上的框架。

  以上框架中,楼主仅试过用lab.js解决这种问题,它可以很好的控制脚本的异步加载,以及脚本的依赖,然后可以在脚本加载完毕后,做初始化的操作。当时仅仅是做了一个Demo,一直过了很长时间,也没有使用,原因无它,如果希望能控制脚本的动态加载时,又希望像以前一样直接在页面上引用script,换句话来说,楼主要的不是重写脚本引用方式,而是在原有基础上稍作改善。

关键方法很简单,使用了 document.writeIn(‘...‘) 来加载。这种加载方式,是同步加载,就是它了。

  具体思路则是,定义一个数组存放脚本以及css路径,建议使用绝对路径,这样不会因为页面所在的位置而导致脚本加载不上。

然后做了一点点小改进,同步加载js,异步加载css。同时支持设置版本号,这样可以轻松控制客户端的自动更新。大致实现代码如下:

  在实际应用过程中,这个js脚本,是会经常发生变更,所以必须再通过 document.writeIn 加载这个脚本。首先可以以如下形式写在页面中

<script>
document.writeIn(‘...‘);
</script>

  这样略微不方便啦。于是楼主又写了一个脚本,仅仅只有如上一行代码,就是用来控制加载前面定义通用的脚本组件。这个只有一行代码的脚本,是万年不变的,所有页面直接引用即可,由它来控制后面的脚本变化。

测试

  上面说,脚本加载的形式是同步的,为了证明这一点,楼主不得不写一点简单的例子。看看下面的html代码:

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    <title></title>
</head>
<body>
    <input type="text" id="uid" value="111" />
</body>
</html>
<script src="Scripts/com/boot.js"></script>
<script>
    alert($("#uid").val());
</script>

  而boot.js就是引导脚本,就是之前提到的一行代码:

/*引导加载所有的js文件*/document.writeln("<script src=‘/Scripts/com/bootallscript.js?v=" + Math.random() + "‘><\/script>");

  bootallscript.js就是最核心的了,复杂加载所有的js和css。

(function () {
    var base = ‘/Scripts/‘;
    var loader = {
        base: ‘/Scripts/‘,
        ver: 1,
        content: [ //定义需要加载的脚本
              ‘jquery-1.7.1.min.js‘
        ],
        loadcss: function (cssUrl) {
            var link = document.createElement("link");
            link.rel = "stylesheet";
            link.type = "text/css";
            link.href = cssUrl;
            document.getElementsByTagName("head")[0].appendChild(link);
        },
        run: function () {
            for (var i in loader.content) {
                var c = loader.content[i];
                if (c.length <= 2) continue;
                var p = loader.base + c + "?v=" + loader.ver;;
                var type = c.substr(c.length - 2, c.length);
                if (type === ‘js‘) { //同步加载js文件
                    document.writeln("<script src=‘" + p + "‘ ><\/script>");
                } else { //异步加载css文件
                    loader.loadcss(p);
                }
            }
        }
    };
    //加载js脚本
    loader.run();
})();

  运行后会发现,页面在加载完成后,使用jQuery获取到了控件的值。这种方式和原来的直接脚本引用,差别不大吧。

  说到这里,我们新建页面后,只需要引用 boot.js就能加载上所有的组件,而页面逻辑相关的js,也可以直接引用在boot.js下方,没有改变原来的脚本引用习惯,又能极大的节省了代码,完善对脚本的控制,这就是楼主想要的效果了。  

  写在最后,当然mvc对类似的问题有了解决方案,这里不探讨,因为讨论的是 前端 iframe+html 无 C# 。

  示例下载

也说JS脚本加载控制

时间: 2024-11-07 17:43:06

也说JS脚本加载控制的相关文章

关于Jquery,js脚本加载执行先后顺序的一些事

好久没用Jquery了,最近有个东西需要写一下,就想了想那些让脚本延缓执行的一些方法有什么区别呢. (1)当然,第一种方式就是将脚本内嵌在html中相应需要执行的地方,需要等到页面加载完成的话就放在最后.当然这已经是大家很不屑的做法,一般也就是一些测试啊什么的时候会用用或者代码就一几句话,其他很少会这么做了.作为外部文件引入的优点也就不赘述了,一般都明白. (2)将<Script>标签从head放到〈/body〉之前,其他html内容之后.这也很好理解,主要的html加载完之后,脚本才开始运行

外部引入的js 判断js脚本加载是否完成,完成后执行 相应的动作(以引入百度地图js为例)

可以使用JQuery的 $.getScript(url,function(){});方法 $.getScript("http://api.map.baidu.com/getscript?v=1.1&ak=&services=true&t=",function(){ //获取百度地图js成功后 会执行此方法 initMap(); }); 这个方法等价于 $.ajax({ url: url, dataType: "script", success

JS 动态加载脚本 执行回调[transfer]

JS 动态加载脚本 执行回调 关于在javascript里面加载其它的js文件的问题可能很多人都遇到过,但很多朋友可能并不知道怎么判断我们要加载的js文件是否加载完成,如果没有加载完成我们就调用文件里面的函数是不会成功的.本文讲解怎么在js中加载其它js文件并在加载完成后执行回调函数. 我们可以动态的创建 <script> 元素,然后通过更改它的 src 属性来加载脚本,但是怎么知道这个脚本文件加载完成了呢,因为我们有些函数需要在脚本加载完成生效后才能开始执行. 经过对网络上资源的搜索,我发现

JS 动态加载脚本的4种方法

有时候我们需要动态的加入适合的js,因为有时候不需要将所有的js都加载进来,以来提高效率,但这种方法比较适合单个js文件比较大的情况 如果js文件都比较小,还是一个js好,这样可以减少连接数.下面是4种比较常用的方法,大家可以根据情况选择,最后脚本之家 将会给推荐一个. 1.直接document.write  <script language="javascript"> document.write("<script src='test.js'><

JS 动态加载脚本 执行回调

JS 动态加载脚本  执行回调 关于在javascript里面加载其它的js文件的问题可能很多人都遇到过,但很多朋友可能并不知道怎么判断我们要加载的js文件是否加载完成,如果没有加载完成我们就调用文件里面的函数是不会成功的.本文讲解怎么在js中加载其它js文件并在加载完成后执行回调函数. 我们可以动态的创建 <script> 元素,然后通过更改它的 src 属性来加载脚本,但是怎么知道这个脚本文件加载完成了呢,因为我们有些函数需要在脚本加载完成生效后才能开始执行. 经过对网络上资源的搜索,我发

js动态加载脚本

首先我们需要一个被加载的js文件,我在一个固定文件夹下创建了一个package.js,打开后在里面写一个方法functionOne,很简单,代码如下: [javascript] view plain copy function functionOne(){ alert("成功加载"); } 后面的html文件都创建在同一个目录下. 方法一:直接document.write 在同一个文件夹下面创建一个function1.html,代码如下: [html] view plain copy

判断JS是否加载完成

在正常的加载过程中,js的加载都是同步的,也就是在加载过程中,浏览器会阻塞接下来的内容的加载.这时候我们就要用到动态加载,动态加载是异步的,如果我们在后边要用到这个动态加载的js文件里的东西,就要保证这个文件加载完成后,再执行下面的内容. 如何判断js是否加载完成?(实现loadScript(url,callback)异步加载脚本,完成后执行回调函数,要求支持IE) 我们使用document的readyState属性:document.readyState readyState 属性返回当前文档

页面优化——js异步加载

同步加载 在介绍js异步加载之前,我们先来看看什么是js同步加载.我们平时最常使用的就是这种同步加载形式: <script src="http://XXX.com/script.js"></script> 同步模式,又称阻塞模式,会阻止浏览器的后续处理,停止了后续的解析,因此停止了后续的文件加载(如图像).渲染.代码执行.一般的script标签(不带async等属性)加载时会阻塞浏览器,也就是说,浏览器在下载或执行该js代码块时,后面的标签不会被解析,例如在he

JS异步加载的几种方式

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