每次加载适当的页面时,如何使脚本仅重定向一次?

How to make a script redirect only once every time an appropriate page loads?

我正在编写一个 Tampermonkey 脚本,我想用它从 youtube.com/* 重定向到 YouTube 频道地址。

window.addEventListener ("load", LocalMain, false);

function LocalMain () {
    location.replace("https://www.youtube.com/channel/*");
}

当脚本是 运行 时,它重定向到频道 URL 但随后保持 运行 并且 继续重定向 .

在重新分配新的 href

之前,您需要检查当前 pathname 是否包含 channel
function LocalMain () {

     if(!location.pathname.includes('/channel/')) {
        location.replace("https://www.youtube.com/channel/*");
     }
}

另请注意,您不需要window加载事件来完成此操作

您可以检查位置是否包含 'channel',然后在更改位置之前检查 return。

window.addEventListener ("load", LocalMain, false);

function LocalMain () {
    if(location.href.indexOf('channel') === -1) return;
    location.replace("https://www.youtube.com/channel/*");
}

tampermonkey 是否仅在您的频道 URL 上 时配置为 运行 脚本?

如果不是...那么您的脚本可能会讽刺地做您想要的:每个页面加载一次 运行ning。然后脚本加载一个新页面。

您可以在脚本中修复此问题,如下所示:

window.addEventListener ('load', localMain, false);

function localMain () {
    if (location.href.startsWith('https://www.youtube.com/channel/')) {
        return; // exit
    }
    location.replace('https://www.youtube.com/channel/*');
}

标准的、更有效执行速度更快的方法是在重定向页面上将脚本的 metadata 调整为甚至 运行。

此外,使用 // @run-at document-start 以获得更好的响应。

所以你的脚本会变成这样:

// ==UserScript==
// @name        YouTube, Redirect to my channel
// @match       https://www.youtube.com/*
// @exclude     https://www.youtube.com/channel/*
// @run-at      document-start
// ==/UserScript==

location.replace("https://www.youtube.com/channel/UC8VkNBOwvsTlFjoSnNSMmxw");

此外,对于此类 "broad spectrum" 重定向脚本,请考虑使用 location.assign() 以便您或您的用户可以在重定向过度的情况下恢复历史记录中的原始 URL。