js的动态加载、缓存、更新以及复用(四)

 

  本来想一气呵成,把加载的过程都写了,但是卡着呢,所以只好在分成两份了。

 

  1、页面里使用<script>来加载 boot.js 。

  2、然后在boot.js里面动态加载 bootLoad.js。以时间作为标识 var dateVer = date.getYear() + '_' + date.getMonth() + '_' + date.getDate() + '_' + date.getHours(); 这样可以保证一小时内肯定会被更新。同时也避免了每次都去更新。

  3、boot.js里面根据情况调用 bootLoad.js里提供的函数。目的是为了把有可能变化的都放在 bootLoad.js 里面以便于能够控制更新。

  4、如果是top页面,则调用bootLoad.js里的Nature.Top.topLoad(loads, kind); ;如果是子页面则调用 top.Nature.Top.sonLoad(loads, kind,window);  进行后续处理。

  5、topLoad(),首先获取最新的版本号,然后加载Nature.LoadJs.js,实现其他js的文件的加载。如果js文件有更新,那么获取的最新版本号就会发生变化,这样就可以实现js文件的及时更新了

  6、sonLoad()则会加载Nature.Adapter.js,实现复用,就是让子页面可以调用top页面里的js。

 

  简单的说呢就是这样。详细说的话还有很多细节。目前boot.js基本稳定。bootLoad.js也差不多了。Nature.LoadJs.js还需要在改一改。以前写的太乱了。

 

 

boot.js的代码。

 1 /*
 2 
 3 加载js脚本的一种解决方法。
 4 
 5 by 金色海洋 2013-7-11 
 6 
 7 */
 8 
 9 //1毫秒后开始加载 js文件 
10 window.setTimeout(function() {
11 
12     //判断有无配置信息————没有的话,加载且缓存
13     //判断有无js文件版本号——没有的话,加载且缓存
14     //加载Nature.LoadJs.js,开始加载其他js
15     //判断页面是否有jsReady,如果有则开始调用
16 
17     //var bootScript = $("script").frist(); //获取标签
18     //var pageKind = bootScript.attr("pageKind"); //获取标签里的属性
19 
20     var kind = (typeof pageKind == "string") ? pageKind : "index"; /*默认的网页类型*/
21 
22     var loads = new loadscript(document);       //把本页面作为参数传递进去。因为涉及到复用,所以要new一下。
23 
24     if (typeof top.Nature == "undefined") {
25         //没有配置信息,加载。用y_MM_dd_HH作为版本标志,一个小时更新一次。因为可以缓存配置信息,所以不是每次都让浏览器加载
26         var date = new Date();
27         var dateVer = date.getYear() + '_' + date.getMonth() + '_' + date.getDate() + '_' + date.getHours();
28         
29         //加载第一个主程序。分开的目的是为了可以控制更新。
30         loads.js('/bootLoad.js?rnd=' + dateVer, function () {
31             Nature.Top.topLoad(loads, kind);   //走top页面的流程
32         });
33     } else {
34         //走子页面的流程,把子页面(window)作为参数传递进去,以便于和top页面区分。因为函数是放在top页面里的。
35         //sonLoad不在子页面里,而是存在于top里,所以要 top.sonLoad
36         top.Nature.Top.sonLoad(loads, kind, window);
37     }
38 
39 
40     /*实现动态加载js的函数,来自于互联网,做了一点修改,可以兼容IE10。IE11没测试。
41     * 写在函数里面,不污染window了。
42     * 增加加载css的函数
43     * 原来是静态的,现在改成需要实例化的。
44     */
45     function loadscript(doc) {
46         this.js = function(url, callback) {
47             var s = doc.createElement('script');
48             s.type = "text/javascript";
49             s.src = url;
50             s.expires = 1;
51             load(s, callback);
52         };
53         this.css = function (url, callback) {
54             var l = doc.createElement('link');
55             l.type = "text/css";
56             l.rel = "stylesheet";
57             l.media = "screen";
58             l.href = url;
59             //doc.getElementsByTagName('head')[0].appendChild(l);
60             load(l, callback);
61         };
62 
63         function load(s, callback) {
64             switch (doc.documentMode) {
65             case 9:
66             case 10:
67             case 11:
68                 s.onerror = s.onload = loaded;
69                 break;
70             default:
71                 s.onreadystatechange = ready;
72                 s.onerror = s.onload = loaded;
73                 break;
74             }
75             doc.getElementsByTagName('head')[0].appendChild(s);
76 
77             function ready() { /*IE7.0/IE10.0*/
78                 if (s.readyState == 'loaded' || s.readyState == 'complete') {
79                     if (typeof callback == "function") callback();
80                 }
81             }
82 
83             function loaded() { /*chrome/IE10.0*/
84                 if (typeof callback == "function") callback();
85             }
86         }
87     }
88 
89 }, 1);

 

