Как получить содержимое 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() {
[...]
});