点击图片强制新标签页

左键点击网页图片时强制在新标签页打开

// ==UserScript==
// @name         点击图片强制新标签页
// @namespace    http://tampermonkey.net/
// @version      1.2
// @description  左键点击网页图片时强制在新标签页打开
// @author       kang
// @license MIT
// @match        *://*/*
// @grant        none
// @icon         https://img.icons8.com/?size=64&id=4MRMs77EDvrv&format=png
// @run-at       document-start
// ==/UserScript==


(function() {
    'use strict';

    // 查找有效图片链接
    const findImageLink = (element) => {
        const MAX_DEPTH = 7; // 增加DOM遍历深度
        let current = element;
        let depth = 0;

        // 先找图片元素
        while (current && depth++ < MAX_DEPTH) {
            if (current.tagName === 'IMG') {
                // 向上查找最近的<a>标签
                let parent = current.parentElement;
                while (parent && parent.tagName !== 'A') {
                    parent = parent.parentElement;
                }
                if (parent && parent.href) {
                    return {
                        img: current,
                        link: parent
                    };
                }
                break;
            }
            current = current.parentElement;
        }
        return null;
    };

    // 主事件处理器
    const handleClick = (event) => {
        // 仅处理主按钮(左键)点击
        if (event.button !== 0) return;

        // 保留辅助键功能
        if (event.ctrlKey || event.metaKey || event.shiftKey) return;

        const result = findImageLink(event.target);
        if (!result || !result.link.href) return;

        // 阻止默认行为
        event.preventDefault();
        event.stopImmediatePropagation();

        // 新标签页打开
        window.open(result.link.href, '_blank', 'noopener noreferrer');



        // 添加点击反馈效果
        result.img.style.transition = 'opacity 0.3s';
        result.img.style.opacity = '0.5';
        setTimeout(() => {
            result.img.style.opacity = '';
        }, 300);
    };

    // 注册事件监听
    document.addEventListener('click', handleClick, {
        capture: true,
        passive: false
    });

    // 动态内容处理
    const observer = new MutationObserver(() => {
        document.addEventListener('click', handleClick, {
            capture: true,
            passive: false
        });
    });

    observer.observe(document, {
        childList: true,
        subtree: true
    });
})();