// ==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/ // @downloadURL none // ==/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); })();