基于javascript實(shí)現(xiàn)圖片預(yù)加載
一、定義
預(yù)加載圖片是提升用戶體驗(yàn)的一個(gè)好辦法,提前加載用戶所需的圖片,保證圖片快速、無縫發(fā)布,使用戶在瀏覽器網(wǎng)站時(shí)獲得更好用戶體驗(yàn)。常用于圖片畫廊等應(yīng)用中。
[注意]若使用即時(shí)加載,加載的圖片與頁面的其他內(nèi)容一起加載會(huì)增加頁面的整體加載時(shí)間,所以使用window.onload比較合適。
二、兩種思路
1、使用背景圖像
使用頁面無用元素的背景圖片預(yù)加載
<style>
body{
margin: 0;
}
img{
width: 100px;
height: 100px;
}
ul{
margin: 0;
padding: 0;
list-style: none;
}
.list li{
height: 0;
width: 0;
}
</style>
</head>
<body>
<button>載入圖片</button>
<img src="img/test.png" alt="測試">
<ul class="list">
<li id="preload1"></li>
<li id="preload2"></li>
<li id="preload3"></li>
<li id="preload4"></li>
</ul>
<script>
var oBtn = document.getElementsByTagName('button')[0];
var oImg0 = document.images[0];
var array = ["img/img1.gif","img/img2.gif","img/img3.gif","img/img4.gif"]
var iNow = -1;
oBtn.onclick = function(){
iNow++;
iNow = iNow%4;
oImg0.src = array[iNow];
}
function preLoadImg(){
preload1.style.background = "url('img/img1.gif')";
preload2.style.background = "url('img/img2.gif')";
preload3.style.background = "url('img/img3.gif')";
preload4.style.background = "url('img/img4.gif')";
}
window.onload = function(){
preLoadImg();
}
</script>
</body>
2、使用Image()
通過new Image()或document.createElement('img')創(chuàng)建<img>標(biāo)簽,然后通過<img>src賦值語句來加載圖片
<style>
body{
margin: 0;
}
img{
width: 100px;
height: 100px;
}
</style>
</head>
<body>
<button>載入圖片</button>
<img src="img/test.png" alt="測試">
<script>
var oBtn = document.getElementsByTagName('button')[0];
var oImg0 = document.images[0];
var array = ["img/img1.gif","img/img2.gif","img/img3.gif","img/img4.gif"]
var iNow = -1;
oBtn.onclick = function(){
iNow++;
iNow = iNow%4;
oImg0.src = array[iNow];
}
var aImages = [];
function preLoadImg(array){
for(var i = 0, len = preLoadImg.arguments[0].length; i < len; i++){
aImages[i] = new Image();
aImages[i].src = preLoadImg.arguments[0][i];
}
}
window.onload = function(){
preLoadImg(array);
}
</script>
</body>
三、onload事件
利用圖像的onload事件可以確切地知道圖片是否被真正加載,并可能在后續(xù)執(zhí)行一系列對圖片的操作功能,如獲取當(dāng)前圖片的實(shí)際寬高及索引等
[注意1]圖片的src賦值語句必須放在圖片的onload事件后面。否則可能出現(xiàn)圖片已經(jīng)加載完畢、但事件綁定尚未完成的情況
<button>載入圖片</button>
<script>
var oBtn = document.getElementsByTagName('button')[0];
oBtn.onclick = function(){
preLoadImg('img/test.png');
}
function preLoadImg(url){
var oImg = document.createElement('img');
//在本機(jī)環(huán)境下,IE8-瀏覽器下oImg的onload事件放在src后面將無法載入圖片
oImg.src = url;
oImg.onload = function(){
document.body.appendChild(oImg);
oImg.onload = null;
oImg = null;
}
}
</script>
[注意2]Image對象的onload屬性引用了一個(gè)匿名函數(shù)對象,而匿名函數(shù)通過其作用域引用Image對象,這種循環(huán)引用會(huì)有IE6中導(dǎo)致內(nèi)存泄漏,因此,應(yīng)該解除循環(huán)引用。
【遞歸寫法】
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
<style>
body{
margin: 0;
}
img{
width: 100px;
height: 100px;
}
</style>
</head>
<body>
<button>載入圖片</button>
<img src="img/test.png" alt="測試">
<script>
var oBtn = document.getElementsByTagName('button')[0];
var oImg0 = document.images[0];
var array = ["img/img1.gif","img/img2.gif","img/img3.gif","img/img4.gif"]
var iNow = -1;
oBtn.onclick = function(){
iNow++;
iNow = iNow%4;
oImg0.src = array[iNow];
}
var oImg = document.createElement('img');
var iDown = 0;
preLoadImg();
function preLoadImg(){
oImg.onload = function(){
iDown++;
alert('第' + iDown + '張圖片的寬:' + this.width + ' 高:' + this.height);
if(iDown < array.length){
preLoadImg();
}else{
oImg.onload = null;
oImg = null;
}
}
oImg.src = array[iDown];
}
</script>
</body>
</html>
【考慮onerror的更完善寫法】
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
<style>
body{
margin: 0;
}
img{
width: 100px;
height: 100px;
}
</style>
</head>
<body>
<button>載入圖片</button>
<img src="img/test.png" alt="測試">
<script>
var oBtn = document.getElementsByTagName('button')[0];
var oImg0 = document.images[0];
var array = ["img/img1.gif","img/img2.gif","img/img3.gif","img/img4.gif"]
var iNow = -1;
oBtn.onclick = function(){
iNow++;
iNow = iNow%4;
oImg0.src = array[iNow];
}
var iDown = 0;
var oImage = new Image();
function preLoadImg(arr){
function loadImgTest(arr){
iDown++;
if(iDown < arr.length){
preLoadImg(arr);
}else{
alert('ok');
oImg.onload = null;
oImg = null;
}
}
oImage.onload = function(){
loadImgTest(arr);
};
oImage.onerror = function(){
loadImgTest(arr);
};
oImage.src = arr[iDown];
}
preLoadImg(array);
</script>
</body>
</html>
【循環(huán)寫法】
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
<style>
body{
margin: 0;
}
img{
width: 100px;
height: 100px;
}
</style>
</head>
<body>
<button>載入圖片</button>
<img src="img/test.png" alt="測試">
<script>
var oBtn = document.getElementsByTagName('button')[0];
var oImg0 = document.images[0];
var array = ["img/img1.gif","img/img2.gif","img/img3.gif","img/img4.gif"]
var iNow = -1;
oBtn.onclick = function(){
iNow++;
iNow = iNow%4;
oImg0.src = array[iNow];
}
function preLoadImg(arr,callback){
var aImages = [];
var iDown = 0;
for(var i = 0; i < arr.length; i++){
aImages[i] = new Image();
aImages[i].onload = function(){
loadImgTest(arr,callback);
};
aImages[i].onerror = function(){
loadImgTest(arr,callback);
};
aImages[i].src = arr[iDown];
}
function loadImgTest(arr,callback){
iDown++;
if(iDown == arr.length){
alert('ok');
callback && callback.call(aImages);
}
}
}
preLoadImg(array,function(){
console.log(this[0].width);
});
</script>
</body>
</html>
應(yīng)用:預(yù)加載模糊變清晰
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
<style>
body{
margin: 0;
}
img{
width: 500px;
height: 500px;
}
</style>
</head>
<body>
<button>載入圖片</button>
<img src="#" alt="測試">
<script>
var oBtn = document.getElementsByTagName('button')[0];
var oImg0 = document.images[0];
var arrayB = ["img/img1.gif","img/img2.gif","img/img3.gif","img/img4.gif"];
var arrayL = ["img/img1.jpg","img/img2.jpg","img/img3.jpg","img/img4.jpg"];
var iNow = -1;
oBtn.onclick = function(){
iNow++;
iNow = iNow%4;
oImg0.src = arrayL[iNow];
aftLoadImg(arrayB,oImg0);
}
var aImages = [];
window.onload = function(){
preLoadImg(arrayL);
}
function preLoadImg(arr){
for(var i = 0, len = arr.length; i < len; i++){
aImages[i] = new Image();
aImages[i].src = arr[i];
}
}
function aftLoadImg(arr,obj){
var oImg = new Image();
oImg.onload = function(){
obj.src = arr[iNow];
}
oImg.src = arr[iNow];
}
</script>
</body>
</html>
希望本文所述對大家的javascript程序設(shè)計(jì)有所幫助。
相關(guān)文章
整理Javascript流程控制語句學(xué)習(xí)筆記
整理Javascript流程控制語句學(xué)習(xí)筆記,之前一系列的文章是跟我學(xué)習(xí)Javascript,本文就是進(jìn)一步學(xué)習(xí)javascript流程控制語句,希望大家繼續(xù)關(guān)注2015-11-11
javascript數(shù)組去重方法終極總結(jié)
這篇文章主要介紹了javascript數(shù)組去重終極總結(jié),本文列舉了3種javascript數(shù)組去重方法,并分別分析了它們的優(yōu)缺點(diǎn),需要的朋友可以參考下2014-06-06
JavaScript實(shí)現(xiàn)顯示函數(shù)調(diào)用堆棧的方法
這篇文章主要介紹了JavaScript實(shí)現(xiàn)顯示函數(shù)調(diào)用堆棧的方法,實(shí)例分析了JavaScript顯示函數(shù)調(diào)用堆棧的具體作用與使用方法,需要的朋友可以參考下2016-04-04
JavaScript canvas實(shí)現(xiàn)七彩時(shí)鐘效果
這篇文章主要為大家詳細(xì)介紹了JavaScript canvas實(shí)現(xiàn)七彩時(shí)鐘效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-05-05
小程序根據(jù)手機(jī)機(jī)型設(shè)置自定義底部導(dǎo)航距離
這篇文章主要為大家詳細(xì)介紹了小程序根據(jù)手機(jī)機(jī)型設(shè)置自定義底部導(dǎo)航距離,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-06-06

