GameMale
登陆 / 注册 搜索

USERCENTER

SEARCHSITE

搜索

查看: 1867|回复: 30
收起左侧

[实用工具] 【善者神佑】【脚本】快捷切换图片

[复制链接] |关注本帖

GM活动员

火玛瑙众志成城光之少女の魔法书福卡·曙红[5]福卡·澄黄[6]福卡·锰紫[8]Futūrum(未来)神奇宝贝大师球♬狂舞终乐章♬亭亭如盖

     楼主| Makima 发表于 2026-1-1 20:19:04 | 显示全部楼层 |阅读模式 <

    点开图片时,按ad或者←→快捷切换图片




    @Name @Match


    1. // ==UserScript==
    2. // @name         GM查看图片
    3. // @version      0.1
    4. // @author       MKM
    5. // @match        https://www.gamemale.com/*
    6. // ==/UserScript==


    7. (function() {
    8.     'use strict';

    9.     const config = {
    10.         hotkey: {
    11.             prev: 'ArrowLeft',
    12.             next: 'ArrowRight',
    13.             close: 'Escape',
    14.             prevAlt: 'a',
    15.             nextAlt: 'd'
    16.         }
    17.     };

    18.     function isImageViewerActive() {
    19.         const viewer = document.getElementById('imgzoom');
    20.         if (!viewer) return false;
    21.         const style = window.getComputedStyle(viewer);
    22.         return style.display !== 'none' && style.visibility !== 'hidden';
    23.     }

    24.     function clickPrev() {
    25.         const prevBtn = document.getElementById('zimg_prev');
    26.         if (prevBtn && isImageViewerActive()) {
    27.             prevBtn.click();
    28.         }
    29.     }

    30.     function clickNext() {
    31.         const nextBtn = document.getElementById('zimg_next');
    32.         if (nextBtn && isImageViewerActive()) {
    33.             nextBtn.click();
    34.         }
    35.     }

    36.     function closeViewer() {
    37.         const closeBtn = document.querySelector('#imgzoom .imgclose');
    38.         if (closeBtn && isImageViewerActive()) {
    39.             closeBtn.click();
    40.         }
    41.     }

    42.     function addViewerKeyboardListener() {
    43.         const viewer = document.getElementById('imgzoom');
    44.         if (!viewer || viewer.dataset.keyboardListenerAdded) return;

    45.         viewer.addEventListener('keydown', handleViewerKeyDown, true);
    46.         viewer.dataset.keyboardListenerAdded = 'true';
    47.         viewer.setAttribute('tabindex', '-1');
    48.     }

    49.     function handleViewerKeyDown(e) {
    50.         if (!isImageViewerActive()) return;

    51.         let handled = false;

    52.         switch(e.key) {
    53.             case config.hotkey.prev:
    54.             case config.hotkey.prevAlt:
    55.                 e.preventDefault();
    56.                 e.stopPropagation();
    57.                 e.stopImmediatePropagation();
    58.                 clickPrev();
    59.                 handled = true;
    60.                 break;

    61.             case config.hotkey.next:
    62.             case config.hotkey.nextAlt:
    63.                 e.preventDefault();
    64.                 e.stopPropagation();
    65.                 e.stopImmediatePropagation();
    66.                 clickNext();
    67.                 handled = true;
    68.                 break;

    69.             case config.hotkey.close:
    70.                 e.preventDefault();
    71.                 e.stopPropagation();
    72.                 e.stopImmediatePropagation();
    73.                 closeViewer();
    74.                 handled = true;
    75.                 break;
    76.         }

    77.         if (handled) {
    78.             e.preventDefault();
    79.             e.stopPropagation();
    80.             e.stopImmediatePropagation();
    81.             return false;
    82.         }
    83.     }

    84.     function handleGlobalKeyDown(e) {
    85.         if (!isImageViewerActive()) return;

    86.         const hotkeys = [
    87.             config.hotkey.prev,
    88.             config.hotkey.next,
    89.             config.hotkey.close,
    90.             config.hotkey.prevAlt,
    91.             config.hotkey.nextAlt
    92.         ];

    93.         if (hotkeys.includes(e.key)) {
    94.             e.stopImmediatePropagation();

    95.             switch(e.key) {
    96.                 case config.hotkey.prev:
    97.                 case config.hotkey.prevAlt:
    98.                     clickPrev();
    99.                     break;
    100.                 case config.hotkey.next:
    101.                 case config.hotkey.nextAlt:
    102.                     clickNext();
    103.                     break;
    104.                 case config.hotkey.close:
    105.                     closeViewer();
    106.                     break;
    107.             }

    108.             return false;
    109.         }
    110.     }

    111.     const observer = new MutationObserver((mutations) => {
    112.         mutations.forEach((mutation) => {
    113.             if (mutation.addedNodes.length) {
    114.                 mutation.addedNodes.forEach((node) => {
    115.                     if (node.id === 'imgzoom' || (node.querySelector && node.querySelector('#imgzoom'))) {
    116.                         setTimeout(() => {
    117.                             const viewer = document.getElementById('imgzoom');
    118.                             if (viewer) {
    119.                                 addViewerKeyboardListener();
    120.                                 viewer.focus();
    121.                             }
    122.                         }, 150);
    123.                     }
    124.                 });
    125.             }

    126.             if (mutation.type === 'attributes') {
    127.                 const target = mutation.target;
    128.                 if (target.id === 'imgzoom' && mutation.attributeName === 'style') {
    129.                     const viewer = document.getElementById('imgzoom');
    130.                     if (viewer && viewer.style.display !== 'none') {
    131.                         setTimeout(() => {
    132.                             addViewerKeyboardListener();
    133.                             viewer.focus();
    134.                         }, 150);
    135.                     }
    136.                 }
    137.             }
    138.         });
    139.     });

    140.     observer.observe(document.body, {
    141.         childList: true,
    142.         subtree: true,
    143.         attributes: true,
    144.         attributeFilter: ['style', 'class']
    145.     });

    146.     document.addEventListener('keydown', handleGlobalKeyDown, true);

    147.     if (isImageViewerActive()) {
    148.         setTimeout(() => {
    149.             const viewer = document.getElementById('imgzoom');
    150.             if (viewer) {
    151.                 addViewerKeyboardListener();
    152.                 viewer.focus();
    153.             }
    154.         }, 500);
    155.     }

    156.     document.addEventListener('click', (e) => {
    157.         if (e.target && e.target.classList &&
    158.             (e.target.classList.contains('imgclose') ||
    159.              e.target.closest('.imgclose'))) {
    160.             const viewer = document.getElementById('imgzoom');
    161.             if (viewer && viewer.dataset.keyboardListenerAdded) {
    162.                 viewer.removeEventListener('keydown', handleViewerKeyDown, true);
    163.                 delete viewer.dataset.keyboardListenerAdded;
    164.             }
    165.         }
    166.     }, true);
    167. })();
    复制代码


    评分

    参与人数 2追随 +2 堕落 +1 收起 理由
    书の妖怪 + 1 来支持惹
    you9632587 + 1 + 1

    查看全部评分

    回复

    使用道具 举报

    Lvl. 10 · I

    GM活动员

    收到情书『随时随地开启!』破损的旧书『随时随地开启!』雪王的心脏人鱼之泪苏格兰圆脸胖鸡[Pro Max]位面引航器不曾寄出的信件幽灵竹筒

      凯诺斯 发表于 2026-1-1 20:40:22 | 显示全部楼层 <
      回复

      使用道具 举报

      GM活动员

      福卡·曙红[4]火玛瑙福卡·锰紫[7]鎏彩万幢男巫之歌女巫之路虚空之海的鲸業火死鬥实现梦想官复原职

        娱乐法师火布偶 发表于 2026-1-1 20:47:50 | 显示全部楼层 <
        回复

        使用道具 举报

        元灵化法杖超人能量和弦Walko Duck福卡·澄黄[0]福卡·锰紫[1]福卡·曙红[2]青鸾

          点击输入文字 发表于 2026-1-1 20:48:09 | 显示全部楼层 <
          回复

          使用道具 举报

          火玛瑙永远的克叔极·龙の意新神的赐福官复原职实现梦想男巫之歌传奇業火死鬥虚空之海的鲸

            2297988 发表于 2026-1-1 21:10:52 | 显示全部楼层 <
            回复

            使用道具 举报

            桂花米糕发条八音盒弗雷迪玩偶河豚寿司荧光水母Amicus福卡·澄黄[2]福卡·锰紫[3]福卡·曙红[1]

              Styphon 发表于 2026-1-1 21:21:45 | 显示全部楼层 <
              回复

              使用道具 举报

              这天我们之间是粉色的抉择You Can Pet BlaiddSCP-s-1889-第五页达拉然Dante圣金魔典夜魔护符呆猫

                crabee 发表于 2026-1-1 22:16:21 | 显示全部楼层 <
                回复

                使用道具 举报

                火玛瑙福卡·曙红[7]福卡·澄黄[4]福卡·锰紫[4]自定义男从Homunculus诺克提斯·路西斯·伽拉姆Forever Titanic钢铁侠永远的克叔【夏日限定】夏日的泰凯斯

                  轮回2L 发表于 2026-1-1 22:44:28 | 显示全部楼层 <
                  回复

                  使用道具 举报

                    zeldafire 发表于 2026-1-1 22:50:15 | 显示全部楼层 <
                    回复

                    使用道具 举报

                    業火死鬥传奇无尽的怀表枫叶的站台史莱姆牧场虚空之海的鲸竹取物语月下的誓言缘起星空男巫之歌

                      柏芸 发表于 2026-1-1 23:35:15 | 显示全部楼层 <
                      回复

                      使用道具 举报

                      福卡·曙红[6]福卡·澄黄[7]福卡·锰紫[8]河豚寿司荧光水母命运的轮廓检定场『狄文卡德的残羽』『厢庭望远』万众瞩目

                        zhuovboyan 发表于 2026-1-1 23:40:02 | 显示全部楼层 <
                        回复

                        使用道具 举报

                        我的天使GM吸血伯爵吃饱金币的Doge苏格兰圆脸胖鸡小小舞台守卫: 坚守眼位永浴爱河肉垫手套御医神兔『搓粉团珠』

                          毛茸茸兽兽 发表于 2026-1-1 23:41:26 | 显示全部楼层 <
                          回复

                          使用道具 举报

                          火玛瑙鎏彩万幢Zootopia都市:天际线2叶卡捷琳娜大帝传奇实现梦想官复原职丹雀衔五穗,人间始丰登丹妮莉丝·坦格利安

                            威风妖怪麒麟 发表于 2026-1-2 01:10:17 | 显示全部楼层 <
                            回复

                            使用道具 举报

                            福卡·曙红[0]福卡·澄黄[0]福卡·锰紫[0]火玛瑙

                              熊赳赳 发表于 2026-1-2 02:13:54 | 显示全部楼层 <
                              回复

                              使用道具 举报

                              思绪骤聚You Can Pet Blaidd泰比里厄斯Amicus可鲁贝洛斯BIG BOSS诺克提斯·路西斯·伽拉姆亚瑟‧摩根杰森‧斯坦森性感男神GM

                                呆到自然蠢 发表于 2026-1-2 03:11:26 | 显示全部楼层 <
                                回复

                                使用道具 举报

                                福卡·曙红[2]福卡·澄黄[7]福卡·锰紫[5]艾吉奥岛田半藏诺克提斯·路西斯·伽拉姆萨菲罗斯岛田源氏BIG BOSS康纳/Connor

                                  2302594 发表于 2026-1-2 06:23:56 | 显示全部楼层 <
                                  回复

                                  使用道具 举报

                                  缘起星空

                                    you9632587 发表于 2026-1-2 08:20:58 | 显示全部楼层 <
                                    回复

                                    使用道具 举报

                                    念念往日士官盔【新手友好】昆進福卡·曙红[8]福卡·澄黄[8]福卡·锰紫[8]

                                      wzsglr 发表于 2026-1-2 09:49:53 | 显示全部楼层 <
                                      回复

                                      使用道具 举报

                                      福卡·曙红[5]福卡·澄黄[1]福卡·锰紫[6]索林·临终一役永冻土里昂‧S‧甘乃迪竹取物语炽焰咆哮虎You Can Pet Blaidd质量效应三部曲

                                        黑夜下的灯光 发表于 2026-1-2 10:53:08 | 显示全部楼层 <
                                        回复

                                        使用道具 举报

                                        最终幻想XVI荒野大镖客:救赎 II福卡·曙红[2]福卡·澄黄[8]福卡·锰紫[1]火玛瑙最终幻想XIV

                                          1458209048 发表于 2026-1-2 10:54:04 | 显示全部楼层 <
                                          回复

                                          使用道具 举报

                                          您需要登录后才可以回帖 登录 | 立即注册

                                          本版积分规则

                                          关闭

                                          站长公告上一条 /2 下一条

                                          文字版|手机版|小黑屋|GameMale

                                          GMT+8, 2026-3-2 14:05 , Processed in 0.249707 second(s), 152 queries , Redis On.

                                          Copyright © 2013-2026 GameMale

                                          All Rights Reserved.

                                          快速回复 返回列表