|
|
点开图片时,按ad或者←→快捷切换图片
@Name @Match
- // ==UserScript==
- // @name GM查看图片
- // @version 0.1
- // @author MKM
- // @match https://www.gamemale.com/*
- // ==/UserScript==
- (function() {
- 'use strict';
- const config = {
- hotkey: {
- prev: 'ArrowLeft',
- next: 'ArrowRight',
- close: 'Escape',
- prevAlt: 'a',
- nextAlt: 'd'
- }
- };
- function isImageViewerActive() {
- const viewer = document.getElementById('imgzoom');
- if (!viewer) return false;
- const style = window.getComputedStyle(viewer);
- return style.display !== 'none' && style.visibility !== 'hidden';
- }
- function clickPrev() {
- const prevBtn = document.getElementById('zimg_prev');
- if (prevBtn && isImageViewerActive()) {
- prevBtn.click();
- }
- }
- function clickNext() {
- const nextBtn = document.getElementById('zimg_next');
- if (nextBtn && isImageViewerActive()) {
- nextBtn.click();
- }
- }
- function closeViewer() {
- const closeBtn = document.querySelector('#imgzoom .imgclose');
- if (closeBtn && isImageViewerActive()) {
- closeBtn.click();
- }
- }
- function addViewerKeyboardListener() {
- const viewer = document.getElementById('imgzoom');
- if (!viewer || viewer.dataset.keyboardListenerAdded) return;
- viewer.addEventListener('keydown', handleViewerKeyDown, true);
- viewer.dataset.keyboardListenerAdded = 'true';
- viewer.setAttribute('tabindex', '-1');
- }
- function handleViewerKeyDown(e) {
- if (!isImageViewerActive()) return;
- let handled = false;
- switch(e.key) {
- case config.hotkey.prev:
- case config.hotkey.prevAlt:
- e.preventDefault();
- e.stopPropagation();
- e.stopImmediatePropagation();
- clickPrev();
- handled = true;
- break;
- case config.hotkey.next:
- case config.hotkey.nextAlt:
- e.preventDefault();
- e.stopPropagation();
- e.stopImmediatePropagation();
- clickNext();
- handled = true;
- break;
- case config.hotkey.close:
- e.preventDefault();
- e.stopPropagation();
- e.stopImmediatePropagation();
- closeViewer();
- handled = true;
- break;
- }
- if (handled) {
- e.preventDefault();
- e.stopPropagation();
- e.stopImmediatePropagation();
- return false;
- }
- }
- function handleGlobalKeyDown(e) {
- if (!isImageViewerActive()) return;
- const hotkeys = [
- config.hotkey.prev,
- config.hotkey.next,
- config.hotkey.close,
- config.hotkey.prevAlt,
- config.hotkey.nextAlt
- ];
- if (hotkeys.includes(e.key)) {
- e.stopImmediatePropagation();
- switch(e.key) {
- case config.hotkey.prev:
- case config.hotkey.prevAlt:
- clickPrev();
- break;
- case config.hotkey.next:
- case config.hotkey.nextAlt:
- clickNext();
- break;
- case config.hotkey.close:
- closeViewer();
- break;
- }
- return false;
- }
- }
- const observer = new MutationObserver((mutations) => {
- mutations.forEach((mutation) => {
- if (mutation.addedNodes.length) {
- mutation.addedNodes.forEach((node) => {
- if (node.id === 'imgzoom' || (node.querySelector && node.querySelector('#imgzoom'))) {
- setTimeout(() => {
- const viewer = document.getElementById('imgzoom');
- if (viewer) {
- addViewerKeyboardListener();
- viewer.focus();
- }
- }, 150);
- }
- });
- }
- if (mutation.type === 'attributes') {
- const target = mutation.target;
- if (target.id === 'imgzoom' && mutation.attributeName === 'style') {
- const viewer = document.getElementById('imgzoom');
- if (viewer && viewer.style.display !== 'none') {
- setTimeout(() => {
- addViewerKeyboardListener();
- viewer.focus();
- }, 150);
- }
- }
- }
- });
- });
- observer.observe(document.body, {
- childList: true,
- subtree: true,
- attributes: true,
- attributeFilter: ['style', 'class']
- });
- document.addEventListener('keydown', handleGlobalKeyDown, true);
- if (isImageViewerActive()) {
- setTimeout(() => {
- const viewer = document.getElementById('imgzoom');
- if (viewer) {
- addViewerKeyboardListener();
- viewer.focus();
- }
- }, 500);
- }
- document.addEventListener('click', (e) => {
- if (e.target && e.target.classList &&
- (e.target.classList.contains('imgclose') ||
- e.target.closest('.imgclose'))) {
- const viewer = document.getElementById('imgzoom');
- if (viewer && viewer.dataset.keyboardListenerAdded) {
- viewer.removeEventListener('keydown', handleViewerKeyDown, true);
- delete viewer.dataset.keyboardListenerAdded;
- }
- }
- }, true);
- })();
复制代码
|
评分
-
查看全部评分
|