Greasy Fork

智能新标签页打开

自动在新标签页打开链接,但保持导航类链接在原页面打开

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

// ==UserScript==
// @name         智能新标签页打开
// @name:en      Smart Tab Opener
// @name:zh-CN   智能新标签页打开
// @version      1.05
// @description  自动在新标签页打开链接,但保持导航类链接在原页面打开
// @description:en  Automatically open links in new tabs, but keep navigation class links open on the original page
// @description:zh-CN  自动在新标签页打开链接,但保持导航类链接在原页面打开
// @author       dal
// @match        *://*/*
// @grant        none
// @license      MIT
// @namespace http://tampermonkey.net/
// ==/UserScript==

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

    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;
            
            // 首先检查链接本身的类名
            if (target.classList) {
                console.log('链接的类名:', Array.from(target.classList));
                if (NAV_RELATED_KEYWORDS.some(navClass => 
                    Array.from(target.classList).some(cls => 
                        cls.toLowerCase().includes(navClass.toLowerCase())
                    )
                )) {
                    isNavLink = true;
                }
            }
            
            // 检查父元素
            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) : '无类名',
                    'role:', parent.getAttribute('role')
                );
                
                // 检查标签名
                if (NAV_RELATED_KEYWORDS.includes(parent.tagName.toLowerCase())) {
                    isNavLink = true;
                    break;
                }
                
                // 检查类名
                if (parent.classList && parent.classList.length > 0) {
                    if (NAV_RELATED_KEYWORDS.some(navClass => 
                        Array.from(parent.classList).some(cls => 
                            cls.toLowerCase().includes(navClass.toLowerCase())
                        )
                    )) {
                        isNavLink = true;
                        break;
                    }
                }
                
                // 检查链接本身的 ID
                if (target.id) {
                    console.log('链接的ID:', target.id);
                    if (NAV_RELATED_KEYWORDS.some(keyword => 
                        target.id.toLowerCase().includes(keyword.toLowerCase())
                    )) {
                        isNavLink = true;
                        break;
                    }
                }
                
                // 检查role属性
                if (parent.getAttribute('role') === 'navigation') {
                    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);
})();