1

我目前在 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 中完美运行,但在 Google Chrome 中,它似乎只适用于第一次点击 YouTube 视频。

更具体地说,如果我点击 YouTube 视频:
   youtube.com/watch ?v=MijmeoH9LT4 ,
它会将我重定向到:
   youtube.com/watch ?v=MijmeoH9LT4&user=Computerphile

但是,如果我单击相关视频垂直栏中的视频,它似乎不会进行任何进一步的重定向。

4

1 回答 1

2

唉,在 Chrome 中仍然没有真正“简洁”的方法来做到这一点。(Firefox 有更多选择。)

你最好的选择就是投票location.search;见下文。

目前,不推荐您在 Chrome 中使用的其他选项 - 但此处仅供参考:

  • 破解history.pushState函数。这可以更快地通知页面更改,但在您运行代码之前会触发,因此它仍然需要一个计时器。另外,它在用户脚本环境中带来了跨范围的问题。
  • 使用 Mutation Observers 来监控<title>标签的变化。这可能工作正常,但可能会在您想要它之后触发,从而导致延迟和发音为“闪烁”。也可能不适用于设计不佳的页面(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]);
        }
    }
}
于 2013-09-23T02:45:43.733 回答