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 模拟JQuery的Ready方法实现并出现的问题
Dec 06 Javascript
Jquery ThickBox插件使用心得(不建议使用)
Sep 08 Javascript
Enter转换为Tab的小例子(兼容IE,Firefox)
Nov 14 Javascript
jquery禁止回车触发表单提交
Dec 12 Javascript
js实现基于正则表达式的轻量提示插件
Aug 29 Javascript
js实现对table的增加行和删除行的操作方法
Oct 13 Javascript
JS+HTML5 FileReader对象用法示例
Apr 07 Javascript
详解AngularJS之$window窗口对象
Jan 17 Javascript
使用javascript做时间倒数读秒功能的实例
Jan 23 Javascript
js纯前端实现腾讯cos文件上传功能的示例代码
May 14 Javascript
vue 解决数组赋值无法渲染在页面的问题
Oct 28 Javascript
浅析TypeScript 命名空间
Mar 19 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
PHP系统流量分析的程序
2006/10/09 PHP
模拟flock实现文件锁定
2007/02/14 PHP
php mssql 时间格式问题
2009/01/13 PHP
PHP取进制余数函数代码
2012/01/19 PHP
ThinkPHP3.1新特性之多层MVC的支持
2014/06/19 PHP
学习php设计模式 php实现门面模式(Facade)
2015/12/07 PHP
js实现兼容IE6与IE7的DIV高度
2010/05/13 Javascript
Ajax 数据请求的简单分析
2011/04/05 Javascript
根据选择不同的下拉值出现相对应的文本输入框
2013/08/01 Javascript
用jquery.sortElements实现table排序
2014/05/04 Javascript
直接拿来用的15个jQuery代码片段
2015/09/23 Javascript
jQuery中serializeArray()与serialize()的区别实例分析
2015/12/09 Javascript
JQuery的Pager分页器实现代码
2016/05/03 Javascript
JS 拼凑字符串的简单实例
2016/09/02 Javascript
Angularjs中的验证input输入框只能输入数字和小数点的写法(推荐)
2017/08/16 Javascript
微信小程序url与token设置详解
2017/09/26 Javascript
Vuejs实现购物车功能
2017/11/05 Javascript
修改npm全局安装模式的路径方法
2018/05/15 Javascript
js验证账户名是否重复
2020/05/26 Javascript
Python中的进程分支fork和exec详解
2015/04/11 Python
Python中一些自然语言工具的使用的入门教程
2015/04/13 Python
python实现学生管理系统
2018/01/11 Python
Python3.7 pyodbc完美配置访问access数据库
2019/10/03 Python
Python操作列表常用方法实例小结【创建、遍历、统计、切片等】
2019/10/25 Python
Python 操作 PostgreSQL 数据库示例【连接、增删改查等】
2020/04/21 Python
Python中使用Selenium环境安装的方法步骤
2021/02/22 Python
HTML5自定义视频播放器源码
2020/01/06 HTML / CSS
Sneaker Studio捷克:购买运动鞋
2018/07/08 全球购物
英国外籍人士的在线超市:British Corner Shop
2019/06/03 全球购物
台湾良兴购物网:EcLife
2019/12/01 全球购物
自动化专业个人求职信范文
2013/12/30 职场文书
保险经纪人求职信
2014/03/11 职场文书
联片教研活动总结
2014/07/01 职场文书
2014办公室副主任四风对照检查材料思想汇报
2014/09/20 职场文书
年会主持人开场白台词
2015/05/29 职场文书