我目前在Google Chrome中的Tampermonkey中使用以下脚本:
// ==UserScript==
// @name Youtube opt in Ads per channel
// @namespace schippi
// @include http://www.youtube.com/watch*
// @version 1
// ==/UserScript==
var u = window.location.href;
if (u.search("user=") == -1) {
var cont = document.getElementById("watch7-user-header").innerHTML;
var user=cont.replace(/.+\/user\//i,'').replace(/\?(?:.|\s)*/m,'');
window.location.href = u+"&user="+user;
}
它似乎在使用Greasemonkey的Firefox中完美运行,但在谷歌浏览器中,它似乎只适用于YouTube视频的第一次点击。
更具体地说,如果我点击YouTube视频:
youtube.com/watch?v=MijmeoH9LT4,
它将我重定向到:
youtube.com/watch?v=MijmeoH9LT4&user=Computerphile
但是,如果我点击相关视频垂直栏中的视频,它似乎不再进行任何重定向。
答案 0 :(得分:2)
您最好的选择就是投票location.search
;见下文。
Chrome不建议使用其他选项当前,但此处仅供参考:
history.pushState
function。这样可以更快地通知页面更改,但在运行代码之前会发生火灾,因此它仍然需要一个计时器。此外,它还会在用户脚本环境中引入跨范围问题。<title>
标记的更改。这可能会运作正常,但可能会在您需要它之后触发,导致延迟并发出声音&#34;闪烁&#34;。也可能无法在设计不佳的网页上使用(YouTube可以)。
另请注意,问题中的replace()
语句会在几种情况下炸毁URL和404脚本。使用DOM方法获取用户(见下文)。
轮询代码(简单,强大,跨浏览器):
// ==UserScript==
// @name Youtube opt in Ads per channel
// @namespace schippi
// @include http://www.youtube.com/watch*
// @version 1
// @grant GM_addStyle
// ==/UserScript==
/*- The @grant directive is needed to work around a design change
introduced in GM 1.0. It restores the sandbox.
*/
var elemCheckTimer = null;
var pageURLCheckTimer = setInterval (
function () {
if (this.lastQueryStr !== location.search) {
this.lastQueryStr = location.search;
gmMain ();
}
}
, 111 //-- Nine times a second. Plenty fast w/o bogging page
);
function gmMain () {
if ( ! /user=/.test (window.location.href) ) {
elemCheckTimer = setInterval (checkUserAndRelocate, 24);
}
}
function checkUserAndRelocate () {
var elem = document.querySelector (
"#watch7-user-header a[href*='/user/']"
);
if (elem) {
clearInterval (elemCheckTimer);
var user = elem.href.match (/\/user\/(\w+)\W?/);
if (user && user.length > 1) {
location.replace (location.href + "&user=" + user[1]);
}
}
}