nginx画廊 new
// ==UserScript==
// @name nginx画廊
// @namespace http://tampermonkey.net/
// @version 0.1
// @description nginx画廊 new
// @author You
// @match http://127.0.0.1/res/%E6%AF%8F%E6%97%A5%E4%B8%80%E5%8F%A5/picture/
// @match http://127.0.0.1/res/%E6%AF%8F%E6%97%A5%E4%B8%80%E5%8F%A5/wallpaper/
// @match http://127.0.0.1/res/banana_pic/
// @grant none
// ==/UserScript==
(function () {
'use strict';
const loadingImg = 'https://gimg2.baidu.com/image_search/src=http%3A%2F%2Fhbimg.b0.upaiyun.com%2F079631e90e8871989842d35305b636f46761d4a5fe5-YizIOH_fw658&refer=http%3A%2F%2Fhbimg.b0.upaiyun.com&app=2002&size=f9999,10000&q=a80&n=0&g=0n&fmt=jpeg?sec=1627726169&t=6de518bc2437fb39d6d30d7b4cfb1682';
let t = document.title.substring(0, document.title.length - 1);
let i = t.lastIndexOf("/");
document.title = t.substring(i + 1);
let all = document.querySelectorAll("#list > tbody > tr > td > a");
let tbody = document.querySelector("#list > tbody");
tbody.innerHTML = '';
let a = document.createElement("a");
a.setAttribute("href", "../");
a.setAttribute("one-link-mark", "yes");
a.innerText = "上一层";
tbody.appendChild(a);
tbody.appendChild(document.createElement("br"));
let fragment = document.createDocumentFragment();
let limit = 2;
let imgElements = [];
for (let i = 1; i < all.length; i++) {
let e_img = document.createElement('img');
if (i < limit) {
e_img.setAttribute('src', all[i].href);
e_img.setAttribute('data-lazy-Src', all[i].href);
} else {
// e_img.setAttribute('src', loadingImg);
e_img.setAttribute('data-lazy-Src', all[i].href);
e_img.setAttribute('referrer',"no-referrer|origin|unsafe-url");
}
fragment.appendChild(e_img);
imgElements.push(e_img);
}
tbody.appendChild(fragment);
function lazyLoad(delay = 500) {
let imgLoad = (img, i) => {
init();
img.onload = null
},
// imgDoms = document.querySelectorAll('img'),
imgDoms = imgElements,
/**
todo:
当前图片初始化是从第一个开始,若滚动后刷新,任然是从第一个开始,不是从可视区域的第一个开始显示。
考虑缓存和仅优化首次加载并不需要完善。
完善思路,判断不仅判断offsetTop,同时判断bottom
*/
init = () => {
let H = document.documentElement.clientHeight,//获取可视区域高度
S = document.documentElement.scrollTop || document.body.scrollTop;
for (let i = 0, v = imgDoms[i]; i < imgDoms.length; i++ , v = imgDoms[i]) {
let dataSrc = v.getAttribute('data-lazy-Src'),
isloaded = v.getAttribute('data-loaded'); // delay 导致 dataSrc !== v.currentSrc 判断加载状态延迟,滚动重复触发,isloaded提前标记状态
if (!isloaded && H + S > v.offsetTop) {
// 未加载且在显示区范围初始化
v.setAttribute('data-loaded', true);
setTimeout(() => {
v.src = dataSrc;
v.onload = imgLoad.bind(null, v, i) // 下一个初始化,init放在img onload保证图片显示后高度已经变化,下一项offsetTop准确
}, delay);
break;
} else if (!isloaded) {
// 未加载不在显示区范围,退出初始话,开始监听滚动
scrollLoad();
break;
}
}
},
scrollLoad = () => {
window.onload = window.onscroll = function () { //onscroll()在滚动条滚动的时候触发
loadone();
}
},
loadone = (isInit = false) => {
let H = document.documentElement.clientHeight;//获取可视区域高度
let S = document.documentElement.scrollTop || document.body.scrollTop;
for (let i = 0, v = imgDoms[i]; i < imgDoms.length; i++ , v = imgDoms[i]) {
let dataSrc = v.getAttribute('data-lazy-Src'),
isloaded = v.getAttribute('data-loaded'); // delay 导致 dataSrc !== v.currentSrc 判断加载状态延迟,滚动重复触发,isloaded提前标记状态
if (!isloaded && H + S > v.offsetTop) {
v.setAttribute('data-loaded', true);
setTimeout(() => {
v.src = dataSrc
}, delay);
break;
}
}
};
init()
}
lazyLoad()
})();