Как получить содержимое script для загрузки ПОСЛЕ ЗАПИСИ на странице Javascript?

Мое расширение должно загружать контент script, searchTopic.js, только после того, как загруженная им страница уже полностью загружена (да, я установил "run_at" в "document_end" в манифесте расширения), но на самом деле он загружается до создания всех объектов DOM (критические из них создаются с помощью некоторого Javascript на странице). Итак, вопрос в том, как я могу подождать, пока страница Javascript не будет выполнена? Здесь мой манифест:

"content_scripts": [
  {
  "run_at": "document_end",
  "matches": ["https://groups.google.com/forum/*"],
  "js": ["searchTopic.js"]
  }
],

Ответы

Ответ 1

"run_at": "document_end" эквивалентен DOMContentLoaded. То есть, он запускается после загрузки статического HTML, но перед медленными изображениями и медленная обработка javascript.

Таким образом, вы не можете настроить контент script для запуска после страницы JS, просто установив манифест в одиночку. Вы должны запрограммировать это для самого содержимого script.

Для сценариев контента "run_at": "document_end" будет срабатывать перед событием onload (в отличие от стандартного document_idle), который может срабатывать в непредсказуемые моменты времени.

Итак, первым шагом является ожидание события load с таким кодом в вашем содержимом script (searchTopic.js):

window.addEventListener ("load", myMain, false);

function myMain (evt) {
    // DO YOUR STUFF HERE.
}


В случае, когда вам требуется script, требуется некоторое время, чтобы закончить, вам придется опросить какое-то условие в каждом конкретном случае. Например:

window.addEventListener ("load", myMain, false);

function myMain (evt) {
    var jsInitChecktimer = setInterval (checkForJS_Finish, 111);

    function checkForJS_Finish () {
        if (    typeof SOME_GLOBAL_VAR != "undefined"
            ||  document.querySelector ("SOME_INDICATOR_NODE_css_SELECTOR")
        ) {
            clearInterval (jsInitChecktimer);
            // DO YOUR STUFF HERE.
        }
    }
}

Ответ 2

Элементы

script выполняются по порядку. Браузер даже перестает загружать содержимое DOM, если в body есть узлы script. Это гарантированно работает, иначе document.write() перестанет работать.

Итак, у вас есть два решения:

  • Для загрузки кода используйте событие onload.
  • Добавьте тег script в качестве последнего элемента страницы (последняя вещь в элементе body). Этот script будет выполнен после завершения всех остальных скриптов и после того, как тело было преобразовано в дерево DOM.

Ответ 3

Вы используете метод window.load.

function addLoadEvent(a) {
    var b = window.onload;
    "function" != typeof window.onload ? window.onload = a : window.onload = function () {
        b && b(),
            a()
    }
}
function init() {
    alert('init');
}
addLoadEvent(init);

Ответ 4

Попробуйте добавить тег 'script' в голову. Сделайте что-нибудь подобное:

jQuery(document).ready(function() {
    jQuery('head').append('<script type="text/javascript" src="yoursource.js" />');
});

И в добавленном script вы также можете использовать

jQuery(document).ready(function() {
    [...]
});