免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1451 | 回复: 0
打印 上一主题 下一主题

异步脚本加载 JS Loader [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-12-21 08:44 |只看该作者 |倒序浏览
偷懒,将别人的东西直接贴过来吧,文章来自http://foxling.org/js-ajax-dom/async-loading-js/

---------------------------分割线

JS会阻塞其它页面资源的下载,通过对JS的异步加载可以解决这个问题,加快页面内容的呈现速度。获得更好的体验。

使用script标签加载 通过firebug查看各种资源加载状态,当test.js下载完毕后,图片才开始下载。

通过firebug查看各种资源加载状态,当test.js下载完毕后,图片才开始下载。

猛击测试页面block.html

使用JSLoader异步加载JS

当使用异步加载方式加载JS时,test.js与图片同时加载,加快了页面的呈现:

猛击测试页面js-loader

JSLoader

JSLoader.load(url, [fun1], [funN]);
参数:
url 要加载的JS的地址
fun 依赖该JS执行的函数

使用示例:

  1. JSLoader.load('test.js', function(){
  2.     document.getElementById('test').innerHTML = test;
  3. });

猛击这里下载JSLoader.js

JSLoader源码:

  1. var JSLoader = function(){

  2.     var scripts = {};

  3.     function getScript(url){
  4.         var script = scripts[url];
  5.         if (!script){
  6.             script = {loaded:false, funs:[]};
  7.             scripts[url] = script;
  8.             add(script, url);
  9.         }
  10.         return script;
  11.     }

  12.     function run(script){
  13.         var funs = script.funs,
  14.             len = funs.length,
  15.             i = 0;

  16.         for (; i < len; i++){
  17.             var fun = funs.pop();
  18.             fun();
  19.         }
  20.     }

  21.     function add(script, url){
  22.         var scriptdom = document.createElement('script');
  23.         scriptdom.type = 'text/javascript';
  24.         scriptdom.loaded = false;
  25.         scriptdom.src = url;

  26.         scriptdom.onload = function(){
  27.             scriptdom.loaded = true;
  28.             run(script);
  29.             scriptdom.onload = scriptdom.onreadystatechange = null;
  30.         };

  31.         //for ie
  32.         scriptdom.onreadystatechange = function(){
  33.             if ((scriptdom.readyState === 'loaded' ||
  34.                     scriptdom.readyState === 'complete') && !scriptdom.loaded) {

  35.                 run(script);
  36.                 scriptdom.onload = scriptdom.onreadystatechange = null;
  37.             }
  38.         };

  39.         document.getElementsByTagName('head')[0].appendChild(scriptdom);
  40.     }

  41.     return {
  42.         load: function(url){
  43.             var arg = arguments,
  44.                 len = arg.length,
  45.                 i = 1,
  46.                 script = getScript(url),
  47.                 loaded = script.loaded;

  48.             for (; i < len; i++){
  49.                 var fun = arg[i];
  50.                 if (typeof fun === 'function'){
  51.                     if (loaded) {
  52.                         fun();
  53.                     }else{
  54.                         script.funs.push(fun);
  55.                     }
  56.                 }
  57.             }
  58.         }
  59.     };
  60. }();

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP