YouTube 搜索重定向至 Google

将 YouTube 的所有搜索行为(搜索框、回车、搜索建议)重定向到新的谷歌标签页,并限定在 youtube.com 范围内搜索。

当前为 2025-10-22 提交的版本,查看 最新版本

您需要先安装一个扩展,例如 篡改猴Greasemonkey暴力猴,之后才能安装此脚本。

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

您需要先安装一个扩展,例如 篡改猴暴力猴,之后才能安装此脚本。

您需要先安装一个扩展,例如 篡改猴Userscripts ,之后才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。

您需要先安装用户脚本管理器扩展后才能安装此脚本。

(我已经安装了用户脚本管理器,让我安装!)

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

(我已经安装了用户样式管理器,让我安装!)

// ==UserScript==
// @name         YouTube to Google Site Search
// @name:zh-CN   YouTube 搜索重定向至 Google
// @namespace    http://tampermonkey.net/
// @version      1.2
// @description  Redirects all YouTube searches (from search box, suggestions, or enter key) to a Google search with "site:youtube.com" in a new tab.
// @description:zh-CN 将 YouTube 的所有搜索行为(搜索框、回车、搜索建议)重定向到新的谷歌标签页,并限定在 youtube.com 范围内搜索。
// @author       Gemini & Your Name
// @match        https://www.youtube.com/*
// @grant        none
// @run-at       document-end
// ==/UserScript==

(function() {
    'use strict';

    // 设置一个定时器来重复检测搜索框是否存在,以应对 YouTube 的动态加载机制(SPA)
    const interval = setInterval(initializeSearchOverride, 500);

    function initializeSearchOverride() {
        // 1. 选取所有需要的元素
        const searchForm = document.querySelector('form.ytSearchboxComponentSearchForm');
        const searchInput = document.querySelector('input.ytSearchboxComponentInput');
        const searchButton = document.querySelector('button.ytSearchboxComponentSearchButton');
        const suggestionsContainer = document.querySelector('div.ytSearchboxComponentSuggestionsContainer');

        // 如果在页面上找到了所有需要的元素,并且它们还没有被我们的脚本处理过
        if (searchForm && searchInput && searchButton && suggestionsContainer && !searchForm.dataset.searchOverrideActive) {

            console.log("YouTube 搜索脚本:检测到搜索组件,正在应用修改...");

            // --- 核心功能函数 ---

            // A. 定义统一的 Google 搜索函数
            function performGoogleSiteSearch(query) {
                if (query && typeof query === 'string' && query.trim()) {
                    const googleSearchUrl = `https://www.google.com/search?q=${encodeURIComponent(query.trim())}+site:youtube.com`;
                    window.open(googleSearchUrl, '_blank');
                }
            }

            // B. 定义通用的事件处理器,用来彻底阻止 YouTube 的默认行为
            function universalSearchOverride(event) {
                event.preventDefault();
                event.stopPropagation();
                event.stopImmediatePropagation();
                return false;
            }

            // C. 处理“搜索按钮”和“回车键”的行为
            function handleFormSubmit(event) {
                universalSearchOverride(event);
                const query = searchInput.value;
                performGoogleSiteSearch(query);
                searchInput.blur(); // 搜索后移除焦点
            }

            // D. 处理“推荐列表”的点击行为
            function handleSuggestionClick(event) {
                const suggestionItem = event.target.closest('div.ytSuggestionComponentSuggestion');
                if (suggestionItem) {
                    universalSearchOverride(event);
                    const queryElement = suggestionItem.querySelector('[aria-label]');
                    if (queryElement) {
                        const query = queryElement.getAttribute('aria-label');
                        performGoogleSiteSearch(query);
                        suggestionsContainer.setAttribute('hidden', '');
                        searchInput.value = query;
                        searchInput.blur(); // 移除焦点,防止列表重现
                    }
                }
            }

            // --- 绑定事件 ---

            // 使用事件捕获 (第三个参数为 true) 来确保我们的脚本最先运行
            searchForm.addEventListener('submit', handleFormSubmit, true);
            searchButton.addEventListener('click', handleFormSubmit, true);
            suggestionsContainer.addEventListener('mousedown', handleSuggestionClick, true);
            suggestionsContainer.addEventListener('click', handleSuggestionClick, true);

            // --- 标记为已处理 ---

            // 给元素添加一个自定义属性,防止重复绑定事件
            searchForm.dataset.searchOverrideActive = 'true';
            console.log("YouTube 搜索脚本:修改应用成功!");

            // (可选)如果想让脚本在成功绑定一次后就停止检测,可以取消下面的注释
            // clearInterval(interval);
        }
    }
})();