NOTICE: By continued use of this site you understand and agree to the binding Terms of Service and Privacy Policy.
// ==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); }); }); })();