Thread Navigating by Arrow keys

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

スクリプトをインストールするには、Tampermonkey, GreasemonkeyViolentmonkey のような拡張機能のインストールが必要です。

You will need to install an extension such as Tampermonkey to install this script.

スクリプトをインストールするには、TampermonkeyViolentmonkey のような拡張機能のインストールが必要です。

スクリプトをインストールするには、TampermonkeyUserscripts のような拡張機能のインストールが必要です。

このスクリプトをインストールするには、Tampermonkeyなどの拡張機能をインストールする必要があります。

このスクリプトをインストールするには、ユーザースクリプト管理ツールの拡張機能をインストールする必要があります。

(ユーザースクリプト管理ツールは設定済みなのでインストール!)

このスタイルをインストールするには、Stylusなどの拡張機能をインストールする必要があります。

このスタイルをインストールするには、Stylus などの拡張機能をインストールする必要があります。

このスタイルをインストールするには、Stylus tなどの拡張機能をインストールする必要があります。

このスタイルをインストールするには、ユーザースタイル管理用の拡張機能をインストールする必要があります。

このスタイルをインストールするには、ユーザースタイル管理用の拡張機能をインストールする必要があります。

このスタイルをインストールするには、ユーザースタイル管理用の拡張機能をインストールする必要があります。

(ユーザースタイル管理ツールは設定済みなのでインストール!)

このスクリプトの質問や評価の投稿はこちら通報はこちらへお寄せください
// ==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;
    });
});