为什么这个脚本不能用于连续的页面点击?

时间:2013-09-22 23:42:11

标签: javascript youtube cross-browser greasemonkey tampermonkey

我目前在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

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

1 个答案:

答案 0 :(得分:2)

唉,仍然没有真正的"整洁"在Chrome中执行此操作的方法。 (Firefox有更多选择。)

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

Chrome不建议使用其他选项当前,但此处仅供参考:

  • Hack into the history.pushState function。这样可以更快地通知页面更改,但在运行代码之前会发生火灾,因此它仍然需要一个计时器。此外,它还会在用户脚本环境中引入跨范围问题。
  • 使用Mutation Observers监控<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]);
        }
    }
}