YouTube新标签页打开

Open YouTube videos in new tab with intelligent filtering

You will need to install an extension such as Tampermonkey, Greasemonkey or Violentmonkey to install this script.

You will need to install an extension such as Tampermonkey to install this script.

You will need to install an extension such as Tampermonkey or Violentmonkey to install this script.

You will need to install an extension such as Tampermonkey or Userscripts to install this script.

You will need to install an extension such as Tampermonkey to install this script.

You will need to install a user script manager extension to install this script.

(I already have a user script manager, let me install it!)

Advertisement:

You will need to install an extension such as Stylus to install this style.

You will need to install an extension such as Stylus to install this style.

You will need to install an extension such as Stylus to install this style.

You will need to install a user style manager extension to install this style.

You will need to install a user style manager extension to install this style.

You will need to install a user style manager extension to install this style.

(I already have a user style manager, let me install it!)

Advertisement:

// ==UserScript==
// @name         YouTube新标签页打开
// @namespace    your_namespace
// @version      2.1.0
// @description:zh-cn YouTube视频新标签页打开点击油猴图标可以切换首页非首页模式
// @author       YourName
// @match        *://*.youtube.com/*
// @license      无
// @grant        GM_registerMenuCommand
// @grant        GM_getValue
// @grant        GM_setValue
// @grant        GM_unregisterMenuCommand
// @description Open YouTube videos in new tab with intelligent filtering
// ==/UserScript==

(function() {
    'use strict';

    // 配置存储(默认全局模式)
    const CONFIG = {
        globalMode: GM_getValue('globalMode', true)
    };

    // 清理旧菜单项
    let currentMenuIds = [];
    const updateMenu = () => {
        currentMenuIds.forEach(id => GM_unregisterMenuCommand(id));
        currentMenuIds = [];

        currentMenuIds.push(GM_registerMenuCommand(
            `${CONFIG.globalMode ? "✅" : "❌"} 全局模式(所有页面生效)`,
            () => setMode(true)
        ));

        currentMenuIds.push(GM_registerMenuCommand(
            `${!CONFIG.globalMode ? "✅" : "❌"} 首页模式(主页+频道页生效)`,
            () => setMode(false)
        ));
    };

    // 模式切换
    const setMode = (global) => {
        CONFIG.globalMode = global;
        GM_setValue('globalMode', global);
        location.reload();
    };

    // 页面类型判断
    const isHomePage = () => window.location.pathname === "/";
    const isChannelPage = () => /^\/(channel\/|user\/|c\/|@)/.test(window.location.pathname);
    const isSearchPage = () => window.location.pathname === "/results"; // 新增搜索页判断

    // 链接类型判断
    const isSpecialLink = (target) => {
        // 用户资料链接检测
        try {
            const url = new URL(target.href);
            if (/^\/(channel\/|user\/|c\/|@)/.test(url.pathname)) {
                return !target.closest('ytd-channel-name, ytd-playlist-panel-video-renderer');
            }
        } catch {}

        // 视频链接检测
        return /(\/watch\?v=|\/shorts\/)/.test(target.href) &&
               !target.closest('ytd-channel-name, ytd-playlist-panel-video-renderer');
    };

    // 主处理逻辑
    const initHandler = () => {
        document.addEventListener('click', (event) => {
            let target = event.target;
            while (target?.parentElement && target.tagName !== 'A') {
                target = target.parentElement;
            }
            if (!target?.href) return;

            // 强制处理用户资料链接
            try {
                const url = new URL(target.href);
                if (/^\/(channel\/|user\/|c\/|@)/.test(url.pathname)) {
                    event.preventDefault();
                    event.stopPropagation();
                    window.open(target.href, '_blank');
                    return;
                }
            } catch {}

            // 修改后的判断条件(新增搜索页判断)
            const shouldHandle =
                isSearchPage() ||  // 搜索页强制生效
                CONFIG.globalMode ||  // 全局模式
                (isHomePage() || isChannelPage()) && !CONFIG.globalMode;  // 首页模式

            if (shouldHandle && isSpecialLink(target)) {
                event.preventDefault();
                event.stopPropagation();

                const isShort = target.href.includes('/shorts/');
                window.open(target.href, '_blank');

                if (isShort && window.location.pathname.startsWith('/shorts/')) {
                    window.location.replace("about:blank");
                }
            }
        }, true);
    };

    // 初始化
    updateMenu();
    initHandler();
})();