對現有的懶加載插件(它們太複雜以至於無法理解其中的代碼)都不滿意,我認爲我可以創建一個簡單易懂的腳本,用於延遲加載圖像。將src轉換爲懶惰
我的想法很簡單。從下面的(變形的)img標籤開始。
<img lazy="http://lorempixel.com/400/200"/>
使用javascript,當頁面向上或向下滾動時,用「src」替換單詞「lazy」。
function hackyaFunction_lazy() {
[].forEach.call(document.querySelectorAll('img[lazy]'), function(img) {
img.setAttribute('src', img.getAttribute('lazy'));
img.onload = function() {
var imgs = document.querySelectorAll('[lazy]');
for (i = 0; i < imgs.length; i++) {
var o = imgs[i],
lazy = o.getAttribute('lazy');
if (o.y <= (window.screen.height + window.scrollY + 50) && o.y >= (window.scrollY - 50)) {
o.setAttribute('src', lazy);
o.removeAttribute('lazy');
}
}
}
window.onload = window.onscroll = hackyaFunction_lazy;
});
}
我知道足夠的javascript來位一起劈&件,使一些作品的。而上面的代碼有點工作。
在我的控制檯上,我發現單詞「lazy」已成功替換爲視口中圖像的「src」。
但是,在視口之外的圖像,這就是我所看到的。
<img lazy="http://lorempixel.com/400/200/sports/Dummy-Text" src="http://lorempixel.com/400/200/sports/Dummy-Text">
所以我一半工作代碼&這是我能做到的最好。
我應該只使用任何一個可用的插件;只是想看看我是否可以創建簡單的簡單的&。
既然我很接近做這件事情,我不願放棄它。
任何幫助將不勝感激。
我想在jsfiddle上放置整個東西(html & js),但圖像無法顯示在jsfiddle上。不知道爲什麼。
該代碼在本地環境中工作(如所述)。
我不明白'img.onload'函數是給定的第一行'forEach()'已經改變了當前的'img [lazy]'圖像來設置其'src',並且'forEach()'的所有迭代都將被改變。另外,爲什麼'window.onload = window.onscroll = hackyaFunction_lazy;'*裏面的函數? (另外,爲什麼你可以使用'setAttribute()'當你可以說'img.src ='?) – nnnnnn
如果我不等待圖像先加載,那麼js(將lazy更改爲src滾動)過早發射,破壞劇本。 我不知道我可以怎麼做「img.src =」,稍後刪除該屬性。你有什麼建議嗎? – HackYa
如果想法是一旦圖像在視圖中就設置了src,我*認爲*你需要的是擺脫'.forEach'和'img.onload',並保持內部'for'循環和在它之前的'var imgs ='行。然後分配'window.onload = window.onscroll = hackyaFunction_lazy;'* outside *函數。這樣,每次函數運行時,它都會爲當前視圖中的圖像更改'src' * only(僅當以前沒有加載時)。你刪除的唯一屬性是「lazy」,因此你沒有理由不能設置'img.src ='並且仍然使用'o.removeAttribute('lazy')'。 – nnnnnn