Расширение Chrome - Сценарии содержимого несколько раз накапливаются по ссылкам/навигации AJAX

StackOverflow https://stackoverflow.com/questions/7835743

Вопрос

Я очень близок к тому, чтобы отлично работать в 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"});
    }
});
});
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top