将 YouTube 的所有搜索行为(搜索框、回车、搜索建议)重定向到新的谷歌标签页,并限定在 youtube.com 范围内搜索。
当前为
// ==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);
}
}
})();