2011-01-10 45 views
13

Tôi đang phát triển tiện ích mở rộng của Chrome để tinh chỉnh Facebook. Tuy nhiên, việc bắt các hành động duyệt web trong các trang web hỗ trợ HTML5 như Facebook yêu cầu ghi đè window.history.pushState như được giải thích in this SO question.theo dõi history.pushstate từ tiện ích mở rộng chrome

Thật không may, có vẻ như thế giới bị cô lập của Chrome ngăn chặn loại ghi đè này. Có phương pháp nào khác để bắt các thay đổi lịch sử (không phải là bỏ phiếu document.location.href)?

Trả lời

4

Vâng,

Một cách là tạo ra một thẻ script và đưa code của bạn có:

html = "window.history.pushState = function(a,b,c) { alert('Change !'); };"; 

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

điều gì sẽ xảy ra nếu bạn muốn chặn lệnh pushstate, làm điều gì đó, và sau đó để lệnh pushstate hoàn thành như bình thường, ví dụ ở trên dường như ngăn chặn tiền phạt pushstate, nhưng nó không thực sự thực hiện lệnh pushstate sau đó bạn sẽ thực hiện điều đó? – user280109

+0

tìm thấy giải pháp ở đây, không chắc chắn liệu nó có hoạt động với chrome hay không: http://stackoverflow.com/questions/4570093/how-to-get-notified-about-changes-of-the-history-via-history- pushstate/4585031 # 4585031 – user280109

+0

Điều này đã ngừng hoạt động kể từ khi câu trả lời đã được đăng, hoặc là có một số quyền vv được bỏ ra ...? –

2

Tiếp tục thực hiện hành động mặc định, tiết kiệm một tham chiếu đến các chức năng pushState ban đầu, và sau đó gọi nó:

var headID = document.getElementsByTagName("head")[0];   
var newScript = document.createElement('script'); 
newScript.type = 'text/javascript'; 
newScript.src = chrome.extension.getURL('script.js'); 
headID.appendChild(newScript); 

script.js:

window.history.pushState = (function(nativePushState) { 
    return function(a,b,c) { 
     // Do something 
     nativePushState.apply(this, arguments); //Continue by calling native history.pushState 
    }; 
})(window.history.pushState) 
6

Không chắc cho dù bạn cố gắng để làm điều này trong background.js hoặc content.js, nhưng nếu đó là trước đây, bạn có thể làm như vậy bằng sự kiện webNavigation:

Bạn cần thiết lập quyền cho webNavigation trong manifest. json:

"permissions": [ 
    "webNavigation" 
    ], 

Sau đó, trong background.js:

chrome.webNavigation.onHistoryStateUpdated.addListener(function(details) { 
     console.log('Page uses History API and we heard a pushSate/replaceState.'); 
     // do your thing 
    }); 

Nguồn: 0.123.

+1

Điều gì sẽ xảy ra nếu nó trong content.js? Bạn vẫn phải làm một hack? –

Các vấn đề liên quan