我正在尝试通过关键字从 Youtube 播放器中删除某些“相关视频”(显示在视频末尾)。目的是有时有一些我不想看到的内容。
我是一个完全的油脂猴和 JavaScript 菜鸟。不过,到目前为止,我想出的最好的方法如下。此示例删除任何带有关键字“解剖”的“相关视频”。
// ==UserScript==
// @name Remove related youtubes2
// @include http://*.youtube.com/*
// @require http://ajax.googleapis.com/ajax/libs/jquery/1.6.2/jquery.min.js
// @require https://gist.github.com/raw/2625891/waitForKeyElements.js
// @grant GM_addStyle
// ==/UserScript==
waitForKeyElements ("#player-api", action);
function action (jNode) {
var playerapi = jNode.html ();
var lastapi = jNode.data ("lastapi") || "";
if (playerapi != lastapi) {
playerapi = playerapi.replace(/title%3D(.(?!%26))*?anatomy(?!%2C)(.(?!%2C))*?id%3D[\w-]{11}/ig, 'id%3D');
playerapi = playerapi.replace(/id%3D[\w-]{11}(?!%2C)(?=([^&](?!%2C))*?anatomy)/ig, 'id%3D');
jNode.html (playerapi);
jNode.data ("lastapi", jNode.html ());
}
return true;
}
用自然语言来解释,上面的代码依赖 waitForKeyElements 来监听 #player-api 元素发生的变化,其中包含“相关视频”。函数“action”将#player-api 保存到playerapi 中。lastapi 是旧的 playerapi 内容。如果 playerapi 发生变化,带有关键字“解剖”的“相关视频”将被正则表达式删除。playerapi 保存到 lastapi 中,以便下次比较。
现在尝试搜索“grey's anatomy”(对不起,我对这个节目没有任何反对意见,只是一个例子)。然后转到视频的末尾。您会看到标题中包含“解剖学”的所有“相关视频”都将被删除(在其他“相关视频”中被黑色方块替换)。这按预期工作(正则表达式也是如此)。
当您从侧边栏(右侧)单击相关视频时,问题就开始了。再次转到视频的末尾。您将看到该脚本已停止使用关键字“解剖”过滤后续“相关视频”。但是,如果您从浏览器按重新加载,则脚本会再次正确过滤。(我知道如何删除侧边栏视频,这里没有包含代码)。
诊断:当您从侧边栏中单击“相关视频”时,Youtube 不会更新#player-api 元素本身,而是动态更新页面中的其他一些元素(我不知道是哪个)。#player-api 本身不会改变(除非你重新加载整个 Youtube 页面),所以函数“action”永远不会找到改变的 #player-api 来操作,除非你“重新加载”整个页面。
问题:当您从侧边栏中单击相关视频时,Youtube 是否会刷新内联代码区域?如果是这样,我该如何解释?有没有更简单的方法来完成这一切?
先感谢您。