Подтвердить что ты не робот

Как получить содержимое 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"]
  }
],
4b9b3361

Ответ 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() {
    [...]
});