Как запустить скрипт содержимого расширения Chrome после того, как javascript сайта завершил создание страницы? - PullRequest
0 голосов
/ 07 июня 2018

Я знаю, что могу использовать run_at: document end для запуска скрипта после загрузки страницы, но большинство сайтов теперь внедряют большую часть своего контента через какую-то среду js.Из того, что я могу сказать, сценарий content.js запускается до того, как он может закончиться.

У меня есть некоторые идеи о том, как это сделать, но я не совсем уверен, действительно ли они имеют смысл, или даже как это сделать.их, если они сделали.

  1. Запускайте мой скрипт каждый раз, когда обновляется DOM, так что, если добавлена ​​гиперссылка, я могу просто снова удалить hrefs.

    Я нашел это domwatcher вещь в происхождении uBlock , я предполагаю, что он делает что-то подобное для того, чтобы удалить любую рекламу, которая появляется, но это действительно сложно, и я не уверен, какие вещи мне понадобятся или не понадобятся.

  2. Запускайте расширение каждую секунду или две.Это кажется действительно неуклюжим, но, может быть, это стандартная вещь?Я не уверен.Я также не знаю, как заставить скрипт контента повторяться, что-то такое простое не могло вызвать проблем с производительностью, верно?

  3. Javascript-скрипты выполняются по порядку, когда они перечислены вHTML верно?Так, может быть, я добавлю сценарий в конец всех этих?Но они все равно работают асинхронно, так что, вероятно, не будет работать.В любом случае, какой-нибудь способ запустить мой скрипт после того, как все остальные сделаны.Могу ли я поместить их в обещания?

Также вот моя страница GitHub со всем кодом .

Соответствующий манифест:

 "content_scripts": [
    {
    "matches": [
        "http://*/*",
        "https://*/*"
        ],
    "js": ["content.js"],
    "run_at": "document_end"
    }
]

И content.js:

chrome.storage.sync.get('isEnabled', function (data) {
    if(!data.isEnabled) {
        return;
    }

    for (let link of document.links) {
        link.removeAttribute('href');
        console.log(link);
    }
});

1 Ответ

0 голосов
/ 07 июня 2018

Поскольку DOM динамически генерируется какими-либо фреймворками / библиотеками, которые он использует, я буду наблюдать за любыми изменениями в DOM и обрабатывать только что созданный контент.Я думаю, что это будет работать лучше, чем пытаться определить, когда контент DOM завершил сборку и запустить contentScripts в любом случае, учитывая, что контент страницы может динамически генерироваться и изменяться в любое время, когда пользователь находится на странице.

MyРешение заключается в том, что вы можете отслеживать любые вновь созданные элементы ссылок и удалять атрибут href, если он соответствует вашему желаемому шаблону.Это можно сделать одним из следующих способов:

  • MutationObserver : интерфейс Javascript для просмотра изменений в DOM
  • Arrive.js : библиотека для наблюдения за изменениями в DOM.

Приведенный вами пример uBlock также использует MutationObserver для отслеживания изменений дерева DOM, поэтому я думаю, что автортакже использует методику, которую я упомянул здесь.

...