Infinite scroll @ javbus.com
当前为
// ==UserScript==
// @name javbus.waterfall
// @description Infinite scroll @ javbus.com
// @namespace https://github.com/FlandreDaisuki
// @include https://www.javbus.com/*
// @include https://www.javbus2.com/*
// @include https://www.javbus3.com/*
// @include https://www.javbus5.com/*
// @include https://www.javbus.me/*
// @version 2016.12.15
// @grant none
// ==/UserScript==
class Lock {
constructor(d = false) {
this.locked = d;
}
lock() {
this.locked = true;
}
unlock() {
this.locked = false;
}
}
function addStyle(styleStr) {
$('head').append(`<style>${styleStr}</style>`);
}
function fetchURL(url) {
console.log(`fetchUrl = ${url}`);
return fetch(url, {
credentials: 'same-origin'
})
.then((response) => {
return response.text();
})
.then((html) => {
return new DOMParser().parseFromString(html, 'text/html');
})
.then((doc) => {
let $doc = $(doc);
let nextHref = $doc.find('a#next').attr('href');
let nextURL = nextHref ? `${location.protocol}//${location.host}${nextHref}` : undefined;
let elems = $doc.find('div.item');
return {
nextURL,
elems
};
});
}
function* fetchSync(urli) {
let url = urli;
do {
yield new Promise((resolve, reject) => {
if (mutex.locked) {
reject();
} else {
mutex.lock();
resolve();
}
}).then(() => {
return fetchURL(url).then(info => {
url = info.nextURL;
return info.elems;
});
}).then(elems => {
mutex.unlock();
return elems;
}).catch((err) => {
// Locked!
});
} while (url);
}
function appendElems(arg) {
let nextpage = pagegen.next();
if (!nextpage.done) {
nextpage.value.then(elems => {
/* show .avatar-box only in first page */
$('#waterfall').append((!arg) ? elems.slice(1) : elems);
});
}
return nextpage.done;
}
function xbottom(elem, limit) {
return (elem.getBoundingClientRect().top - $(window).height()) < limit;
}
function end() {
console.info('The End');
$(document).off('scroll');
$(document).off('wheel');
$(anchor).replaceWith($(`<h1>The End</h1>`));
}
function scroll() {
if (xbottom(anchor, 500) && appendElems()) {
end();
}
}
function wheel() {
if (xbottom(anchor, 1000) && appendElems()) {
end();
}
}
const pagegen = fetchSync(location.href);
const anchor = $('.pagination')[0];
const mutex = new Lock();
if ($('div.item').length) {
$(document).on('scroll', scroll);
$(document).on('wheel', wheel);
$('div.item').remove();
appendElems('first');
addStyle(`
#waterfall {
height: initial !important;
width: initial !important;
display: flex;
flex-direction: row;
flex-wrap: wrap;
}
#waterfall .item.item {
position: relative !important;
top: initial !important;
left: initial !important;
float: none;
flex: 25%;
}
#waterfall .movie-box,
#waterfall .avatar-box {
width: initial !important;
display: flex;
}
#waterfall .movie-box .photo-frame {
overflow: visible;
}`);
}