// ==UserScript== // @name 智能新标签页打开 // @name:en Smart Tab Opener // @name:zh-CN 新标签页打开链接 // @namespace http://tampermonkey.net/ // @version 1.02 // @description 自动在新标签页打开链接,但保持导航类链接在当前页面打开 // @description:en Automatically open links in new tab while keeping navigation links in current tab // @description:zh-CN 自动在新标签页打开链接,但保持导航类链接在当前页面打开 // @author dal // @match *://*/* // @grant none // @license MIT // @downloadURL none // ==/UserScript== (function() { 'use strict'; // 导航相关的类名关键字 const NAV_RELATED_KEYWORDS = [ 'nav', 'menu', 'dropdown', 'header', 'select', 'navigat', 'breadcrumb', 'js-selected-navigation-item', 'section', 'chapter', 'tree', 'button', 'bar', 'tab', 'btn', 'channel' ]; // 导航相关的 ID 关键字 const NAV_RELATED_ID_KEYWORDS = [ 'nav', 'menu', 'header', 'dropdown', 'navigation', 'breadcrumb', 'sidebar', 'topbar', 'tab', 'button', 'btn' ]; 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); // 首先检查链接本身的类名 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()) ) )) { console.log('链接本身包含导航相关类名,保持默认行为'); return; } } // 检查链接本身的 ID if (target.id) { console.log('链接的ID:', target.id); if (NAV_RELATED_ID_KEYWORDS.some(keyword => target.id.toLowerCase().includes(keyword.toLowerCase()) )) { console.log('链接ID包含导航相关关键字,保持默认行为'); return; } } // 检查父元素 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())) { console.log('父元素标签名匹配导航相关元素,保持默认行为'); return; } // 检查类名 if (parent.classList && parent.classList.length > 0) { if (NAV_RELATED_KEYWORDS.some(navClass => Array.from(parent.classList).some(cls => cls.toLowerCase().includes(navClass.toLowerCase()) ) )) { console.log('父元素类名匹配导航相关类名,保持默认行为'); return; } } // 检查role属性 if (parent.getAttribute('role') === 'navigation') { console.log('父元素具有navigation角色,保持默认行为'); return; } parent = parent.parentElement; } // 如果执行到这里,说明不是导航链接 const url = target.href; if (url && !url.startsWith('javascript:')) { console.log('非导航链接,在新标签页打开:', url); e.preventDefault(); window.open(url, '_blank'); } } }, true); })();