Как вставить скрипт контента в расширение google chrome, когда страница была изменена через историю.толкнуть государство?
Я создаю небольшое расширение google chrome для веб-сайта, и я хочу изменить некоторые html на определенных страницах.
Проблема в том, что сайт загружает свой контент через ajax, и тяжелая история использования.pushState API. Итак, я добавил эту вещь к манифесту:
"content_scripts": [
{
"matches": ["http://vk.com/friends"],
"js": ["js/lib/jquery.min.js", "js/friends.js"],
},
]
Все работает нормально, когда я открываю страницу в первый раз или перезагружаю ее. Но когда я перемещаюсь между страницами сайта, chrome не вставляет мои скрипты на страницу "/ friends". Я думаю, что это происходит потому, что URL-адрес на самом деле не меняйся. Они используют историю.pushState () и поэтому chrome не может снова вставить / перезапустить мой скрипт.
Есть ли какое-либо решение для этого?
2 ответа:
Можно добавить окно .onpopstate событие в Content script и слушать его, когда событие срабатывает вы можете повторно запустить content script снова.
Ссылки
b) расширение.onMessage().addListener
Пример Демонстрации:
манифест.json
Убедитесь, что URL-адрес, введенный скриптом содержимого, и все вкладки API имеют достаточное разрешение в файле манифеста
{ "name": "History Push state Demo", "version": "0.0.1", "manifest_version": 2, "description": "This demonstrates how push state works for chrome extension", "background":{ "scripts":["background.js"] }, "content_scripts": [{ "matches": ["http://www.google.co.in/"], "js": ["content_scripts.js"] }], "permissions": ["tabs","http://www.google.co.in/"] }
content_scripts.js
Отслеживание события onpopstate и отправка запроса на фоновую страницу для повторного запуска скрипта
window.onpopstate = function (event) { //Track for event changes here and //send an intimation to background page to inject code again chrome.extension.sendMessage("Rerun script"); }; //Change History state to Images Page history.pushState({ page: 1 }, "title 1", "imghp?hl=en&tab=wi");
Предыстория.js
Отслеживание запроса от скрипта содержимого и выполнение скрипт на текущую страницу
//Look for Intimation from Content Script for rerun of Injection chrome.extension.onMessage.addListener(function (message, sender, callback) { // Look for Exact message if (message == "Rerun script") { //Inject script again to the current active tab chrome.tabs.executeScript({ file: "rerunInjection.js" }, function () { console.log("Injection is Completed"); }); } });
повторная инъекция.js
Некоторый тривиальный код
console.log("Injected again");
Вывод
Дайте мне знать, если вам понадобится дополнительная информация.
Я смог заставить это работать. Из документов расширения Chrome для webNavigation :
Необходимо задать разрешения для
webNavigation
в манифесте .json :"permissions": [ "webNavigation" ],
Затем в фоне.js :
chrome.webNavigation.onHistoryStateUpdated.addListener(function(details) { console.log('Page uses History API and we heard a pushSate/replaceState.'); // do your thing });