2015-05-12 69 views
2

我试图通过使用history.pushState来检测YouTube上的页面更改,但似乎从未触发。我最终想从一个Tampermonkey/Greasemonkey的脚本这方面的工作,为此,我明白你需要注入脚本到实际的页面,我已经像这样做,但无济于事:YouTube未触发history.push状态

html = 
    "var oldState  = history.pushState;"+ 
    "history.pushState = function() {" + 
     "alert('url changed');" + 
     "return oldState.apply(this);" + 
    "}"; 

var head = document.getElementsByTagName("body")[0];   
var script = document.createElement('script'); 
script.type = 'text/javascript'; 
script.innerHTML = html; 
head.appendChild(script); 

我也尝试从调试控制台运行相同的代码:

var oldState  = history.pushState; 
history.pushState = function() { 
    alert('url changed'); 
    return oldState.apply(this); 
}; 

但是,似乎也没有做到这一点。任何人都知道这里发生了什么?

+0

是什么让你觉得'history.pushState'会检测到变化?该方法_adds_是历史记录的入口。检测change_需要监听popstate事件。 – CBroe

+1

我重写了这个函数,或者至少是这个想法。 'onpopstate'似乎只在按下后退和前进按钮时触发(从我测试过的)。请参阅http://stackoverflow.com/a/4585031/1107110 –

+0

啊,好的。首先检查了脚本插入是否真的有效?就像试图在那里放置一个'console.log'语句一样,看看是否生成了预期的输出... – CBroe

回答

4

YouTube使用spfjs来操纵pushState。然而,它通常在猴子修补它之前抓住该功能。这就是您遇到问题的原因。

在加载spf.js之前,您可以在页面中将您的猴子补丁脚本向上移动,或者您可以像spfdone那样寻找spf events来检测更改。

+0

作品,欢呼! –

+0

@DrazenBjelovuk你最终如何解决它? – cprcrack

+1

嗨@cprcrack,请参阅http://stackoverflow.com/a/30199872/1107110。 –