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 相关文章推荐
JS OOP包机制,类创建的方法定义
Nov 02 Javascript
用js实现的模拟jquery的animate自定义动画(2.5K)
Jul 20 Javascript
淘宝搜索框效果实现分析
Mar 05 Javascript
JS实现自动定时切换的简洁网页选项卡效果
Oct 13 Javascript
Javascript设计模式理论与编程实战之简单工厂模式
Nov 03 Javascript
原生JS实现-星级评分系统的简单实例
Aug 21 Javascript
JS冒泡事件与事件捕获实例详解
Nov 25 Javascript
jQuery实现立体式数字滚动条增加效果
Dec 21 Javascript
javascript设计模式之中介者模式学习笔记
Feb 15 Javascript
AngularJS service之select下拉菜单效果
Jul 28 Javascript
解决vue+ element ui 表单验证有值但验证失败问题
Jan 16 Javascript
前端监听websocket消息并实时弹出(实例代码)
Nov 27 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
6个超实用的PHP代码片段
2015/08/10 PHP
phpcms的分类名称和类别名称的调用
2017/01/05 PHP
PHP实现的字符串匹配算法示例【sunday算法】
2017/12/19 PHP
详细解读php的命名空间(二)
2018/02/21 PHP
ThinkPHP框架获取最后一次执行SQL语句及变量调试简单操作示例
2018/06/13 PHP
javaScript面向对象继承方法经典实现
2013/08/20 Javascript
JavaScript获取页面上被选中文字的方法技巧
2015/03/13 Javascript
javascript中使用new与不使用实例化对象的区别
2015/06/22 Javascript
Webpack 实现 AngularJS 的延迟加载
2016/03/02 Javascript
老司机带你解读jQuery插件开发流程
2016/05/16 Javascript
深入浅析Vue组件开发
2016/11/25 Javascript
微信小程序 九宫格实例代码
2017/01/21 Javascript
基于vue.js轮播组件vue-awesome-swiper实现轮播图
2017/03/17 Javascript
解决ng-repeat产生的ng-model中取不到值的问题
2018/10/02 Javascript
JS函数内部属性之arguments和this实例解析
2018/10/07 Javascript
Vue v-text指令简单使用方法示例
2019/09/19 Javascript
Python使用PyGreSQL操作PostgreSQL数据库教程
2014/07/30 Python
深入学习Python中的上下文管理器与else块
2017/08/27 Python
机器学习python实战之决策树
2017/11/01 Python
解决Mac下首次安装pycharm无project interpreter的问题
2018/10/29 Python
在pyqt5中QLineEdit里面的内容回车发送的实例
2019/06/21 Python
手把手教你Python yLab的绘制折线图的画法
2019/10/23 Python
Python使用type动态创建类操作示例
2020/02/29 Python
Python修改列表值问题解决方案
2020/03/06 Python
python源文件的字符编码知识点详解
2021/03/04 Python
美国最大网上鞋店:Zappos
2016/07/25 全球购物
查找廉价航班和发现新目的地:Kiwi.com
2019/02/25 全球购物
全球速卖通俄罗斯站:AliExpress俄罗斯
2019/06/17 全球购物
女性时尚网购:Chic Me
2019/07/30 全球购物
2014年小学植树节活动方案
2014/03/02 职场文书
节约用水倡议书
2014/04/16 职场文书
小学校园广播稿(3篇)
2014/09/19 职场文书
班子成员四风问题自我剖析材料
2014/09/29 职场文书
元宵节寄语大全
2015/02/27 职场文书
小程序教您怎样你零成本推广获取数万用户的方法
2019/07/30 职场文书
Winsows11性能如何? win11性能测评多核竟比Win10差了10%
2021/11/21 数码科技