详细的谈labjs动态加载JS文件的需求
简单的例子
为实验室
。脚本(写js
块(函数(){())
对于所有等待加载,然后做某事
script1func();
script2func();
script3func();
});
介绍了几种labjs。
例1:
为实验室
。脚本(写js )
。脚本(script2 .js)
。脚本(script3 .js)
等待(函数(脚本))等待所有加载端执行此代码块
script1func();
script2func();
script3func();
});
例2:
为实验室
。脚本({ SRC:写js
。脚本(script2 .js)
。脚本(script3 .js)
等待(函数(脚本))等待所有加载端执行此代码块
script1func();
script2func();
script3func();
});
例3:
为实验室
。脚本(写js
等待(函数(脚本))等待所有加载端执行此代码块
script1func();
script2func();
script3func();
});
例4:
为实验室
。脚本({写js
等待(函数(脚本))等待所有加载端执行此代码块
script1func();
script2func();
script3func();
});
例5:
为实验室
。脚本(写js)(等)(等待) / /空请写在其他代码执行
。脚本(script2 .js) / / script2和script3取决于写
。脚本(script3 .js)(等) / /但script2和script3不互相依赖,可以下载并行
。脚本(script4 .js) / / script4取决于笔写,script2和script3
等(功能(){ script4func()();});
例6:
为实验室
。脚本(写js ) / /写,script2,并不依赖于script3,
。脚本(script2 .js),可以以任何顺序执行。
。脚本(script3 .js)
等待(函数())如果需要,当然可以在这里执行Javascript函数。
警报()脚本1-3加载!;
})
。脚本(script4 .js) / /在写,script2和script3
等(功能(){ script4func()();});
例7:
为实验室
。setOptions({ alwayspreserveorder:true}) / /等集之间的每个脚本
。脚本(写js ) / /写,script2,script3,script4彼此依靠
。脚本(script2 .js)和序贯 / /下载并行执行
。脚本(script3 .js)
。脚本(script4 .js)
等(功能(){ script4func()();});
例8:
为实验室
脚本(函数()){()
对` _is_ie ` / / IE的真正价值,非IE错误
如果(_is_ie){
返回ie.js ; / /如果IE的JS将装
}
{其他
如果没有返回该代码,则跳过该代码。
}
})
。脚本(写js )
等等();
labjs加载模式
在labjs动态加载脚本文件是指外部JS加载通过多种方式在JS脚本被执行,这是不同于HTML页面。
动态加载脚本有很多种方法。优点和缺点是不同的。这里没有细节,感兴趣的童鞋们可以在本文的结尾看到参考链接。
有三个主要的技术用于labjs,这是脚本元素,XHR注入,和缓存的把戏
首先,简要介绍了三种加载方式,重新分析和第四部分的labjs源代码在三前的使用方式。
脚本元素(labjs默认加载模式)
脚本最常见的动态加载方法有很多优点,包括:1、实现简单的2、跨域3、不阻塞其他资源加载等。
Opera(Firefox):脚本的执行顺序与插入到页面中的节点的顺序一致。
在IE浏览器下:无法保证执行顺序
小心 uff1a
Firefox的新版本下,脚本的执行顺序并不一定与插入页面顺序一致,但它可以通过设置脚本标签async属性为false,顺序执行。
Chrome的旧版本下,执行顺序并不一定与插入页面顺序一致,但它可以通过设置脚本标签async属性为false,顺序执行。
XHR注入
脚本文件通过Ajax请求加载,然后按以下方式执行:
评价:常用的方法
XHR注入:创建一个脚本元素注入所加载的脚本文件的内容
主要限制:无交叉域
缓存技巧(强烈依赖于基于浏览器的特性,不推荐)
当你的脚本元素值,浏览器不知道类型的属性,如文本/缓存,文本/卡斯珀,文本/ hellworld,等,不同的浏览器的行为如下:
IE、Safari、Chrome(旧版):剧本也装,但不执行,假设没有浏览器缓存被禁用,脚本将被加载时,浏览器缓存,当需要时,只需要创建一个脚本标签,类型会被设置为正确的值,指向SRC之前所请求的文件的URL(相当于读取缓存文件)
Opera:Firefox:没有加载
备注:uff1a
根据基于浏览器的特性实现,浏览器的功能实现可能会失败,不推荐使用。
Chrome浏览器的新版本将脚本元素的类型设置为非文本/ Javascript,并且不再加载脚本文件。
该脚本加载在LABjs审判
忽略技术细节和描述的实施在labjs通过一段伪代码,大约:
首先,判断脚本是否被预加载(预加载条件是否被预先加载以查看伪代码注释);
如果我们预先加载,我们将决定浏览器是否支持真正的预加载。如果我们支持真正的预紧力,我们预先加载它。如果没有,则判断脚本是否与当前页的域相同。如果我们使用XHR注入,如果没有,使用缓存的把戏。
如果你没有预紧力,它是决定浏览器支不支持脚本元素async属性(见伪代码注释)。如果是这样,设置async属性和请求的脚本文件。如果没有,则直接通过脚本元素加载脚本文件。
如果(ifpreloadscript){ / /请求时预加载脚本文件:1, 2、浏览器支持需要预加载预压
如果(supportrealpreloading){ / /如果支持房预加载
如果(supportpreloadpropnatively){ / /支持通过设置脚本标签的预紧力属性,脚本和预加载,加载和执行的分离
/ /尼古拉斯C. zakas大神的愿望,没有浏览器支持: / / /博客2011 02 / 14 / / Javascript的下载和执行的分离
script.onpreload =回调;
script.newpreload =真;
script.src = targeturl;
其他{ }
script.onreadystatechange =回调; / /实际上指的是IE浏览器,指定脚本元素的src属性,IE浏览器立即加载
script.src = targeturl; / /脚本元素甚至没有进入页面,回调是预加载后回调
}
}
如果(insamedomain){ / /非跨域,使用XHR注:在相同的域与当前页请求
XHR =新(XMLHttpRequest); / /由于判断IE已经在条件分支无情地抛弃,所以大胆新(XMLHttpRequest)。
xhr.onreadystatechange =回调;
Xhr.open(
Xhr.send();
}
别的{ / /最无奈的搬家后,缓存的把戏,chromei新版本不支持
script.onload =回调;
script.type =中/缓存;
script.src = targeturl;
}
其他{ }
如果(cancontrlexecutionorderbyasync){ / /如果可以通过脚本元素的异步属性并行加载脚本的执行力
/ /凯尔的建议推动现在由HTML5组接受并投入稿: / dynamic_script_execution_order # my_solution
script.onload =回调;
script.async = false; / /脚本元素异步错误,脚本可以保证执行命令和请求顺序一致
script.src = targeturl;
}
别的{
script.onload =回调;
script.src = targeturl;
}
}
事实上,当你创建的网页上,点到一个脚本文件的IMG SRC节点,它也可以发挥在某些浏览器文件预压的作用。是labjs不知道这个作者吗