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

  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的代码。

 /*

 加载js脚本的一种解决方法。

 by 金色海洋 2013-7-11 

 */

 //1毫秒后开始加载 js文件
window.setTimeout(function() { //判断有无配置信息————没有的话,加载且缓存
//判断有无js文件版本号——没有的话,加载且缓存
//加载Nature.LoadJs.js,开始加载其他js
//判断页面是否有jsReady,如果有则开始调用 //var bootScript = $("script").frist(); //获取标签
//var pageKind = bootScript.attr("pageKind"); //获取标签里的属性 var kind = (typeof pageKind == "string") ? pageKind : "index"; /*默认的网页类型*/ var loads = new loadscript(document); //把本页面作为参数传递进去。因为涉及到复用,所以要new一下。 if (typeof top.Nature == "undefined") {
//没有配置信息,加载。用y_MM_dd_HH作为版本标志,一个小时更新一次。因为可以缓存配置信息,所以不是每次都让浏览器加载
var date = new Date();
var dateVer = date.getYear() + '_' + date.getMonth() + '_' + date.getDate() + '_' + date.getHours(); //加载第一个主程序。分开的目的是为了可以控制更新。
loads.js('/bootLoad.js?rnd=' + dateVer, function () {
Nature.Top.topLoad(loads, kind); //走top页面的流程
});
} else {
//走子页面的流程,把子页面(window)作为参数传递进去,以便于和top页面区分。因为函数是放在top页面里的。
//sonLoad不在子页面里,而是存在于top里,所以要 top.sonLoad
top.Nature.Top.sonLoad(loads, kind, window);
} /*实现动态加载js的函数,来自于互联网,做了一点修改,可以兼容IE10。IE11没测试。
* 写在函数里面,不污染window了。
* 增加加载css的函数
* 原来是静态的,现在改成需要实例化的。
*/
function loadscript(doc) {
this.js = function(url, callback) {
var s = doc.createElement('script');
s.type = "text/javascript";
s.src = url;
s.expires = 1;
load(s, callback);
};
this.css = function (url, callback) {
var l = doc.createElement('link');
l.type = "text/css";
l.rel = "stylesheet";
l.media = "screen";
l.href = url;
//doc.getElementsByTagName('head')[0].appendChild(l);
load(l, callback);
}; function load(s, callback) {
switch (doc.documentMode) {
case 9:
case 10:
case 11:
s.onerror = s.onload = loaded;
break;
default:
s.onreadystatechange = ready;
s.onerror = s.onload = loaded;
break;
}
doc.getElementsByTagName('head')[0].appendChild(s); function ready() { /*IE7.0/IE10.0*/
if (s.readyState == 'loaded' || s.readyState == 'complete') {
if (typeof callback == "function") callback();
}
} function loaded() { /*chrome/IE10.0*/
if (typeof callback == "function") callback();
}
}
} }, 1);

bootLoad.js

 /*

 加载js脚本的一种解决方法。

 by 金色海洋 2013-7-11 

 2014-06-07 移植

 */

 var Nature = {};/* 定义 一个很大的对象 */
