javascript preload&lazy load


Posted in Javascript onMay 13, 2010
(function($) { 
(function($) { 
$.preload = function(data, cfg) { 
return new Loader(data, cfg); 
}; 
var maps = {}, on = $.event.add, un = $.event.remove, head = document.getElementsByTagName('head')[0], body = 
document.body, bs = $.browser, ie = bs.msie, webkit = bs.webkit, gecko = bs.mozilla, space = 1000, ajax = 
$.ajax, 
loaders = $.preload.loaders = { 
'js' : function(url, callback, timeout, defer) { 
var s, timer; 
if (defer) { 
if (ie) { 
return loaders.img(url, callback, timeout); 
} else { 
s = document.createElement('object'); 
s.data = url; 
s.width = s.height = 0; 
} 
} else { 
s = document.createElement('script'); 
s.setAttribute('type', 'text/javascript'); 
s.setAttribute('src', url); 
} 
function f() { 
if (timer) 
clearTimeout(timer); 
s.onreadystatechange = s.onload = s.onerror = null; 
callback(url, false); 
} 
if (ie) { 
s.onreadystatechange = function() { 
if (this.readyState === 'loaded' || this.readyState === 'complete') { 
if (timer) 
clearTimeout(timer); 
s.onreadystatechange = null; 
callback(url, true); 
} 
}; 
} else { 
s.onload = function() { 
if (timer) 
clearTimeout(timer); 
s.onload = s.onerror = null; 
callback(url, true); 
}; 
s.onerror = f; 
} 
timer = setTimeout(f, timeout); 
body.appendChild(s); 
}, 
'css' : function(url, callback, timeout, defer) { 
if (defer) { 
return loaders.js(url, callback, timeout, defer); 
} 
var s = document.createElement('link'), timer; 
s.setAttribute('rel', 'stylesheet'); 
s.setAttribute('type', 'text/css'); 
s.setAttribute('href', url); 
function f() { 
if (timer) 
clearTimeout(timer); 
s.onreadystatechange = s.onload = s.onerror = null; 
callback(url, false); 
} 
if (ie) { 
s.onreadystatechange = function() { 
if (this.readyState === 'loaded' || this.readyState === 'complete') { 
if (timer) 
clearTimeout(timer); 
s.onreadystatechange = null; 
callback(url, true); 
} 
}; 
timer = setTimeout(f, timeout); 
} else if (webkit || gecko) { 
timer = new Date(); 
function f() { 
if (('sheet' in s) && ('cssRules' in s.sheet)) { 
try { 
callback(url, !!s.sheet.cssRules[0]); 
} catch (e) { 
setTimeout(f, space); 
} 
} else if (new Date() - timer > timeout) { 
callback(url, false); 
} else { 
setTimeout(f, space); 
} 
} 
setTimeout(f, space * 2); 
} else { 
s.onload = function() { 
if (timer) 
clearTimeout(timer); 
s.onload = s.onerror = null; 
callback(url, true); 
}; 
s.onerror = f; 
timer = setTimeout(f, timeout); 
} 
head.appendChild(s); 
}, 
'img' : function(url, callback, timeout) { 
var s = new Image(), timer; 
function f() { 
if (timer) 
clearTimeout(timer); 
s.onload = s.onerror = null; 
callback(url, false); 
} 
s.onload = function() { 
if (timer) 
clearTimeout(timer); 
s.onload = s.onerror = null; 
callback(url, true); 
}; 
s.onerror = f; 
timer = setTimeout(f, timeout); 
s.src = url; 
}, 
'ajax' : function(url, callback, cfg) { 
cfg = cfg || {}; 
cfg.url = url; 
cfg.success = function(data) { 
callback(url, true, data); 
}; 
cfg.error = function() { 
callback(url, false); 
}; 
ajax(cfg); 
} 
}; 
function Loader(data, cfg) { 
var self = this, cur = -1, items = [], pendings = [], done, i = 0, l = data.length, j, m, s, t, c, d, tt, item, doing = 
0, load; 
cfg = cfg || {}; 
for (; i < l; ++i) { 
item = data[i]; 
if (typeof item === 'string') { 
s = item.substr(item.lastIndexOf('.') + 1); 
items.push(maps[item] = { 
type : loaders[s] ? s : 'img', 
url : item 
}); 
} else if (item.urls) { 
for (j = 0, s = item.type, t = item.require, c = item.callback, d = item.defer, tt = item.timeout, item = 
item.urls, m = item.length; j < m; ++j) { 
s = s || item[j].substr(item[j].lastIndexOf('.') + 1); 
items.push(maps[item[j]] = { 
type : loaders[s] ? s : 'img', 
url : item[j], 
require : t, 
callback : c, 
defer : d, 
timeout : tt 
}); 
} 
} else { 
if (!item.type) { 
s = item.url.substr(item.url.lastIndexOf('.') + 1); 
item.type = loaders[s] ? s : 'img'; 
} 
items.push(maps[item.url] = item); 
} 
} 
this.success = this.fail = this.progress = 0; 
if (cfg.onFinish) 
this.onFinish = cfg.onFinish; 
timeout = cfg.timeout || 2000; 
function callback(url, flag, data) { 
if (flag) { 
++self.success; 
} else { 
++self.fail; 
} 
self.progress = (self.success + self.fail) / items.length; 
console.info(url); 
console.warn(flag); 
item = maps[url]; 
item.success = flag; 
if (self.progress === 1) { 
self.stop(); 
} 
if (item.parent && !item.defer && !cfg.defer) { 
$(item.parent)[0].innerHTML = data || ''; 
} 
if (item.callback) { 
item.callback(data); 
} 
item.done = true; 
--doing; 
} 
function runnable(item, pend) { 
var it; 
if (typeof item.require === 'string') { 
if (item.done) 
return false; 
if (!item.require) 
return true; 
it = maps[item.require]; 
if (!it || it.done) { 
if (pend) 
pendings.shift(); 
if (it && it.success) { 
return true; 
} else { 
callback(item.url, false); 
} 
} else if (!pend) { 
pendings.push(item); 
} 
} else { 
for (it = item.length; it--;) { 
if (!runnable(item[it], pend)) 
return false; 
} 
return true; 
} 
} 
function run() { 
var item = pendings[0]; 
if (!item || !runnable(item, true)) { 
while (item = items[++cur]) { 
if (runnable(item)) { 
break; 
} 
} 
} 
if (item) { 
var fn = loaders[item.type || 'img']; 
if (fn) { 
++doing; 
if (item.type === 'ajax') { 
if (item.cfg && !item.cfg.timeout) 
item.cfg.timeout = timeout; 
fn(item.url, callback, item.cfg); 
} else { 
fn(item.url, callback, item.timeout || timeout, item.defer === undefined ? cfg.defer 
: item.defer); 
} 
}; 
if (load) { 
run(); 
} else { 
self.timer = setTimeout(run, space); 
} 
} else if (pendings.length) { 
self.timer = setTimeout(run, space); 
} 
} 
this.start = function(delay) { 
if (!done) 
this.timer = setTimeout(run, delay > space ? delay : space); 
}; 
this.stop = function() { 
if (this.timer) { 
clearTimeout(this.timer); 
this.timer = null; 
done = true; 
if (this.onFinish) { 
if (!doing) 
this.onFinish(); 
else { 
s = setInterval(function() { 
if (!doing) { 
clearInterval(s); 
self.onFinish(); 
} 
}, space); 
} 
} 
} 
}; 
this.pause = function() { 
clearTimeout(this.timer); 
}; 
this.resume = function() { 
this.timer = setTimeout(run, space); 
}; 
this.load = function() { 
clearTimeout(this.timer); 
load = true; 
run(); 
}; 
} 
})(jQuery); 
/** 
* @example 
* var loader = $.preload([ 
// 字符串,采用默认配置 
'1.jpg', '1.js', 
// 对象,自定义配置,如type, require, timeout, defer, callback 
{ 
type : 'img', 
url : 'http://foo.com/foo', 
timeout : 10 
}, { 
url : '3.js', 
callback : fn, 
defer : true, 
require : '1.js' 
}, 
// 对象,可用urls指定一组相同配置 
{ 
type : 'css', 
urls : ['4.css', '5.css'] 
}], { 
// 加载结束后调用 
onFinish : fn, 
// 加载超时 
timeout : 50 
}); 
// 开始预加载 
loader.start(); 
loader.stop(); 
// 暂停预加载 
loader.pause(); 
loader.resume(); 
// 实时加载 
loader.load(); 
*/
Javascript 相关文章推荐
window.onload 加载完毕的问题及解决方案(下)
Jul 09 Javascript
Tips 带三角可关闭的文字提示
Oct 06 Javascript
基于jquery的图片的切换(以数字的形式)
Feb 14 Javascript
JS弹出窗口插件zDialog简单用法示例
Jun 12 Javascript
Json按某个键的值进行排序
Dec 22 Javascript
echarts3 使用总结(绘制各种图表,地图)
Jan 05 Javascript
vue中用动态组件实现选项卡切换效果
Mar 25 Javascript
jQuery中$原理实例分析
Aug 13 jQuery
微信小程序通过一个json实现分享朋友圈图片
Sep 03 Javascript
vue路由传参的基本实现方式小结【三种方式】
Feb 05 Javascript
JavaScript实现瀑布流布局的3种方式
Dec 27 Javascript
原生js实现自定义难度的扫雷游戏
Jan 22 Javascript
javascript 当前日期转化为中文的实现代码
May 13 #Javascript
JAVASCRIPT实现的WEB页面跳转以及页面间传值方法
May 13 #Javascript
IE8下关于querySelectorAll()的问题
May 13 #Javascript
关于可运行代码无法正常执行的使用说明
May 13 #Javascript
jquery validate.js表单验证的基本用法入门
May 13 #Javascript
JQuery 选择器 xpath 语法应用
May 13 #Javascript
bgsound 背景音乐 的一些常用方法及特殊用法小结
May 11 #Javascript
You might like
vBulletin Forum 2.3.xx SQL Injection
2006/10/09 PHP
php基础知识:函数基础知识
2006/12/13 PHP
codeigniter自带数据库类使用方法说明
2014/03/25 PHP
PHP实现UTF8二进制及明文字符串的转化功能示例
2017/11/20 PHP
ExtJS 2.0实用简明教程 之ExtJS版的Hello
2009/04/29 Javascript
前淘宝前端开发工程师阿当的PPT中有JS技术理念问题
2010/01/15 Javascript
json格式的时间显示为正常年月日的方法
2013/09/08 Javascript
js使用split函数按照多个字符对字符串进行分割的方法
2015/03/20 Javascript
jquery ajax局部加载方法详解(实现代码)
2016/05/12 Javascript
基于AngularJs + Bootstrap + AngularStrap相结合实现省市区联动代码
2016/05/30 Javascript
AngularJS国际化详解及示例代码
2016/08/18 Javascript
jQuery-mobile事件监听与用法详解
2016/11/23 Javascript
javascript使用btoa和atob来进行Base64转码和解码
2017/03/20 Javascript
详解vue2.0的Element UI的表格table列时间戳格式化
2017/06/13 Javascript
Underscore之Array_动力节点Java学院整理
2017/07/10 Javascript
JS扩展String.prototype.format字符串拼接的功能
2018/03/09 Javascript
JQuery通过后台获取数据遍历到前台的方法
2018/08/13 jQuery
详细讲解如何创建, 发布自己的 Vue UI 组件库
2019/05/29 Javascript
详解vue 自定义组件使用v-model 及探究其中原理
2019/10/11 Javascript
[01:03]悬念揭晓 11月26日DOTA2完美盛典不见不散
2017/11/23 DOTA
python构造icmp echo请求和实现网络探测器功能代码分享
2014/01/10 Python
35个Python编程小技巧
2014/04/01 Python
Python实现的下载8000首儿歌的代码分享
2014/11/21 Python
Django中使用Whoosh进行全文检索的方法
2019/03/31 Python
Django数据库类库MySQLdb使用详解
2019/04/28 Python
获取Pytorch中间某一层权重或者特征的例子
2019/08/17 Python
Django与pyecharts结合的实例代码
2020/05/13 Python
Python flask框架端口失效解决方案
2020/06/04 Python
Footshop乌克兰:运动鞋的最大选择
2019/12/01 全球购物
中学生团员自我评价分享
2013/12/07 职场文书
中专药剂专业应届毕的自我评价
2013/12/27 职场文书
护理专科毕业生自荐书范文
2014/02/19 职场文书
事业单位分类改革实施方案
2014/03/21 职场文书
第二批党的群众路线教育实践活动个人整改方案
2014/10/31 职场文书
学雷锋主题班会教案
2015/08/13 职场文书
微信小程序和php的登录实现
2021/04/01 PHP