2011-01-10 3 views
13

Я разрабатываю расширение Chrome для настройки Facebook. Тем не менее, для отслеживания действий в браузерах с поддержкой HTML5, таких как Facebook, требуется переопределение window.history.pushState, как описано in this SO question.мониторинг history.pushstate от хромированного расширения

К сожалению, кажется, что изолированные миры Chrome не допускают такого рода переопределение. Есть ли другой способ улавливания изменений истории (кроме опроса document.location.href)?

ответ

4

Да,

Один из способов создать тег сценария и поместить код там:

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

Что делать, если вы хотите перехватить команду pushstate, сделать что-то, а затем позволить команде pushstate выполнить как обычно, приведенный выше пример, похоже, перехватывает тонкости pushstate, но на самом деле он не выполняет команду pushstate, как вы бы это реализовали? – user280109

+0

нашел решение здесь, не уверен, что он работает с хромом, хотя: http://stackoverflow.com/questions/4570093/how-to-get-notified-about-changes-of-the-history-via-history- pushstate/4585031 # 4585031 – user280109

+0

Неужели это перестало работать после того, как был отправлен ответ, или есть какое-то разрешение и т. д., которое не указано ...? –

2

Чтобы продолжить действие по умолчанию, сохранить ссылку на исходную функцию PushState, а затем вызвать это:

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

Не уверен, пытаетесь ли вы сделать это в background.js или content.js, но если это первое, что вы можете сделать это, используя webNavigation событие:

Вам необходимо установить разрешения для webNavigation в манифесте. JSON:

"permissions": [ 
    "webNavigation" 
    ], 

Тогда в background.js:

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

Источник: Chrome Extension docs for webNavigation

+1

Что делать, если это в content.js? Вы все еще должны взломать? –