type - ¿Cómo obtener un script de contenido para cargar DESPUÉS de que se haya ejecutado el Javascript de una página?
script type= text/javascript para que sirve (3)
Se supone que mi extensión debe cargar una secuencia de comandos de contenido, searchTopic.js, solo después de que la página en la que se ha inyectado ya se haya cargado completamente (sí, he establecido "run_at" en "document_end" en el manifiesto de extensión), pero en realidad se está cargando todos los objetos DOM se han creado (los cruciales se crean a través de un poco de Javascript en la página). Entonces, la pregunta es, ¿cómo puedo esperar hasta que se haya ejecutado el Javascript de la página? Aquí está mi manifiesto:
"content_scripts": [
{
"run_at": "document_end",
"matches": ["https://groups.google.com/forum/*"],
"js": ["searchTopic.js"]
}
],
Utiliza el método 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);
"run_at": "document_end"
es el equivalente a DOMContentLoaded
. Es decir, se dispara después de que se carga el HTML estático , pero antes de las imágenes lentas y el javascript de acabado lento.
Por lo tanto, no puede configurar una secuencia de comandos de contenido para que se active después del JS de la página, solo configurando el manifiesto solo. Debe codificar esto en el script de contenido.
Para los scripts de contenido, "run_at": "document_end"
activará antes del evento onload
(a diferencia del identificador de document_idle
predeterminado, que puede activarse en momentos impredecibles).
Entonces, el primer paso es esperar el evento de load
con un código como este en su secuencia de comandos de contenido ( searchTopic.js
):
window.addEventListener ("load", myMain, false);
function myMain (evt) {
// DO YOUR STUFF HERE.
}
En el caso en que el guión que le interesa tome un tiempo para finalizar, tendrá que sondear alguna condición caso por caso. Por ejemplo:
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.
}
}
}
script
elementos del script
se ejecutan en orden. El navegador incluso deja de cargar contenido DOM si hay nodos de script
en el body
. Se garantiza que esto funciona, de lo contrario, document.write()
dejaría de funcionar.
Así que tienes dos soluciones:
- Utiliza el evento
onload
para cargar tu código. - Agregue una etiqueta de secuencia de comandos como el último elemento de la página (lo último en el elemento del
body
). Este script se ejecutará después de que todos los demás scripts hayan finalizado y después de que el cuerpo se haya convertido en un árbol DOM.