bootLoad.js

  1 /*
  2 
  3 加载js脚本的一种解决方法。
  4 
  5 by 金色海洋 2013-7-11 
  6 
  7 2014-06-07 移植
  8 
  9 */
 10  
 11 var Nature = {};/* 定义 一个很大的对象 */
 12 Nature.Top = {};/* 加载js用的命名空间 */
 13 
 14 /*数据库的设置*/
 15 Nature.WebConfig = {
 16     isShowPeiZhi: true,         //页面里是否显示“配置”,程序员编辑时设置为 true。上线后设置为 false
 17     WebappID: 7,
 18     dbid_236Write: "2,4",       //统一管理数据连接标识
 19     dbid_236WriteJM: "2,14",    //统一管理数据连接标识
 20 
 21     dbid_236SysLog: "2,6",       //wcf日志数据库
 22 
 23     dbid_Loan: "2,13",       //快易贷测试数据库
 24     //dbid_Loan: "2,12"        //快易贷正式数据库
 25 
 26 };
 27 
 28 /*ajax的设置*/
 29 Nature.AjaxConfig = {
 30     UrlResource:    "http://LCNatureResource.517.cn",  /*增删改查服务的网址*/
 31     Urljs:          "http://LCNatureResource.517.cn",  /*js文件的网址*/
 32     Urlsso:         "http://LCNatureService.517.cn",   /*单点登录的网址*/
 33     Urlcss:         "http://mango-js.517.cn",          /*css文件的网址*/
 34     
 35     ajaxDataType: "json"                            /*跨域的时候用jsonp,不用跨域的话用json,cors跨域的话也是json*/
 36 };
 37 
 38 Nature.AjaxConfig.UrljsVer   = Nature.AjaxConfig.Urljs + "/Scripts/NatureAjax/ver.js",  /*存放js文件版本号的网址*/
 39 Nature.AjaxConfig.UrlLoadJs  = Nature.AjaxConfig.Urljs + "/Scripts/NatureAjax/Nature.LoadJs.js", /*加载其他js文件的网址*/
 40 Nature.AjaxConfig.UrlAdapter = Nature.AjaxConfig.Urljs + "/Scripts/NatureAjax/Nature.Adapter.js", /*适配的网址*/
 41 
 42 
 43 /* 复用父页面里的js文件的时候使用。是否使用自己页的js。true:本页加载js文件。false:使用父页的js文件。*/
 44 //Nature.isSelfJs = false;
 45 
 46 Nature.Top.LoadCss = function(loadCss) {
 47     var cssUrl = Nature.AjaxConfig.Urlcss;
 48     loadCss.css(cssUrl + '/websiteStyle/mangoGlobal.css');
 49     loadCss.css(cssUrl + '/misStyle/misUICss/misStyle/mis-style-p.css');
 50     loadCss.css(cssUrl + '/misStyle/misUICss/misStyle/MisStyle_v2.css');
 51     loadCss.css(cssUrl + '/misStyle/debugCss/css.css');
 52     loadCss.css(Nature.AjaxConfig.UrlResource + '/Scripts/css/css2.css');
 53 };
 54 
 55 //外壳页的加载
 56 Nature.Top.topLoad = function(loadscript, kind) {
 57     //判断有无配置信息————没有的话,加载且缓存      
 58     //判断有无js文件版本号——没有的话,加载且缓存  
 59     //加载Nature.LoadJs.js,开始加载其他js
 60     //判断页面是否有jsReady,如果有则开始调用
 61 
 62     /*加载css文件*/
 63     Nature.Top.LoadCss(loadscript);
 64     
 65     //加载js版本号
 66     
 67     var checkCount = 0;
 68     if (typeof Nature.jsVer == "undefined") {
 69         /*加载js文件的版本号,用于更新浏览器的js缓存文件。使用随机数作为参数,保证版本号是最新的。
 70         * 用随机数保证最新,因为可以缓存,所以不是每次访问都会去加载
 71         */
 72         loadscript.js(top.Nature.AjaxConfig.UrljsVer + '?rnd=' + Math.random(), function() { // 
 73             loadOtherJs();
 74         });
 75     } else {
 76         loadOtherJs();
 77     }
 78 
 79     //加载Nature.LoadJs
 80     function loadOtherJs() {
 81         /*得到了版本号,加载LoadJs.js,该文件加载其他需要的js文件*/
 82         loadscript.js(top.Nature.AjaxConfig.UrlLoadJs + Nature.jsVer, function () {
 83             var loadJs = new Nature.loadFile(document);
 84             loadJs.startLoadJs(kind, checkReady);
 85         });
 86     }
 87 
 88     /*检查页面是否有jsReady */
 89     function checkReady() {
 90         if (typeof jsReady == "function") {
 91             //执行页面里的函数
 92             jsReady();
 93         } else {
 94             //检查次数,尝试十次,超了就不玩了,避免死循环。*/
 95             if (checkCount < 10) {
 96                 checkCount++;
 97                 setTimeout(checkReady, 50);
 98             }
 99         }
100     }
101 
102 };
103 
104 //子页的加载
105 Nature.Top.sonLoad = function(loadscript, kind, win) {
106     var checkCount = 0;
107 
108     top.Nature.Top.LoadCss(loadscript);
109     win.Nature = {};
110     
111     loadscript.js(top.Nature.AjaxConfig.UrlAdapter + top.Nature.jsVer, function () {
112         win.Nature.Adapter(win);
113         checkReady();
114     });
115    
116     /*检查页面是否有jsReady */
117     function checkReady() {
118         if (typeof win.jsReady == "function") {
119             //执行页面里的函数
120             win.jsReady();
121         } else {
122             //检查次数,尝试十次,超了就不玩了,避免死循环。*/
123             if (checkCount < 10) {
124                 checkCount++;
125                 setTimeout(checkReady, 50);
126             }
127         }
128     }
129 };
130   

 

 

