一段實(shí)現(xiàn)頁(yè)面上的圖片延時(shí)加載的js代碼
更新時(shí)間:2010年02月11日 11:46:07 作者:
效果可以直接看淘寶的商品分類頁(yè)、還有QQ的商城頁(yè)
相關(guān)地址:
http://list.taobao.com/browse/30-50029375/n-1----------------------0---------yes-------g,ge3denzxhazdumzsgy3tsnzq-----------------------42-grid-commend-0-all-50029375.htm?TBG=14153.14.7&ssid=r18-s18
http://shop.qq.com/shopList.html
大家如果使用firebug去查看的話就會(huì)發(fā)現(xiàn),當(dāng)你滾動(dòng)到相應(yīng)的行時(shí),當(dāng)前行的圖片才即時(shí)加載的,這樣子的話頁(yè)面在打開(kāi)只加可視區(qū)域的圖片,而其它隱藏的圖片則不加載,一定程序上加快了頁(yè)面加載的速度,對(duì)于比較長(zhǎng)的頁(yè)面來(lái)說(shuō),這個(gè)方案是比較好的。
實(shí)現(xiàn)原理
把所有需要延時(shí)加載的圖片改成如下的格式:
<img lazy_src="圖片路徑" border="0"/>
然后在頁(yè)面加載時(shí),把所有使用了lazy_src的圖片都保存到數(shù)組里,然后在滾動(dòng)時(shí)計(jì)算可視區(qū)域的top,然后把延時(shí)加載的圖片中top小于當(dāng)前可視區(qū)域(即圖片出現(xiàn)在可視區(qū)域內(nèi))的圖片的src的值用lazy_src的來(lái)替換(加載圖片)
代碼
lazyLoad=(function() {
var map_element = {};
var element_obj = [];
var download_count = 0;
var last_offset = -1;
var doc_body;
var doc_element;
var lazy_load_tag;
function initVar(tags) {
doc_body = document.body;
doc_element = document.compatMode == 'BackCompat' ? doc_body: document.documentElement;
lazy_load_tag = tags || ["img", "iframe"];
};
function initElementMap() {
var all_element = [];
//從所有相關(guān)元素中找出需要延時(shí)加載的元素
for (var i = 0,
len = lazy_load_tag.length; i < len; i++) {
var el = document.getElementsByTagName(lazy_load_tag[i]);
for (var j = 0,
len2 = el.length; j < len2; j++) {
if (typeof(el[j]) == "object" && el[j].getAttribute("lazy_src")) {
element_obj.push(all_element[key]);
}
}
}
for (var i = 0,
len = element_obj.length; i < len; i++) {
var o_img = element_obj[i];
var t_index = getAbsoluteTop(o_img);//得到圖片相對(duì)document的距上距離
if (map_element[t_index]) {
map_element[t_index].push(i);
} else {
//按距上距離保存一個(gè)隊(duì)列
var t_array = [];
t_array[0] = i;
map_element[t_index] = t_array;
download_count++;//需要延時(shí)加載的圖片數(shù)量
}
}
};
function initDownloadListen() {
if (!download_count) return;
var offset = (window.MessageEvent && !document.getBoxObjectFor) ? doc_body.scrollTop: doc_element.scrollTop;
//可視化區(qū)域的offtset=document的高+
var visio_offset = offset + doc_element.clientHeight;
if (last_offset == visio_offset) {
setTimeout(initDownloadListen, 200);
return;
}
last_offset = visio_offset;
var visio_height = doc_element.clientHeight;
var img_show_height = visio_height + offset;
for (var key in map_element) {
if (img_show_height > key) {
var t_o = map_element[key];
var img_vl = t_o.length;
for (var l = 0; l < img_vl; l++) {
element_obj[t_o[l]].src = element_obj[t_o[l]].getAttribute("lazy_src");
}
delete map_element[key];
download_count--;
}
}
setTimeout(initDownloadListen, 200);
};
function getAbsoluteTop(element) {
if (arguments.length != 1 || element == null) {
return null;
}
var offsetTop = element.offsetTop;
while (element = element.offsetParent) {
offsetTop += element.offsetTop;
}
return offsetTop;
}
function init(tags) {
initVar(tags);
initElementMap();
initDownloadListen();
};
return {
init: init
}
})();
使用方法:把頁(yè)面上需要延時(shí)加載的圖片src改成為lazy_src,然后把上面的js放到body最后面,然后調(diào)用:lazyLoad.init();
調(diào)戲的方法可以使用firebug來(lái)查看一時(shí)圖片是否是延時(shí)加載。
另外:
如果你的頁(yè)面上存在有內(nèi)容切換的欄目的話,可能在切換時(shí)切換的內(nèi)容里的圖片可能會(huì)不顯示,處理的方法是在內(nèi)容時(shí)單獨(dú)圖片加載處理,如:
///切換內(nèi)容的代碼...
chlid.find("img[init_src]").each(function(){
$(this).attr("src",$(this).attr("init_src"));
$(this).removeAttr("init_src");
});
http://list.taobao.com/browse/30-50029375/n-1----------------------0---------yes-------g,ge3denzxhazdumzsgy3tsnzq-----------------------42-grid-commend-0-all-50029375.htm?TBG=14153.14.7&ssid=r18-s18
http://shop.qq.com/shopList.html
大家如果使用firebug去查看的話就會(huì)發(fā)現(xiàn),當(dāng)你滾動(dòng)到相應(yīng)的行時(shí),當(dāng)前行的圖片才即時(shí)加載的,這樣子的話頁(yè)面在打開(kāi)只加可視區(qū)域的圖片,而其它隱藏的圖片則不加載,一定程序上加快了頁(yè)面加載的速度,對(duì)于比較長(zhǎng)的頁(yè)面來(lái)說(shuō),這個(gè)方案是比較好的。
實(shí)現(xiàn)原理
把所有需要延時(shí)加載的圖片改成如下的格式:
<img lazy_src="圖片路徑" border="0"/>
然后在頁(yè)面加載時(shí),把所有使用了lazy_src的圖片都保存到數(shù)組里,然后在滾動(dòng)時(shí)計(jì)算可視區(qū)域的top,然后把延時(shí)加載的圖片中top小于當(dāng)前可視區(qū)域(即圖片出現(xiàn)在可視區(qū)域內(nèi))的圖片的src的值用lazy_src的來(lái)替換(加載圖片)
代碼
復(fù)制代碼 代碼如下:
lazyLoad=(function() {
var map_element = {};
var element_obj = [];
var download_count = 0;
var last_offset = -1;
var doc_body;
var doc_element;
var lazy_load_tag;
function initVar(tags) {
doc_body = document.body;
doc_element = document.compatMode == 'BackCompat' ? doc_body: document.documentElement;
lazy_load_tag = tags || ["img", "iframe"];
};
function initElementMap() {
var all_element = [];
//從所有相關(guān)元素中找出需要延時(shí)加載的元素
for (var i = 0,
len = lazy_load_tag.length; i < len; i++) {
var el = document.getElementsByTagName(lazy_load_tag[i]);
for (var j = 0,
len2 = el.length; j < len2; j++) {
if (typeof(el[j]) == "object" && el[j].getAttribute("lazy_src")) {
element_obj.push(all_element[key]);
}
}
}
for (var i = 0,
len = element_obj.length; i < len; i++) {
var o_img = element_obj[i];
var t_index = getAbsoluteTop(o_img);//得到圖片相對(duì)document的距上距離
if (map_element[t_index]) {
map_element[t_index].push(i);
} else {
//按距上距離保存一個(gè)隊(duì)列
var t_array = [];
t_array[0] = i;
map_element[t_index] = t_array;
download_count++;//需要延時(shí)加載的圖片數(shù)量
}
}
};
function initDownloadListen() {
if (!download_count) return;
var offset = (window.MessageEvent && !document.getBoxObjectFor) ? doc_body.scrollTop: doc_element.scrollTop;
//可視化區(qū)域的offtset=document的高+
var visio_offset = offset + doc_element.clientHeight;
if (last_offset == visio_offset) {
setTimeout(initDownloadListen, 200);
return;
}
last_offset = visio_offset;
var visio_height = doc_element.clientHeight;
var img_show_height = visio_height + offset;
for (var key in map_element) {
if (img_show_height > key) {
var t_o = map_element[key];
var img_vl = t_o.length;
for (var l = 0; l < img_vl; l++) {
element_obj[t_o[l]].src = element_obj[t_o[l]].getAttribute("lazy_src");
}
delete map_element[key];
download_count--;
}
}
setTimeout(initDownloadListen, 200);
};
function getAbsoluteTop(element) {
if (arguments.length != 1 || element == null) {
return null;
}
var offsetTop = element.offsetTop;
while (element = element.offsetParent) {
offsetTop += element.offsetTop;
}
return offsetTop;
}
function init(tags) {
initVar(tags);
initElementMap();
initDownloadListen();
};
return {
init: init
}
})();
使用方法:把頁(yè)面上需要延時(shí)加載的圖片src改成為lazy_src,然后把上面的js放到body最后面,然后調(diào)用:lazyLoad.init();
調(diào)戲的方法可以使用firebug來(lái)查看一時(shí)圖片是否是延時(shí)加載。
另外:
如果你的頁(yè)面上存在有內(nèi)容切換的欄目的話,可能在切換時(shí)切換的內(nèi)容里的圖片可能會(huì)不顯示,處理的方法是在內(nèi)容時(shí)單獨(dú)圖片加載處理,如:
復(fù)制代碼 代碼如下:
///切換內(nèi)容的代碼...
chlid.find("img[init_src]").each(function(){
$(this).attr("src",$(this).attr("init_src"));
$(this).removeAttr("init_src");
});
您可能感興趣的文章:
- 一段幾乎可以讓你死機(jī)的JS代碼
- 一段非常簡(jiǎn)單的讓圖片自動(dòng)切換js代碼
- 一段js小代碼,計(jì)算距春節(jié)還有多少天
- 一段多瀏覽器的"復(fù)制到剪貼板"javascript代碼
- Discuz! 5.0.0論壇程序中加入一段js代碼,讓會(huì)員點(diǎn)擊下載附件前自動(dòng)彈出提示窗口
- javascript生成/解析dom的CDATA類型的字段的代碼
- 一段超強(qiáng)的javascript代碼解密方法
- 一起來(lái)寫(xiě)段JS drag拖動(dòng)代碼
- js 獲取后臺(tái)的字段 改變 checkbox的被選中的狀態(tài) 代碼
- 超實(shí)用的JavaScript代碼段 附使用方法
相關(guān)文章
javascript動(dòng)態(tài)改變img的src屬性圖片不顯示的解決方法
最近寫(xiě)了幾句javascript程序代碼,涉及到了動(dòng)態(tài)改變圖片的效果,結(jié)果在ie下顯示不出了來(lái),實(shí)在是郁悶,上網(wǎng)找尋結(jié)果,終于發(fā)現(xiàn)了,原來(lái)是 瀏覽器的問(wèn)題?,F(xiàn)在將方法貼出來(lái)分享。2010-10-10js實(shí)現(xiàn)用滾動(dòng)條來(lái)放大縮小圖片的代碼
js實(shí)現(xiàn)用滾動(dòng)條來(lái)放大縮小圖片的代碼...2007-07-07最簡(jiǎn)單的js圖片切換效果實(shí)現(xiàn)代碼
最簡(jiǎn)單的js圖片切換效果實(shí)現(xiàn)代碼,需要的朋友可以參考下。2011-09-09jb51站長(zhǎng)推薦的用js實(shí)現(xiàn)的多瀏覽器支持的圖片輪換展示效果ie,firefox
jb51站長(zhǎng)推薦的用js實(shí)現(xiàn)的多瀏覽器支持的圖片輪換展示效果ie,firefox...2007-03-03