// ==UserScript==
// @name e-hentai Scroll Mode
// @name:zh-TW e-hentai 滾動模式
// @name:zh-CN e-hentai 滚动模式
// @name:ja e-hentai スクロールモード
// @namespace https://greasyfork.org/zh-TW/users/142344-jasn-hr
// @description Scroll to browsing e-hentai's art.
// @description:zh-TW 在 e-hentai 滾動卷軸持續瀏覽
// @description:zh-CN 在 e-hentai 滚动卷轴持续浏览
// @description:ja e-hentaiスクロールスクロールでブラウジングを続ける
// @copyright 2019, HrJasn (https://greasyfork.org/zh-TW/users/142344-jasn-hr)
// @license GPL-3.0-or-later
// @version 3.0.4
// @icon https://www.google.com/s2/favicons?domain=e-hentai.org
// @match http*://e-hentai.org/s/*
// @match http*://exhentai.org/s/*
// @exclude http*://www.e-hentai.org/*
// @grant none
// ==/UserScript==
(() => {
const scrollMode_DIV = document.body.appendChild(document.createElement("div"));
scrollMode_DIV.style = "z-index:999;position:fixed;cursor:pointer;left:0px;width:100%;height:0px;top:" + window.innerHeight + "px;-webkit-overflow-scrolling:touch;overflow-y:scroll;background-color:gray;transition:all 0.5s ease 0.5s;";
let ImgJsonArr = [];
let mainImage = document.querySelector('#img').parentNode;
let PrevBtn = document.querySelector('a[href *= "/s/"] > img[src *= "/p.png"]').parentNode;
let NextBtn = document.querySelector('a[href *= "/s/"] > img[src *= "/n.png"]').parentNode;
mainImage.querySelector('img').setAttribute("pageurl",window.location.href);
ImgJsonArr.push({
'pageurl' : window.location.href,
'mainImage' : mainImage,
'PrevBtn' : PrevBtn,
'NextBtn' : NextBtn
});
function LoadBeforeImageToJsonArr(cnImg){
fetch(cnImg.href).then(async (res)=>{
return [res.url, await res.text()];
}).then((res)=>{
const parser = new DOMParser();
const htmlDocument = parser.parseFromString(res[1], "text/html");
const mImg = htmlDocument.documentElement.querySelector('#img').parentNode;
const pImg = htmlDocument.documentElement.querySelector('a[href *= "/s/"] > img[src *= "/p.png"]').parentNode;
const nImg = htmlDocument.documentElement.querySelector('a[href *= "/s/"] > img[src *= "/n.png"]').parentNode;
mImg.querySelector('img').setAttribute("pageurl",res[0]);
ImgJsonArr.unshift({
'pageurl' : res[0],
'mainImage' : mImg,
'PrevBtn' : pImg,
'NextBtn' : nImg
});
//console.log('Update ImgJsonArr: ', ImgJsonArr);
if(pImg.href != cnImg.href){
LoadBeforeImageToJsonArr(pImg);
};
});
};
LoadBeforeImageToJsonArr(PrevBtn);
function LoadAfterImageToJsonArr(cnImg){
fetch(cnImg.href).then(async (res)=>{
return [res.url, await res.text()];
}).then((res)=>{
const parser = new DOMParser();
const htmlDocument = parser.parseFromString(res[1], "text/html");
const mImg = htmlDocument.documentElement.querySelector('#img').parentNode;
const pImg = htmlDocument.documentElement.querySelector('a[href *= "/s/"] > img[src *= "/p.png"]').parentNode;
const nImg = htmlDocument.documentElement.querySelector('a[href *= "/s/"] > img[src *= "/n.png"]').parentNode;
mImg.querySelector('img').setAttribute("pageurl",res[0]);
ImgJsonArr.push({
'pageurl' : res[0],
'mainImage' : mImg,
'PrevBtn' : pImg,
'NextBtn' : nImg
});
//console.log('Update ImgJsonArr: ', ImgJsonArr);
if(nImg.href != cnImg.href){
LoadAfterImageToJsonArr(nImg);
};
});
};
LoadAfterImageToJsonArr(NextBtn);
function reSizeElmtFlwWidthIfScl(Elmt,scale = 0.75){
Elmt.style.maxWidth = "";
Elmt.style.maxHeight = "";
let Elmt_originalWidth = Elmt.offsetWidth;
let Elmt_originalHeight = Elmt.offsetHeight;
Elmt.setAttribute("originalWidth",Elmt_originalWidth);
Elmt.setAttribute("originalHeight",Elmt_originalHeight);
Elmt.style.width = "100%";
Elmt.style.height = (Elmt_originalHeight*Elmt.offsetWidth)/Elmt_originalWidth + "px";
if( (Elmt.offsetWidth*scale > Elmt_originalWidth) || (Elmt.offsetheight*scale > Elmt_originalHeight) ){
Elmt.style.width = Elmt_originalWidth + "px";
Elmt.style.height = Elmt_originalHeight + "px";
};
return Elmt;
};
let lastScrollTop = 0;
const UpdatescrollMode_DIV = (evnt) => {
document.body.style.overflow = "hidden";
let cuImg = null;
let sMImgNl = scrollMode_DIV.querySelectorAll('img');
let sMImgArr = [...sMImgNl];
if(scrollMode_DIV.querySelector('img')){
cuImg = sMImgArr.find((img)=>{
return ( (document.body.offsetHeight > (img.y + img.offsetHeight)) && ((img.y + img.offsetHeight) > 0) )
});
} else {
cuImg = ImgJsonArr.find((img)=>{
return ( img.pageurl.match(/\-([^\-]+)$/)[1] == location.href.match(/\-([^\-]+)$/)[1] )
});
let mainImage_clone = cuImg.mainImage.querySelector('img').cloneNode(true);
scrollMode_DIV.appendChild(mainImage_clone);
mainImage_clone = reSizeElmtFlwWidthIfScl(mainImage_clone);
cuImg = mainImage_clone;
};
if(cuImg){
const currentScrollTop = (cuImg.y + cuImg.offsetHeight) || scrollMode_DIV.scrollTop;
const IJAcuImg = ImgJsonArr.find((ij)=>{
return ( ij.pageurl.match(/\-([^\-]+)$/)[1] == cuImg.getAttribute("pageurl").match(/\-([^\-]+)$/)[1] );
});
if (currentScrollTop > (lastScrollTop + (cuImg.offsetHeight*0.5))) {
[...ImgJsonArr].forEach((ImgJson,ImgJsonIdx)=>{
const IJACIdx = ImgJsonArr.indexOf(IJAcuImg);
sMImgNl = scrollMode_DIV.querySelectorAll('img');
sMImgArr = [...sMImgNl];
if( ((IJACIdx-5) <= ImgJsonIdx) && (ImgJsonIdx < (IJACIdx+5)) ){
let sMcuImg = null;
sMcuImg = sMImgArr.find((sMImgNE)=>{
return ( sMImgNE.getAttribute("pageurl").match(/\-([^\-]+)$/)[1] == ImgJson.pageurl.match(/\-([^\-]+)$/)[1] );
});
if( !(sMcuImg) ){
let mainImage_clone = ImgJson.mainImage.querySelector('img').cloneNode(true);
scrollMode_DIV.appendChild(mainImage_clone);
mainImage_clone = reSizeElmtFlwWidthIfScl(mainImage_clone);
sMcuImg = mainImage_clone;
};
if ( !(evnt) && (sMcuImg) && (sMcuImg.getAttribute("pageurl").match(/\-([^\-]+)$/)[1] == location.href.match(/\-([^\-]+)$/)[1]) ) {
sMcuImg.scrollIntoView();
};
};
if( ImgJsonIdx < (IJACIdx-5) ){
sMImgNl.forEach((sMImgNE)=>{
if( ImgJson.pageurl.match(/\-([^\-]+)$/)[1] == sMImgNE.getAttribute("pageurl").match(/\-([^\-]+)$/)[1] ){
sMImgNE.remove();
};
});
};
});
lastScrollTop = currentScrollTop;
} else if (currentScrollTop < (lastScrollTop - (cuImg.offsetHeight*0.5))) {
const ImgJsonArrRvsd = [...ImgJsonArr].reverse();
[...ImgJsonArrRvsd].forEach((ImgJson,ImgJsonIdx)=>{
const IJACIdx = ImgJsonArrRvsd.indexOf(IJAcuImg);
sMImgNl = scrollMode_DIV.querySelectorAll('img');
sMImgArr = [...sMImgNl];
if( ((IJACIdx+5) >= ImgJsonIdx) && (ImgJsonIdx > (IJACIdx-5)) ){
let sMcuImg = null;
sMcuImg = sMImgArr.find((sMImgNE)=>{
return ( sMImgNE.getAttribute("pageurl").match(/\-([^\-]+)$/)[1] == ImgJson.pageurl.match(/\-([^\-]+)$/)[1] );
});
if( !(sMcuImg) ){
let mainImage_clone = ImgJson.mainImage.querySelector('img').cloneNode(true);
scrollMode_DIV.insertBefore(mainImage_clone,sMImgArr[0]);
mainImage_clone = reSizeElmtFlwWidthIfScl(mainImage_clone);
sMcuImg = mainImage_clone;
};
if ( !(evnt) && (sMcuImg) && (sMcuImg.getAttribute("pageurl").match(/\-([^\-]+)$/)[1] == location.href.match(/\-([^\-]+)$/)[1]) ) {
sMcuImg.scrollIntoView();
};
};
if( ImgJsonIdx <= (IJACIdx-5) ){
sMImgNl.forEach((sMImgNE)=>{
if( ImgJson.pageurl.match(/\-([^\-]+)$/)[1] == sMImgNE.getAttribute("pageurl").match(/\-([^\-]+)$/)[1] ){
sMImgNE.remove();
};
});
};
});
lastScrollTop = currentScrollTop;
};
};
};
const ShowscrollMode_DIV = () => {
let cuImg = null;
let currentScrollTop = window.pageYOffset || document.documentElement.scrollTop;
if ( (currentScrollTop >= lastScrollTop) && (currentScrollTop + window.innerHeight >= document.body.offsetHeight*0.99) ) {
document.body.style.overflow="hidden";
scrollMode_DIV.style.height = "100%";
scrollMode_DIV.style.top = '0px';
scrollMode_DIV.addEventListener("wheel",UpdatescrollMode_DIV,false);
scrollMode_DIV.addEventListener("scroll",UpdatescrollMode_DIV,false);
scrollMode_DIV.addEventListener("keydown",UpdatescrollMode_DIV,false);
document.removeEventListener("wheel",ShowscrollMode_DIV,false);
document.removeEventListener("scroll",ShowscrollMode_DIV,false);
document.removeEventListener("keydown",ShowscrollMode_DIV,false);
scrollMode_DIV.focus();
UpdatescrollMode_DIV();
};
lastScrollTop = currentScrollTop;
};
document.addEventListener("wheel",ShowscrollMode_DIV,false);
document.addEventListener("scroll",ShowscrollMode_DIV,false);
document.addEventListener("keydown",ShowscrollMode_DIV,false);
const HidescrollMode_DIV = () => {
scrollMode_DIV.style.height = '0px';
scrollMode_DIV.style.top = window.innerHeight + 'px';
document.body.style.overflow = "scroll";
scrollMode_DIV.removeEventListener("wheel",UpdatescrollMode_DIV,false);
scrollMode_DIV.removeEventListener("scroll",UpdatescrollMode_DIV,false);
scrollMode_DIV.removeEventListener("keydown",UpdatescrollMode_DIV,false);
document.body.focus();
document.body.scrollTo({
top: document.body.offsetHeight*0.8,
behavior: "smooth"
});
document.addEventListener("wheel",ShowscrollMode_DIV,false);
document.addEventListener("scroll",ShowscrollMode_DIV,false);
document.addEventListener("keydown",ShowscrollMode_DIV,false);
const sMImgNl = scrollMode_DIV.querySelectorAll('img');
const cuImg = [...sMImgNl].find((img)=>{
return ( (document.body.offsetHeight > (img.y + img.offsetHeight)) && ((img.y + img.offsetHeight) > 0) )
});
window.location.href = cuImg.getAttribute("pageurl");
};
scrollMode_DIV.addEventListener("click",HidescrollMode_DIV,false);
window.addEventListener('resize', ()=>{
scrollMode_DIV.querySelectorAll('img').forEach((img)=>{
reSizeElmtFlwWidthIfScl(img);
});
});
})();