// ==UserScript== // @name 智能新标签页打开 // @name:en Smart Tab Opener // @namespace http://tampermonkey.net/ // @version 1.01 // @description 智能识别导航链接和内容链接,自动在新标签页打开内容 // @description:en Automatically open content links in new tabs while keeping navigation links in the current page // @author [你的名字] // @match *://*/* // @grant none // @license MIT // @downloadURL none // ==/UserScript== (function() { 'use strict'; // 导航相关的标签和类名 const NAV_RELATED_ELEMENTS = [ 'nav', 'menu', 'select', 'header', 'dropdown', 'navigation', 'section', 'chapter', 'button', 'bar', ]; // 导航相关的类名关键字 const NAV_RELATED_CLASSES = [ 'nav', 'menu', 'dropdown', 'header', 'select', 'navigation', 'breadcrumb', 'js-selected-navigation-item', 'section', 'chapter', 'tree', 'button', 'bar', ]; 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); })();