Greasy Fork

链接新标签页打开工具

自动在新标签页打开链接,但保持导航类链接的默认打开行为

目前为 2024-11-26 提交的版本。查看 最新版本

// ==UserScript==
// @name         链接新标签页打开工具
// @name:en      Smart Tab Opener
// @name:zh-CN   智能新标签页打开
// @version      1.12
// @description  自动在新标签页打开链接,但保持导航类链接的默认打开行为
// @description:en  Open links automatically in new tabs, but keep the default open behavior of navigation class links
// @description:zh-CN  自动在新标签页打开链接,但保持导航类链接的默认打开行为
// @author       dal
// @match        *://*/*
// @grant        none
// @license      MIT
// @namespace http://tampermonkey.net/
// ==/UserScript==

(function() {
    'use strict';
    
    const NAV_RELATED_ELEMENTS = [
        'nav',
        'menu',
        'dropdown',
        'header',
        'select',
        'navigat',
        'section',
        'button',
    ];
    
    // 导航相关的类名关键字
    const NAV_RELATED_CLASS_KEYWORDS = [
        'nav',
        'menu',
        'dropdown',
        'header',
        'select',
        'navigat',
        'breadcrumb',
        'section',
        'chapter',
        'tree',
        'n-tab-links',
        'channel',
        'side-bar',
        'sidebar'
    ];

    document.addEventListener('click', function(e) {
        console.log('点击事件触发:', e.target);
        
        // 查找被点击元素的最近的 A 标签父元素
        let target = e.target;
        while (target && target.tagName !== 'A') {
            target = target.parentElement;
        }
        
        // 如果找到了链接元素
        if (target && target.tagName === 'A') {
            console.log('找到链接元素:', target);
            console.log('链接href:', target.href);
            
            let isNavLink = false;
            
            // 检查父元素
            let parent = target;
            for (let depth = 0; depth < 5; depth++) {
                if (!parent) break;
                
                console.log(`检查第 ${depth + 1} 层父元素:`, parent.tagName, 
                    parent.classList ? Array.from(parent.classList) : '无类名',
                );
                
                // 检查标签名
                if (NAV_RELATED_ELEMENTS.includes(parent.tagName.toLowerCase())) {
                    console.log(`与导航相关的标签名:`, parent.tagName);
                    isNavLink = true;
                    break;
                }
                
                // 检查类名
                if (parent.classList && parent.classList.length > 0) {
                    if (NAV_RELATED_CLASS_KEYWORDS.some(navClass => 
                        Array.from(parent.classList).some(cls => 
                            cls.toLowerCase().includes(navClass.toLowerCase())
                        )
                    )) {
                        console.log(`与导航相关的类名:`, 
                            parent.classList ? Array.from(parent.classList) : '无类名',
                        );
                        isNavLink = true;
                        break;
                    }
                }
                
                // 检查链接本身的 ID
                if (parent.id) {
                    if (NAV_RELATED_CLASS_KEYWORDS.some(keyword => 
                        target.id.toLowerCase().includes(keyword.toLowerCase())
                    )) {
                        console.log('与导航相关的的ID:', parent.id);
                        isNavLink = true;
                        break;
                    }
                }
                
                parent = parent.parentElement;
            }
            
            const url = target.href;
            if (url && !url.startsWith('javascript:')) {
                // 如果是导航链接
                if (isNavLink) {
                    console.log('这是一个导航链接');
                    // 检查是否设置为新标签页打开
                    if (target.target === '_blank') {
                        console.log('原本是新标签页打开,改为当前页面打开');
                        e.preventDefault();
                        window.location.href = url;
                    } else {
                        console.log('保持默认打开方式');
                    }
                } else {
                    // 非导航链接,在新标签页打开
                    console.log('非导航链接,在新标签页打开');
                    e.preventDefault();
                    window.open(url, '_blank');
                }
            }
        }
    }, true);
})();