Расширение Chrome - Сценарии содержимого несколько раз накапливаются по ссылкам/навигации AJAX
-
27-10-2019 - |
Вопрос
Я очень близок к тому, чтобы отлично работать в Chrome, но сейчас сталкиваюсь с последним выпуском.
Проблема, по -видимому, связана с тем, что сценарий контента неоднократно вводится на таких сайтах, как Facebook, где вся страница не перезагружается при щелчке по ссылке и т. Д.
Я думаю, что проблема связана с тем, что сайт очень зависит от AJAX.
Если я обновляю всю страницу или загружаю ее в первый раз, то нет проблем. Мое расширение работает, и сценарий контента вводится должным образом.
Однако, если я загружаю страницу в начальное время, нажмите на ссылку на сайте, «раздел контента» Facebook загрузит любую ссылку, на которую вы нажали, в то время как плавая синяя навигационная панель вверху не обновляется и не изменяется вообще.
Т.е. вся страница не перезагружается. Поскольку как «раздел контента» сайта, так и панель навигации находятся в одном и том же кадре, сценарий контента просто продолжает вводить в другой раз для каждой ссылки, которую вы нажимаете.
Поэтому в конце концов я вижу в своем журнале консоли, что он работает 2x, 3x, 4x, 5x и т. Д., Когда я нажимаю по большему количеству ссылок, число увеличивается на 1 каждый раз.
Итак, мой вопрос в следующем:
Есть ли простой способ проверить, уже присутствует ли сценарий содержимого, прежде чем вводить его снова? Или что еще можно использовать в качестве обходной работы для такой ситуации?
Решение
Я предсказал аналогичную проблему при написании сценария контента для моего расширения, поэтому я добавил уникальный атрибут в <body>
Элемент каждой страницы с именем расширения и версией.
Прежде всего, сценарий содержимого проверяет, уже ли этот атрибут уже сценария и останавливается, если это так. В противном случае он добавит этот атрибут (со значением true
и продолжить с его целью.
Если вы хотите увидеть мой решение;
Немного более сложный аспект этой техники извлекает версию, используя передача сообщения и анализ манифеста (извлечен в запрос Ajax) в объект JSON.
Чтобы точно увидеть, как я достиг этого взгляда на init
а также onRequestHelper
функции здесь;
Конечно, вы можете просто кодировать версию или полностью ее опустить. Пока имя атрибута уникально.
Другие советы
В родительском кадре, не могли бы вы добавить window.doneInjecting = true;
или что -то подобное? (Или, возможно, добавьте скрытый элемент на страницу - я не уверен, могут ли дочерние рамки получить доступ к переменным JavaScript своих родителей)
Но в основном устанавливая простой флаг, так что каждый раз, когда ваш сценарий контента вводится, проверяют, существует ли флаг, и продолжается только в том случае, если нет?
Оснащенные пожары каждый раз, когда состояние вкладки меняется. Просто загрузите свои сценарии контента на changeInfo.status == "complete"
founal.js
chrome.tabs.onUpdated.addListener(function(tabId, changeInfo, tab) {
chrome.tabs.getSelected(null, function(tab) {
// Do some stuff
if (changeInfo.status == "complete")
{
// load your scripts here
chrome.tabs.executeScript(tabId, {file: "jquery.js"});
chrome.tabs.executeScript(tabId, {file: "jquery.highlight.js"});
}
});
});