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 相关文章推荐
Javascript 获取链接(url)参数的方法[正则与截取字符串]
Feb 09 Javascript
Extjs Ext.MessageBox.confirm 确认对话框详解
Apr 02 Javascript
aspx中利用js实现确认删除代码
Jul 22 Javascript
通过复制Table生成word和excel的javascript代码
Jan 20 Javascript
$.each与$().each的区别示例介绍
Mar 20 Javascript
ExtJS4 动态生成的grid导出为excel示例
May 02 Javascript
javascript如何使用bind指定接收者
May 04 Javascript
node.js微信公众平台开发教程
Mar 04 Javascript
div实现自适应高度的textarea实现angular双向绑定
Jan 08 Javascript
JavaScript数组操作详解
Feb 04 Javascript
Webpack优化配置缩小文件搜索范围
Dec 25 Javascript
代码块高亮可复制显示js插件highlight.js+clipboard.js整合
Feb 15 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
中国广播史趣谈 — 几个历史第一次
2021/03/01 无线电
为了这两部电子管收音机,买了6套全新电子管和10粒刻度盘灯泡
2021/03/02 无线电
php计算十二星座的函数代码
2012/08/21 PHP
javascript日期转换 时间戳转日期格式
2011/11/05 Javascript
js select option对象小结
2013/12/20 Javascript
Javascript中的方法链(Method Chaining)介绍
2015/03/15 Javascript
js实现ctrl+v粘贴上传图片(兼容chrome、firefox、ie11)
2016/03/09 Javascript
一次$.getJSON不执行的简单记录
2016/07/19 Javascript
深入理解JS继承和原型链的问题
2016/12/17 Javascript
vue.js模仿京东省市区三级联动的选择组件实例代码
2017/11/22 Javascript
浅谈vue同一页面中拥有两个表单时,的验证问题
2018/09/18 Javascript
layui数据表格重载实现往后台传参
2019/11/15 Javascript
JavaScript 判断数据类型的4种方法
2020/09/11 Javascript
在vue中实现某一些路由页面隐藏导航栏的功能操作
2020/09/21 Javascript
Javascript异步流程控制之串行执行详解
2020/09/27 Javascript
[03:42]2014DOTA2国际邀请赛 第三日比赛排位扑朔迷离
2014/07/12 DOTA
[02:37]2018DOTA2亚洲邀请赛赛前采访-EG篇
2018/04/03 DOTA
[51:29]完美世界DOTA2联赛循环赛 Matador vs Forest BO2第一场 11.05
2020/11/05 DOTA
Python简单计算给定某一年的某一天是星期几示例
2018/06/27 Python
Python计算开方、立方、圆周率,精确到小数点后任意位的方法
2018/07/17 Python
python绘制双Y轴折线图以及单Y轴双变量柱状图的实例
2019/07/08 Python
Python 面向对象静态方法、类方法、属性方法知识点小结
2020/03/09 Python
一个入门级python爬虫教程详解
2021/01/27 Python
html5.2 dialog简介详解
2018/02/27 HTML / CSS
奥地利网上现代灯具和灯饰店:Lampenwelt.at
2018/01/29 全球购物
《盘古开天地》教学反思
2014/02/28 职场文书
项目转让协议书
2014/10/27 职场文书
计划生育责任书
2015/05/09 职场文书
校车安全管理责任书
2015/05/11 职场文书
css3 filter属性的使用简介
2021/03/31 HTML / CSS
Python常用配置文件ini、json、yaml读写总结
2021/07/09 Python
Java后台生成图片的完整步骤
2021/08/04 Java/Android
使用python将HTML转换为PDF pdfkit包(wkhtmltopdf) 的使用方法
2022/04/21 Python
Spring Data JPA框架的核心概念和Repository接口
2022/04/28 Java/Android
vue @ ~ 相对路径 路径别名设置方式
2022/06/05 Vue.js
CSS中理解层叠性及权重如何分配
2022/12/24 HTML / CSS