Nature.Top = {};/* 加载js用的命名空间 */ /*数据库的设置*/
Nature.WebConfig = {
isShowPeiZhi: true, //页面里是否显示“配置”,程序员编辑时设置为 true。上线后设置为 false
WebappID: 7,
dbid_236Write: "2,4", //统一管理数据连接标识
dbid_236WriteJM: "2,14", //统一管理数据连接标识 dbid_236SysLog: "2,6", //wcf日志数据库 dbid_Loan: "2,13", //快易贷测试数据库
//dbid_Loan: "2,12" //快易贷正式数据库 }; /*ajax的设置*/
Nature.AjaxConfig = {
UrlResource: "http://LCNatureResource.517.cn", /*增删改查服务的网址*/
Urljs: "http://LCNatureResource.517.cn", /*js文件的网址*/
Urlsso: "http://LCNatureService.517.cn", /*单点登录的网址*/
Urlcss: "http://mango-js.517.cn", /*css文件的网址*/ ajaxDataType: "json" /*跨域的时候用jsonp,不用跨域的话用json,cors跨域的话也是json*/
}; Nature.AjaxConfig.UrljsVer = Nature.AjaxConfig.Urljs + "/Scripts/NatureAjax/ver.js", /*存放js文件版本号的网址*/
Nature.AjaxConfig.UrlLoadJs = Nature.AjaxConfig.Urljs + "/Scripts/NatureAjax/Nature.LoadJs.js", /*加载其他js文件的网址*/
Nature.AjaxConfig.UrlAdapter = Nature.AjaxConfig.Urljs + "/Scripts/NatureAjax/Nature.Adapter.js", /*适配的网址*/ /* 复用父页面里的js文件的时候使用。是否使用自己页的js。true:本页加载js文件。false:使用父页的js文件。*/
//Nature.isSelfJs = false; Nature.Top.LoadCss = function(loadCss) {
var cssUrl = Nature.AjaxConfig.Urlcss;
loadCss.css(cssUrl + '/websiteStyle/mangoGlobal.css');
loadCss.css(cssUrl + '/misStyle/misUICss/misStyle/mis-style-p.css');
loadCss.css(cssUrl + '/misStyle/misUICss/misStyle/MisStyle_v2.css');
loadCss.css(cssUrl + '/misStyle/debugCss/css.css');
loadCss.css(Nature.AjaxConfig.UrlResource + '/Scripts/css/css2.css');
}; //外壳页的加载
Nature.Top.topLoad = function(loadscript, kind) {
//判断有无配置信息————没有的话,加载且缓存
//判断有无js文件版本号——没有的话,加载且缓存
//加载Nature.LoadJs.js,开始加载其他js
//判断页面是否有jsReady,如果有则开始调用 /*加载css文件*/
Nature.Top.LoadCss(loadscript); //加载js版本号 var checkCount = 0;
if (typeof Nature.jsVer == "undefined") {
/*加载js文件的版本号,用于更新浏览器的js缓存文件。使用随机数作为参数,保证版本号是最新的。
* 用随机数保证最新,因为可以缓存,所以不是每次访问都会去加载
*/
loadscript.js(top.Nature.AjaxConfig.UrljsVer + '?rnd=' + Math.random(), function() { //
loadOtherJs();
});
} else {
loadOtherJs();
} //加载Nature.LoadJs
function loadOtherJs() {
/*得到了版本号,加载LoadJs.js,该文件加载其他需要的js文件*/
loadscript.js(top.Nature.AjaxConfig.UrlLoadJs + Nature.jsVer, function () {
var loadJs = new Nature.loadFile(document);
loadJs.startLoadJs(kind, checkReady);
});
} /*检查页面是否有jsReady */
function checkReady() {
if (typeof jsReady == "function") {
//执行页面里的函数
jsReady();
} else {
//检查次数,尝试十次,超了就不玩了,避免死循环。*/
if (checkCount < 10) {
checkCount++;
setTimeout(checkReady, 50);
}
}
} }; //子页的加载
Nature.Top.sonLoad = function(loadscript, kind, win) {
var checkCount = 0; top.Nature.Top.LoadCss(loadscript);
win.Nature = {}; loadscript.js(top.Nature.AjaxConfig.UrlAdapter + top.Nature.jsVer, function () {
win.Nature.Adapter(win);
checkReady();
}); /*检查页面是否有jsReady */
function checkReady() {
if (typeof win.jsReady == "function") {
//执行页面里的函数
win.jsReady();
} else {
//检查次数,尝试十次,超了就不玩了,避免死循环。*/
if (checkCount < 10) {
checkCount++;
setTimeout(checkReady, 50);
}
}
}
};

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

