Greasy Fork is available in English.

智能新标签页打开

智能识别导航链接和内容链接,自动在新标签页打开内容

// ==UserScript==
// @name         智能新标签页打开
// @name:en      Smart Tab Opener
// @namespace    http://tampermonkey.net/
// @version      1.0
// @description  智能识别导航链接和内容链接,自动在新标签页打开内容
// @description:en  Automatically open content links in new tabs while keeping navigation links in the current page
// @author       [你的名字]
// @match        *://*/*
// @grant        none
// @license      MIT
// ==/UserScript==

(function() {
    'use strict';

    // 导航相关的标签和类名
    const NAV_RELATED_ELEMENTS = [
        'nav',
        'menu',
        'select',
        'header',
        'dropdown',
        'navigation',
        'section',
        'chapter'
    ];

    // 导航相关的类名关键字
    const NAV_RELATED_CLASSES = [
        'nav',
        'menu',
        'dropdown',
        'header',
        'select',
        'navigation',
        'breadcrumb',
        'js-selected-navigation-item',
        'section',
        'chapter',
        'tree'
    ];

    document.addEventListener('click', function(e) {
        // 查找被点击元素的最近的 A 标签父元素
        let target = e.target;
        while (target && target.tagName !== 'A') {
            target = target.parentElement;
        }

        // 如果找到了链接元素
        if (target && target.tagName === 'A') {
            // 首先检查链接本身的类名
            if (target.classList && NAV_RELATED_CLASSES.some(navClass => 
                Array.from(target.classList).some(cls => 
                    cls.toLowerCase().includes(navClass.toLowerCase())
                )
            )) {
                return;
            }

            // 检查父元素
            let parent = target;
            for (let depth = 0; depth < 5; depth++) {
                if (!parent) break;

                // 检查标签名
                if (NAV_RELATED_ELEMENTS.includes(parent.tagName.toLowerCase())) {
                    return;
                }

                // 检查类名
                if (parent.classList && parent.classList.length > 0) {
                    if (NAV_RELATED_CLASSES.some(navClass => 
                        Array.from(parent.classList).some(cls => 
                            cls.toLowerCase().includes(navClass.toLowerCase())
                        )
                    )) {
                        return;
                    }
                }

                // 检查role属性
                if (parent.getAttribute('role') === 'navigation') {
                    return;
                }

                parent = parent.parentElement;
            }

            // 如果执行到这里,说明不是导航链接
            const url = target.href;
            if (url && !url.startsWith('javascript:')) {
                e.preventDefault();
                window.open(url, '_blank');
            }
        }
    }, true);
})();