Расширение Chrome - несколько сценариев контента накапливаются несколько раз из AJAX Links / Navigation - PullRequest
5 голосов
/ 20 октября 2011

Я очень близок к тому, чтобы работать с моим расширением Chrome, но сейчас у меня последняя проблема.

Проблема, похоже, связана с тем, что скрипт контента многократно вводится на такие сайты, как Facebook, где вся страница не перезагружается при нажатии на ссылку и т. Д ...

Я думаю, что проблема связана с тем, что сайт сильно зависит от AJAX.

Если я обновлю всю страницу или загрузлю ее в первый раз, проблем не будет. Мое расширение запускается, и скрипт содержимого вставляется правильно.

Однако, если я загружаю страницу в первый раз, а затем нажимаю на ссылку на сайте, «раздел контента» Facebook будет загружать любую ссылку, на которую вы нажали, а плавающая синяя панель навигации вверху не обновить или изменить вообще.

т.е. вся страница не перезагружается. Поскольку и «раздел контента» сайта, и панель навигации находятся в одном и том же фрейме, скрипт контента продолжает вводиться еще раз для каждой ссылки, которую вы нажимаете.

Так что в конце концов я вижу в своем журнале консоли, что он работает 2X, 3X, 4X, 5X и т. Д. Когда я нажимаю на другие ссылки, число увеличивается на 1 каждый раз.

Итак, мой вопрос таков:

Есть ли простой способ проверить, является ли скрипт содержимого УЖЕ присутствующим / активным, прежде чем вводить его снова? Или что еще можно использовать в качестве обходного пути для такой ситуации?

Ответы [ 3 ]

1 голос
/ 20 октября 2011

Я предсказал аналогичную проблему при написании сценария содержимого для моего расширения, поэтому добавил уникальный элемент <body> каждой страницы с именем и версией расширения.

Первое, что делает скрипт содержимого, это проверяет, является ли этот атрибут сценарием, и останавливается, если он это делает. В противном случае он добавит этот атрибут (со значением true) и продолжит свое назначение.

Если вы хотите увидеть мое решение ;

Немного более сложным аспектом этого метода является выбор версии с использованием сообщения, передавшего и синтаксический анализ манифеста (полученного в запросе AJAX) в объект JSON.

Чтобы увидеть, как именно я этого добился, посмотрите на init и onRequestHelper функции здесь ;

Конечно, вы можете просто жестко закодировать версию или полностью ее опустить. Пока имя атрибута уникально.

1 голос
/ 26 апреля 2014

onUpdated срабатывает каждый раз, когда изменяется состояние вкладки.просто загрузите ваши скрипты контента на changeInfo.status == "complete"

background.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"});
    }
});
});
1 голос
/ 20 октября 2011

В родительском кадре, не могли бы вы добавить window.doneInjecting = true; или что-то подобное?(или, возможно, добавить скрытый элемент на страницу - я не уверен, могут ли дочерние фреймы получать доступ к переменным JavaScript своих родителей)

Но, в основном, устанавливая простой флаг, чтобы каждый раз при вводе скрипта содержимого проверялсяесли флаг существует и продолжится только если его нет?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...