下次就是 Nature.LoadJs.js 的介绍了。

 

 

转载于:https://www.cnblogs.com/jyk/p/3800896.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/407649.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Webpack基础之输出

输出(Output) output 选项控制 webpack 如何向硬盘写入编译文件。注意&#xff0c;即使可以存在多个入口起点&#xff0c;但只指定一个输出配置 用法(Usage)&#xff1a; 在 webpack 中配置 output 属性的最低要求是&#xff0c;将它的值设置为一个对象&#xff0c;包括以下…

[見好就收]NET 2.0 - WinForm Control - DataGridView 编程36计

原文:http://blog.csdn.net/fangxinggood/archive/2007/04/11/1561011.aspx#A1NET 2.0 - WinForm Control - DataGridView 编程36计&#xff08;一&#xff09;目录&#xff1a; ① 取得或者修改当前单元格的内容 ② 设定单元格只读 ③ 不显示最下面的新行 ④ 判断新增行 ⑤…

Webpack基础之加载器

加载器(Loaders)&#xff1a; loader 是对应用程序中资源文件进行转换。它们是&#xff08;运行在 Node.js 中的&#xff09;函数&#xff0c;可以将资源文件作为参数的来源&#xff0c;然后返回新的资源文件 示例&#xff1a; 例如&#xff0c;你可以使用 loader 告诉 webp…

历届试题 兰顿蚂蚁

http://lx.lanqiao.org/problem.page?gpidT125 历届试题 兰顿蚂蚁 时间限制&#xff1a;1.0s 内存限制&#xff1a;256.0MB问题描述兰顿蚂蚁&#xff0c;是于1986年&#xff0c;由克里斯兰顿提出来的&#xff0c;属于细胞自动机的一种。平面上的正方形格子被填上黑色或白色…

【转】基于XML-RPC的BloggerAPI学习

Luliang的mail2blog脚本&#xff0c;通过基于XML-RPC的BloggerAPI来实现的发布blog的功能。BloggerAPI是一套程序接口&#xff0c;用以支持远程操作blog.这个规范现在的版本是1.0&#xff0c;是个试验版本和α版本。但是&#xff0c;规范的研发人员不再对BloggerAPI进一步地开发…

Webpack基础之插件

插件(Plugins)&#xff1a; 插件是 wepback 的支柱功能。在你使用 webpack 配置时&#xff0c;webpack 自身也构建于同样的插件系统上&#xff01; 插件目的在于解决 loader 无法实现的其他事 剖析&#xff1a; webpack 插件是一个具有 apply 属性的 JavaScript 对象。 app…

Flex布局实战篇

网格布局&#xff1a; 1.基本网格布局&#xff1a; 最简单的网格布局&#xff0c;就是平均分布。在容器里面平均分配空间&#xff0c;只是需要设置项目的自动缩放 HTML代码如下 CSS代码如下 因为每个网格都已经设置好了固定的百分比空间&#xff0c;唯一要做的就是给…

javascript学习系列(2):数组中的filter方法

最好的种树是十年前,其次是现在。歌谣 每天一个前端小知识 提醒你改好好学习了 知乎博主 csdn博主 b站博主 放弃很容易但是坚持一定很酷 我是歌谣 喜欢就一键三连咯 你得点赞是对歌谣最大的鼓励 1前言 在我们的日常开发中 不免会有很多需要处理数据的方法 本节主要说一说f…