js的动态加载、缓存、更新以及复用(四)的更多相关文章

  1. js插件动态加载js、css解决方案

    最近因为工作需要做了一个js自动导入的插件,一开始很天真的以为动态创建个script添加到head中就ok了,试了之后才发现了问题,就是如果同时引入了多个js文件,而且后一个文件中用到了前一个文件中的 ...

  2. js实现动态加载脚本的方法实例汇总

      本文实例讲述了js实现动态加载脚本的方法.分享给大家供大家参考,具体如下: 最近公司的前端地图产品需要做一下模块划分,希望用户用到哪一块的功能再加载哪一块的模块,这样可以提高用户体验. 所以到处查 ...

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

    使用范围: OA.MIS.ERP等信息管理类的项目,暂时不考虑网站. 遇到的问题: 完成一个项目,往往需要引用很多js文件,比如jQuery.js.easyUI等.还有自己写的一些列js文件,那么这些 ...

  4. js的动态加载、缓存、更新以及复用

    使用范围: OA.MIS.ERP等信息管理类的项目,暂时不考虑网站. 遇到的问题: 完成一个项目,往往需要引用很多js文件,比如jQuery.js.easyUI等.还有自己写的一些列js文件,那么这些 ...

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

    总体思路 1.  建立一个js服务,该服务实现通用js文件的加载.依赖.缓存.更新以及复用. 2.  各个项目如果使用通用js,可(bi)以(xu)使用js服务实现加载. 3.  Js服务只提供通用的 ...

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

    上一篇发出来后得到了很多回复,在此首先感谢大家的热情捧场!有的推荐第三方框架,比如 In.js.requrieJS.sea.js.lab.js等.这个开阔了眼界,以前只知道sea.js,省去了自己搜索 ...

  7. Ext JS 如何动态加载JavaScript创建窗体

    JavaScript不需要编译即可运行,这让JavaScript构建的应用程序可以变得很灵活.我们可以根据需要动态从服务器加载JavaScript脚本来创建和控制UI来与用户交互.下面结合Ext JS ...

  8. js怎么动态加载js文件(JavaScript性能优化篇)

    下面介绍一种JS代码优化的一个小技巧,通过动态加载引入js外部文件来提高网页加载速度 [基本优化] 将所有需要的<script>标签都放在</body>之前,确保脚本执行之前完 ...

  9. 篇一:js中动态加载---append

    之前是一行代码,不能动态加载,新的需求要动态加载,使用append $('#Order_information').append(' <div class="single_produc ...

随机推荐

  1. 一直都在说反射很有用 谈谈大型.NET ERP系统有哪些地方用到了反射

    反射Reflection,MFC时代叫RTTI(Runtime Type Identification) 运行时类型识别,提供一种动态创建对象的能力. 这里不谈反射的概念和基本用法,仅仅就我遇到的ER ...

  2. springMVC robots.txt 处理

    正常情况这样就好使 <mvc:resources mapping="/robots.txt" location="/lib/robots.txt"/> ...

  3. ObjectOutputStream和ObjectInputStream

    官方解释: ObjectOutputStream 将 Java 对象的基本数据类型和图形写入 OutputStream.可以使用 ObjectInputStream 读取(重构)对象.通过使用流中的文 ...

  4. poj 1950 Dessert(dfs枚举,模拟运算过程)

    /* 这个代码运行的时间长主要是因为每次枚举之后都要重新计算一下和的值! 如果要快的话,应该在dfs,也就是枚举的过程中计算出前边的数值(这种方法见第二个代码),直到最后,这样不必每一次枚举都要从头再 ...

  5. Lua 学习笔记(二)语法、类型、值

    首先Lua执行的每一段代码都称之为“程序块”,一个程序块也就是一连串的语句或命令,例如一个源码文件或一行代码.Lua语句之间并不需要分隔符,如代码中的换行就不起任何作用,当然为了养成编码习惯当两条或者 ...

  6. 使用ab进行页面的压力测试

    ab是apache自带的一个很好用的压力测试工具,当安装完apache的时候,就可以在bin下面找到ab 参数说明及示例 我们可以模拟100个并发用户,对一个页面发送1000个请求 输入命令:ab - ...

  7. [转载]"百度方法+"案例—从持续集成到持续交付

    前言 百度开放云(https://bce.baidu.com)是百度基于十五年基础架构核心技术积累推出的云服务,目前推出了14个云计算产品和9个大数据产品,并提供数字营销云.在线教育.物联网等10种解 ...

  8. 使用 CSS3 动画实现的 3D 图片过渡特效

    这是一个基于 CSS3 动画实现的图片过渡效果,共有 Flip.Rotation.Multi-flip.Cube.Unfold 等6种效果,它们将证明 CSS3 Transform 和 Transit ...

  9. Linux菜鸟级重点

    这是本人自学Linux所做的笔记,以及实现一些功能作的总结.乐意与各位喜欢linux的朋友交流学习,共同进步.这篇文章只是简单介绍一些linux比较常用的或者说是最基础的也是最重要的知识,有些在模块后 ...

  10. J2EE修炼之四书五经[转自2004年程序员]

    J2EE修炼之四书五经 作者:彭晨阳 J2EE其实没有四书五经,因为J2EE一直如汹涌澎湃的大江,推陈出新,不断高速发展,这是一种带领我们走向未来的技术.当然,如何在这种气势如虹的潮流之中不至于迷失方 ...