2015-05-12 106 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。 –