写JQuery 插件 什么?你还不会写JQuery 插件

http://www.cnblogs.com/Leo_wl/p/3409083.html 前言   如今做web开发&#xff0c;jquery 几乎是必不可少的&#xff0c;就连vs神器在2010版本开始将Jquery 及ui 内置web项目里了。至于使用jquery好处这里就不再赘述了&#xff0c;用过的都知道。今天我们来讨论下jquery的插件…

stylus之选择器(Selectors)

选择器(Selectors)&#xff1a; 缩排&#xff1a; Stylus的空格有重要的意义&#xff0c;我们使用缩排和凹排代替花括号”{“以及”}” 上面代码就对应于 如果你喜欢&#xff0c;你可以把冒号加上&#xff0c;用做分隔&#xff0c;便于阅读 规则集: Stylus就跟CSS一…

委托模型和事件模型 [C#]

1. 多播委托与委托有关的语法&#xff1a; 定义委托&#xff1a;<modifiers> delegate <return_type> <delegate_name> (<argument_list>)public delegate void Message() ;创建委托实例&#xff1a;<delegate_type> <name> new <d…

javascript学习系列(3):数组中的foreach方法

最好的种树是十年前,其次是现在。歌谣 每天一个前端小知识 提醒你改好好学习了 知乎博主 csdn博主 b站博主 放弃很容易但是坚持一定很酷 我是歌谣 喜欢就一键三连咯 你得点赞是对歌谣最大的鼓励 1前言 在我们的日常开发中 不免会有很多需要处理数据的方法 本节主要说一说f…

stylus之变量(Variables)

变量(Variables)&#xff1a; 变量&#xff1a; 我们可以指定表达式为变量&#xff0c;然后在我们的样式中贯穿使用 编译为 变量甚至可以组成一个表达式列表 标识符&#xff08;变量名&#xff0c;函数等&#xff09;&#xff0c;也可能包括$字符 属性查找&#…

你还不会ant design中的拖拽table实现吗

最好的种树是十年前,其次是现在。歌谣 每天一个前端小知识 提醒你改好好学习了 知乎博主 csdn博主 b站博主 放弃很容易但是坚持一定很酷 我是歌谣 喜欢就一键三连咯 你得点赞是对歌谣最大的鼓励 微信公众号关注小歌谣 前言 首先刚开始知道要书写一个这样的功能我的内心是比…

Sharepoint的文档库用资源管理器方式浏览报错“Explorer View ”解决方案。

最近在安装Wss3.0时候&#xff0c;在拷贝已存在资料到客户电脑上时&#xff0c;打开客户的文档库的资源管理器的时候&#xff0c;提示Explorer view 错误&#xff0c;而且客户端访问的时候也报错。 在经过N多的查询和搜索之后终于找到的了解决方法。原来如此http://207.46.19.1…

stylus之插值(Interpolation)

插值(Interpolation)&#xff1a; 插值&#xff1a; Stylus支持通过使用{}字符包围表达式来插入值&#xff0c;其会变成标识符的一部分。例如&#xff0c;-webkit-{‘border’ ‘-radius’}等同于-webkit-border-radius 比较好的例子就是私有前缀属性扩展 变身 选择器…

iOS 两个tableview的 瀑布流

iOS 两个tableview的 瀑布流1. [代码]Objective-C //// DocViewController.m// getrightbutton//// Created by 隋文涛 on 12-12-9.// Copyright (c) 2012年 隋文涛. All rights reserved.//#import "DocViewController.h"#define heightofimage(image) imag…

javascript学习系列(4):数组中的some方法

最好的种树是十年前,其次是现在。歌谣 每天一个前端小知识 提醒你改好好学习了 知乎博主 csdn博主 b站博主 放弃很容易但是坚持一定很酷 我是歌谣 喜欢就一键三连咯 你得点赞是对歌谣最大的鼓励 1前言 在我们的日常开发中 不免会有很多需要处理数据的方法 本节主要说一说s…

stylus之运算符(Operators)

运算符(Operators): 运算符优先级: 下表运算符优先级&#xff0c;从最高到最低 一元运算符: 以下一元运算符可用”!”,”not”,”-“,””以及”~” 逻辑运算符not的优先级较低&#xff0c;因此&#xff0c;下面这个例子可以替换 用 二元运算符: 下标运算符[]允…

javascript学习系列(5):数组中的reduce方法

最好的种树是十年前,其次是现在。歌谣 每天一个前端小知识 提醒你改好好学习了 知乎博主 csdn博主 b站博主 放弃很容易但是坚持一定很酷 我是歌谣 喜欢就一键三连咯 你得点赞是对歌谣最大的鼓励 1前言 在我们的日常开发中 不免会有很多需要处理数据的方法 本节主要说一说f…