js画像の読み込み遅延
8068 ワード
http://www.qiqiboy.com/2011/04/12/javascript-and-images-lazyload.html
lazyloadはJS、cssのロードなど、多くの場合に使用できます.ページ上の多くの大きな画像のウェブサイトにとって、画像の遅延荷重は、ページのサイズを節約し、ページとサーバのリソースの相互作用を減らし、ユーザーの待ち時間などを減らすことができます.だから使う人がだんだん多くなりました.
先ほど業務をしていた時、このような需要に出会いました.違いますが、このサイトにはjQueryが紹介されていませんので、他の人が開発したjQuery lazyloadプラグインを使って開発することはできません.自分でコードを書くしかないです.この文はコードを貼って、参考交流とします.コードは基本的に画像lazyloadの需要を実現しましたが、まだいくつかの問題があります.コードに改善の提案と意見があれば、メッセージを歓迎します.
先にデモを見ますができます.コードを見てください.
コードを呼び出して、lazyloadが必要な画像を巡回してlazyloadを呼び出すことができます.具体的にはdemoをダウンロードして確認することができます.
実装原理は、画像を巡回して、画像が既にロードされているかどうかを判断し、またはキャッシュが存在しているかを判断し、ロードされていない場合は、画像のsrcをビット画像に設定し、イベントをバインドすることである.画像がすでに視認領域に入っていることを検出したら、srcを再設定します.
いくつかの疑問があります
第一に、IEの下のバインディングscrollイベントは、多くのバインディングができないようです.一つだけバインディングできます.window.onscrollを使うようになりました.原因は不明です.まだ深く検討していません.しばらくはset Intervalで代替します.
第二に、ブラウザで画像のダウンロードをロードします.もし画像がダウンロードされていて、srcを別のものに設定したら、前の画像は直ちにabortに設定されますか?すべてのブラウザはこのようなものですか?srcを空に設定すると、以前の画像はabortによってロード停止されますか?すべてのブラウザはこうですか?srcを除去しますか?
関連資料があれば、ご提供ください.
2010.4.12 16:20更新: 実際に証明しましたが、上記の疑問の答えはSrcを除去しても、あるいはsrcをリセットしても、ブラウザ(chrome、ff>4?)をダウンロードする前の写真を止めることができません.だからJS版のlazyloadは無意味です.前と後の組み合わせ(ページ出力前にSrcビットマップを占めるように設定されています)だけが、本当のlazyloadです.
だからみんなはもうそれを使わないでください.意味がありません.本文のコードも無意味です.唯一のハイライトは、写真を読み込む時のfadeIn効果が魅力的です.はははは
lazyloadはJS、cssのロードなど、多くの場合に使用できます.ページ上の多くの大きな画像のウェブサイトにとって、画像の遅延荷重は、ページのサイズを節約し、ページとサーバのリソースの相互作用を減らし、ユーザーの待ち時間などを減らすことができます.だから使う人がだんだん多くなりました.
先ほど業務をしていた時、このような需要に出会いました.違いますが、このサイトにはjQueryが紹介されていませんので、他の人が開発したjQuery lazyloadプラグインを使って開発することはできません.自分でコードを書くしかないです.この文はコードを貼って、参考交流とします.コードは基本的に画像lazyloadの需要を実現しましたが、まだいくつかの問題があります.コードに改善の提案と意見があれば、メッセージを歓迎します.
先にデモを見ますができます.コードを見てください.
var addListener=function(e, n, o, u){
if(e.addEventListener) {
e.addEventListener(n, o, u);
return true;
} else if(e.attachEvent) {
e['e' + n + o] = o;
e[n + o] = function() {
e['e' + n + o](window.event);
};
e.attachEvent('on' + n, e[n + o]);
return true;
}
return false;
},
getObjPoint=function(o){
var x=y=0;
do {
x += o.offsetLeft || 0;
y += o.offsetTop || 0;
o = o.offsetParent;
} while (o);
return {'x':x,'y':y};
},
IE=function(){
if(/msie (\d+\.\d)/i.test(navigator.userAgent)){
return document.documentMode || parseFloat(RegExp.$1);
}
return 0;
}
// , lazyload
var lazyload=function(img){
if(img.complete||img.readyState&&(
img.readyState=='loaded'||img.readyState=='complete')
){//
return false;
}
img.setAttribute('_src',img.src);
img.src='images/nothing.gif';
// loading , src:img.removeAttribute('src');
// src webkit (safari & chrome) ,
// src ,img.src=""; (IE?)
var action=function(img){//
if(img.getAttribute('loaded')){// loaded
clearInterval(img.timer);
return;
}
var doc=document.documentElement,
body=document.body,
sy=(doc&&doc.scrollTop || body&&body.scrollTop || 0) - (doc&&doc.clientTop || body&&body.clientTop || 0),
np=getObjPoint(img),
ny=np.y,
wy=doc&&doc.clientHeight || body&&body.clientHeight;
//console.log(ny+'|'+sy+'|'+wy)
if(Math.abs(ny-sy)<wy){
//
img.setAttribute('loaded','loaded');// loaded , img
img.src=img.getAttribute('_src');// src
img.onload=img.onerror=img.onreadystatechange=function(){
//IE onreadystatechange, onload
if(img&&img.readyState&&img.readyState!='loaded'&&img.readyState!='complete'){
return false;
}
img.onload = img.onreadystatechange = img.onerror = null;
var animat=function(el){// fadeIn
var s=0,
timer=setInterval(function(){
el.style.opacity=s;
el.style.filter=('opacity='+(s*100));
s+=0.05;
if(s>1)clearInterval(timer);
},30)
}
animat(img);
};
}
}
action(img);
if(IE()&&IE()<9){
//ie8 scroll ,
img.timer=setInterval(function(){action(img)},1000);
}else{
addListener(window,'scroll',function(){action(img)},false);
}
}
DEMOコードを呼び出して、lazyloadが必要な画像を巡回してlazyloadを呼び出すことができます.具体的にはdemoをダウンロードして確認することができます.
実装原理は、画像を巡回して、画像が既にロードされているかどうかを判断し、またはキャッシュが存在しているかを判断し、ロードされていない場合は、画像のsrcをビット画像に設定し、イベントをバインドすることである.画像がすでに視認領域に入っていることを検出したら、srcを再設定します.
いくつかの疑問があります
第一に、IEの下のバインディングscrollイベントは、多くのバインディングができないようです.一つだけバインディングできます.window.onscrollを使うようになりました.原因は不明です.まだ深く検討していません.しばらくはset Intervalで代替します.
第二に、ブラウザで画像のダウンロードをロードします.もし画像がダウンロードされていて、srcを別のものに設定したら、前の画像は直ちにabortに設定されますか?すべてのブラウザはこのようなものですか?srcを空に設定すると、以前の画像はabortによってロード停止されますか?すべてのブラウザはこうですか?srcを除去しますか?
関連資料があれば、ご提供ください.
2010.4.12 16:20更新: 実際に証明しましたが、上記の疑問の答えはSrcを除去しても、あるいはsrcをリセットしても、ブラウザ(chrome、ff>4?)をダウンロードする前の写真を止めることができません.だからJS版のlazyloadは無意味です.前と後の組み合わせ(ページ出力前にSrcビットマップを占めるように設定されています)だけが、本当のlazyloadです.
だからみんなはもうそれを使わないでください.意味がありません.本文のコードも無意味です.唯一のハイライトは、写真を読み込む時のfadeIn効果が魅力的です.はははは