Thread Navigating by Arrow keys

Use ← or → and Ctrl to navigate to previous, next, first or last page

Чтобы установить этот скрипт, вы сначала должны установить расширение браузера, например Tampermonkey, Greasemonkey или Violentmonkey.

Чтобы установить этот скрипт, вы сначала должны установить расширение браузера, например Tampermonkey или Violentmonkey.

Чтобы установить этот скрипт, вы сначала должны установить расширение браузера, например Tampermonkey или Violentmonkey.

Чтобы установить этот скрипт, вы сначала должны установить расширение браузера, например Tampermonkey или Userscripts.

Чтобы установить этот скрипт, сначала вы должны установить расширение браузера, например Tampermonkey.

Чтобы установить этот скрипт, вы должны установить расширение — менеджер скриптов.

(у меня уже есть менеджер скриптов, дайте мне установить скрипт!)

Чтобы установить этот стиль, сначала вы должны установить расширение браузера, например Stylus.

Чтобы установить этот стиль, сначала вы должны установить расширение браузера, например Stylus.

Чтобы установить этот стиль, сначала вы должны установить расширение браузера, например Stylus.

Чтобы установить этот стиль, сначала вы должны установить расширение — менеджер стилей.

Чтобы установить этот стиль, сначала вы должны установить расширение — менеджер стилей.

Чтобы установить этот стиль, сначала вы должны установить расширение — менеджер стилей.

(у меня уже есть менеджер стилей, дайте мне установить скрипт!)

// ==UserScript==
// @name            Thread Navigating by Arrow keys
// @name:vi         Thread Navigating by Arrow keys
// @namespace       https://greasyfork.org/scripts/6849-thread-navigating-by-arrow-keys
// @description     Use ← or → and Ctrl to navigate to previous, next, first or last page
// @description:vi  Use ← or → and Ctrl to navigate to previous, next, first or last page
// @author          theheroofvn
// @include         /^.*(thread|forum|diendan).*$/
// @include         http://www.vn-zoom.com/*
// @require         https://ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.min.js
// @noframes
// @grant           GM_addStyle
// @version         6.8
// ==/UserScript==

$(document).ready(function () {
    $(window).focus();

    function custom_site(list) {
        if (list.length === 0) return 0;
        for (var i = 0; i < list.length; i++) {
            if (location.hostname == list[i].host) {
                prev = list[i].prev;
                next = list[i].next;
                first = list[i].first;
                last = list[i].last;
                up = list[i].up;
                return 1;
            }
        }
        return 0;
    }

    function checkScriptExist(script) {
        return $('script[src*="' + script + '"]').length > 0 ? true : false;
    }

    function detect_forum() {
        if (window.location.hostname === 'forum.xda-developers.com') {
            return 'vbb';
        }

        let result = "";

        if (checkScriptExist("vbulletin")) result = "vbb";
        else if (checkScriptExist("/js/xf/")) result = "xenforo";
        else if (checkScriptExist("general.js")) result = "mybb";
        else if (checkScriptExist("forum_fn.js")) result = "phpbb";

        return result;
    }

    var prev, next, first, last, up, up_sub = '[itemtype="https://schema.org/BreadcrumbList"] a';
    var site_info = [
        {
            host: "voz.vn",
            prev: "a.pageNav-jump--prev",
            next: "a.pageNav-jump--next",
            first: ".pageNav-main>.pageNav-page:first-child>a",
            last: ".pageNav-main>.pageNav-page:last-child>a"
        }
        , {
            host: "www.webtretho.com",
            prev: "a.arrowPrePage",
            next: "a.arrowNextPage",
            first: "a.arrowFstPage",
            last: "a.arrowLstPage"
        }, {
            host: "forum.bkav.com.vn",
            prev: "a.js-pagenav-prev-button",
            next: "a.js-pagenav-next-button",
            first: "a[data-page='1']",
            last: "a.js-pagenav-button:nth-last-child(2)",
            up: "#breadcrumbs a.crumb-link"
        }
    ];

    if (custom_site(site_info) === 0) {
        switch (detect_forum()) {
            case 'vbb':
                prev = 'a[rel="prev"]';
                next = 'a[rel="next"]';
                first = 'a[rel="start"], a[rel="first"]';
                last = 'a[title^="Last"], a[title*="uối"]';
                up = "span.navbar a, li.navbit a";
                break;
            case 'xenforo':
                prev = "a.pageNav-jump--prev";
                next = "a.pageNav-jump--next";
                last = ".pageNav-main > .pageNav-page:last-child > a";
                first = '.pageNav-main > .pageNav-page:first-child > a';
                // up = ".p-breadcrumbs";
                break;
            case 'mybb':
                prev = "a.pagination_previous";
                next = "a.pagination_next";
                first = "a.pagination_first";
                last = "a.pagination_last";
                up = ".navigation > a";
                break;
            case 'phpbb':
                prev = ".display-options a.left-box.left";
                next = ".display-options a.right-box.right";
                first = ".pagination > span > a:first-child";
                last = ".pagination > span > a:last-child";
                up = ".navlinks > .icon-home a";
                break;
            default:
                return;
        }
    }

    var nav = {
        prev: function () {
            return $(prev);
        },

        next: function () {
            return $(next);
        },

        first: function () {
            if ($(first).length > 0) {
                return $(first);
            } else {
                var $prev = $(prev).first();

                if ($prev) {
                    $prev.attr('href', function (_, value) {
                        return value.replace(/page=\d+/, 'page=1');
                    });

                    return $prev;
                } else {
                    return $();
                }
            }
        },

        last: function () {
            if ($(last).length > 0) {
                return $(last);
            } else {
                var $next = $(next).first();

                if ($next) {
                    $next.attr('href', function (_, value) {
                        return value.replace(/page=\d+/, 'page=9999');
                    });

                    return $next;
                } else {
                    return $();
                }
            }
        },

        up: function () {
            return $(up).length > 0 ? $(up).last() : $(up_sub).last();
        }
    };

    var allowed = true;

    $(document).keydown(function (e) {
        if (!allowed) {
            return;
        }

        allowed = false;

        var key = e.keyCode,
            action = null;

        if (e.ctrlKey) {
            allowed = true;
            if (key == 39) action = "last";
            else if (key == 37) action = "first";
            else if (key == 8) action = "up";
        } else if (key == 39) {
            action = "next";
        } else if (key == 37) {
            action = "prev";
        } else {
            return;
        }

        if (!action || e.target.tagName == "INPUT" || e.target.tagName == "TEXTAREA" || e.target.isContentEditable) {
            return;
        }

        var $anchor = nav[action]();

        if ($anchor.length) {
            window.location.href = $anchor[0].href;
        }
    }).keyup(function (e) {
        allowed = true;
    });
});