如何让UserScript仅作用于YouTube站点而非内嵌视频?
解决YouTube UserScript干扰内嵌视频的问题
嘿,这个问题我太懂了!你遇到的核心问题是脚本没有区分顶层YouTube页面和内嵌在其他网站的YouTube iframe——用window.location判断的话,内嵌iframe的地址也是YouTube的,所以脚本会错误地在里面执行,导致内嵌视频挂掉。
两步搞定这个问题:
1. 先在UserScript元数据里锁定生效范围
首先确保你的脚本只在YouTube主站触发,不要让它跑到其他网站去。在脚本开头的元数据里,把@match设置成严格匹配YouTube主站:
// ==UserScript== // @name 你的脚本名称(比如Force Old YouTube Layout) // @version 0.1 // @description 强制YouTube加载旧版站点样式 // @author 你的名字 // @match https://www.youtube.com/* // @grant none // ==/UserScript==
这一步先把脚本的触发范围限制在YouTube主域名下,避免在完全无关的页面运行。
2. 加入顶层窗口判断,排除内嵌iframe
这是关键!在脚本逻辑最开头,加上判断当前页面是否是顶层窗口——也就是用户直接打开的YouTube页面,而不是嵌在其他网站里的iframe:
(function() { 'use strict'; // 核心判断:只在顶层窗口执行脚本,内嵌iframe直接退出 if (window.top !== window.self) { return; } // 下面是你原来的逻辑,比如追加旧版样式的配置项 const url = new URL(window.location.href); // 替换成你实际用来强制旧版样式的参数 const oldLayoutParam = 'disable_polymer'; // 避免重复添加参数导致循环跳转 if (!url.searchParams.has(oldLayoutParam)) { url.searchParams.set(oldLayoutParam, '1'); window.location.href = url.toString(); } })();
为什么这样有效?
window.top指向整个浏览器窗口的顶层页面,window.self指向当前脚本所在的页面。如果是内嵌的YouTube iframe,window.self是iframe本身,window.top是外面的父页面,两者不相等,脚本就会直接退出,不会干扰内嵌视频。- 用
URL对象处理参数比直接拼接字符串更安全,还能避免重复添加参数导致的无限跳转问题。
另外你提到之前用的另一种URL获取方法,应该是document.URL,它和window.location.href效果差不多,但核心问题不在URL的获取方式,而是没有判断页面上下文。
内容的提问来源于stack exchange,提问作者Khatharr
相关产品推荐
相关产品推荐

