Greasy Fork

Greasy Fork is available in English.

YouTube新标签页打开

Open YouTube videos in new tab with intelligent filtering

当前为 2025-01-27 提交的版本,查看 最新版本

// ==UserScript==
// @name         YouTube新标签页打开
// @namespace    your_namespace
// @version      1.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', false) // 默认关闭全局模式
    };

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

    // 更新菜单显示
    function updateMenu() {
        clearMenu();

        // 添加带状态指示的菜单项
        currentMenuIds.push(
            GM_registerMenuCommand(
                `${CONFIG.globalMode ? "✅" : "  "} 全局模式(所有页面生效)`,
                () => setMode(true)
            )
        );

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

    // 模式切换处理
    function setMode(global) {
        CONFIG.globalMode = global;
        GM_setValue('globalMode', global);
        location.reload(); // 新增页面刷新
    }

    // 判断是否在首页
    function isHomePage() {
        return window.location.pathname === "/";
    }

    // 主逻辑(根据模式处理点击)
    function initHandler() {
        document.addEventListener('click', function handleClick(event) {
            // 仅在全局模式 或 首页模式+在首页 时生效
            if (!CONFIG.globalMode && !isHomePage()) return;

            let target = event.target;
            while (target && target.tagName !== 'A') {
                target = target.parentElement;
            }

            if (target && target.href && isVideoLink(target)) {
                event.preventDefault();
                event.stopPropagation();

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

                // 修复逻辑:仅当当前在短视频页面时才跳转空白页
                if (isShortLink && isShortPage()) {
                    window.location.replace("about:blank");
                }
            }
        }, true);
    }

    // 新增辅助函数
    function isShortPage() {
        return window.location.pathname.startsWith('/shorts/');
    }

    function isVideoLink(aTag) {
        return /(\/watch\?v=|\/shorts\/)/.test(aTag.href) &&
               !aTag.closest('ytd-channel-name, ytd-playlist-panel-video-renderer');
    }

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