Infinite Scroll

Infinite scrolling for March 2019 layout redesign.

当前为 2019-05-29 提交的版本,查看 最新版本

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Greasemonkey 油猴子Violentmonkey 暴力猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Violentmonkey 暴力猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Userscripts ,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展后才能安装此脚本。

(我已经安装了用户脚本管理器,让我安装!)

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

(我已经安装了用户样式管理器,让我安装!)

// ==UserScript==
// @name         Infinite Scroll
// @author       Hauffen
// @description  Infinite scrolling for March 2019 layout redesign.
// @version      2.00
// @include      /https?:\/\/(e-|ex)hentai\.org\/.*/
// @require      https://code.jquery.com/jquery-3.3.1.min.js
// @namespace    https://greasyfork.org/users/285675
// ==/UserScript==

(function() {
    var url = document.URL;
    var page = 0;
    var query, nextUrl;
    var index = document.getElementsByTagName("select").length > 1 ? 1 : 0; // Offset the select index if there are more than one

    function newUrl() {
        // Return null if we're doing a file hash search
        if (url.match(/f_shash/)) {
            return null;
        }

        if (url.split('?').length > 1) { // See if we're beginning from a page other than the base URL
            if ($.isNumeric(url.split('?')[1].substr(5,1)) && page == 0) {
                page = url.split('?')[1].substr(5,1); // Adjust the page offset if we're starting from a page other than the first page
            }

            if (url.includes("page=")) {
                query = url.substr(url.indexOf('&')); // Get query if page is already set
            } else {
                query = url.split('?')[1]; // If page is unset, we just need the whole string
            }
            query = (query.startsWith("&")) ? query : "&" + query; // Make sure that our query begins with an ampersand
            query = (query.includes("from=")) ? query.substr(0, query.lastIndexOf("&")) : query; // Remove the gallery ID offset if it's included in the query

            nextUrl = (query != null) ? "https://" + window.location.hostname + "/?page=" + (parseInt(page) + 1) + query : "https://" + window.location.hostname + "/?page=" + (parseInt(page) + 1);
        } else if (url.match(/\/tag\//)) {
            if ((page + 2) > $(".ptt tr")[0].children[$(".ptt tr")[0].children.length - 2].children[0].text) { // Return null if our next page is outside of the scope of the results for a tag search
                nextUrl = null;
            } else {
                nextUrl = url + "/" + (page + 1);
            }
        } else { // Otherwise, just do the next generic page URL
            nextUrl = "https://" + window.location.hostname + "/?page=" + (page + 1);
        }
    };

    newUrl();

    function loadMore(){
        // Don't do anything if we're in a gallery or viewing pages
        if (url.split('/')[3] === "g" || url.split('/')[3] === "s") {
            return;
        }

        // Make sure we're near enough to the bottom of the page
        if ($(window).scrollTop() + $(window).height() >= $(document).height() && nextUrl != null) {
            var offset = "&from=" + document.getElementsByClassName('itg')[0].lastChild.getElementsByTagName("a")[0].href.split("/")[4]; // Append the gallery offset to URL
            var $content = $('<div>'); // Create a div container to throw scraped content into
            $content.load(url.match(/\/tag\//) ? nextUrl :`${nextUrl + offset}`, function() { // Only add the gallery offset if we're not doing a tag search, since tag search uses a different URL scheme
                var divs = null;
                // Error catching
                if (document.getElementsByTagName("select")[index] == null) {
                    index = 0;
                }

                // Different selectors for e-h versus exh
                if (window.location.hostname.substr(1,1) !== "x") {
                    if (document.getElementsByTagName("select")[index].selectedIndex == 4) {
                        divs = this.getElementsByClassName('itg')[0].children;
                    } else {
                        divs = this.getElementsByClassName('itg')[0].children;
                    }
                } else {
                    if (document.getElementsByTagName("select")[index].selectedIndex == 4) {
                        divs = this.getElementsByClassName('itg')[0].children;
                    } else {
                        divs = this.getElementsByClassName('itg')[0].children[0].children;
                    }
                }

                // Remove the first element (table header) if not in thumbnail mode
                if (document.getElementsByTagName("select")[index].selectedIndex !== 3 && document.getElementsByTagName("select")[index].selectedIndex !== 4) {
                    divs[0].parentNode.removeChild(divs[0]);
                }

                // Add scraped content to our current page
                while (divs.length > 0) {
                    $('.itg').append(divs[0]);
                };
            });

            page = parseInt(page) + 1;
            newUrl();
        }
    };

    // Force page load if body height is less than window height
    if ($("body").height() < $(window).height()) {
        loadMore();
    }

    //Otherwise, do the normal scroll checks
    $(window).on('scroll', function(){
        loadMore();
        var offset = (document.getElementById('advdiv').style.display == "none") ? 108 : 291;

        // Delete this block if you don't want the search bar to float
        if(window.pageYOffset > (document.getElementById("searchbox").offsetTop + offset)) {
            $('#searchbox').css({
                position:'fixed',
                top:'5px',
                width:'612px',
                zIndex:'3',
                background:'#3a4650', //This line is the background color for the box, edit to your preference
                left:'50%',
                marginLeft:'-306px'
            });
            $('.ido')[0].lastChild.style.paddingTop = parseInt(offset) + 6 + 'px';
        } else { // Reset CSS rules
            $('#searchbox').css({
                position:'',
                top:'',
                width:'',
                zIndex:'',
                background:'',
                left:'',
                marginLeft:''
            });
            $('.ido')[0].lastChild.style.paddingTop = '';
        }
    });
})();