0

当我使用tampermonkey中的userscript或Chrome扩展为youtube制作chrome扩展时,扩展程序在离开页面时无法识别扩展应该运行的页面,最近实施的history.push功能。 因此,例如:YouTube上的Chrome扩展和Tampermonkey

// @include  http://www.youtube.com/feed/subscriptions 

我这样做,因此,当我去我的订阅运行。 但是,当我点击一个视频,它不断加载扩展。 当我把它变成一个扩展的铬时,它仍然运行,即使它不应该运行。

如何查看它是否在某个YouTube页面上然后运行某个代码?

+0

抢,是的,但答案不是最新的。我尝试过,但它基本上没有。 –

+0

你跟着每一步吗?包括使用'// @include *:// www.youtube.com/*'而不是你现在拥有的? –

+0

是的。什么都没发生。 –

回答

1

问题是由通过history.pushState()修改URL的页面引起的。它只会修改显示网址和内容而无需重新加载页面。

所以当你在Tampermonkey上运行脚本时,你需要强制重新加载该操作。

注意:如果您只想在离开订阅页面时使脚本不运行,只需将@match语句更改为您的@include。

// ==UserScript== 
// @name  YT pushState 
// @namespace http://tampermonkey.net/ 
// @version 0.1 
// @match  *://*.youtube.com/* 
// @grant  none 
// ==/UserScript== 

window.history.__proto__.pushState = function(a, b, url) { 
    window.location.href = url; 
} 

if (window.location.href.match(/https?:\/\/www\.youtube\.com\/feed\/.*/)) { 
    console.log("Put main function here!");        
} else { 
    console.log("Ignore this page"); 
} 
+0

仅供参考,在YouTube上,URL在新页面真正加载之前发生变化。如果您的脚本依赖于文档的结构,那么这种常规方法不起作用,因为当URL更改时文档尚未更改。 –

+0

这没关系。这是我的理解,他希望在URL A运行脚本,但不是URL B,而B由history.pushState设置。上面的脚本允许在检测到pushState调用时重新加载整个页面,或者触发可以指示userscript停止正在进行的操作的事件。 – derjanb

+0

如果您位于URL A,则脚本不应运行。当你在URL B时,脚本应该运行。但是,在YouTube的实施中,即使当前页面仍为URL A,URL也已更改为URL B.因此,如果尝试通过拦截pushState调用来检测导航更改,则脚本运行得太早。 –