javascript - matches - Los scripts de contenido de Chrome no funcionan: el escucha DOMContentLoaded no se ejecuta
make a google chrome extension (1)
Está inyectando su secuencia de comandos después del evento que está escuchando en busca de incendios (en este caso, DOMContentLoaded
). Por lo tanto, cualquier código que tenga en el oyente no se ejecutará, porque el evento nunca se dispara después de haber agregado su oyente.
En extensiones de Chrome y WebExtensions de Firefox, cuando se especifica una hora para la inyección de un script de contenido , puede especificar "document_start"
, "document_end"
o "document_idle"
. 1 En manifest.json este es el valor indicado para la propiedad run_at
. Para tabs.executeScript()
, es la propiedad runAt
.
-
document_start
La inyección tiene lugar antes de que se cree el DOM, o de las secuencias de comandos de la página que se está ejecutando. Esto significa quedocument.body
ydocument.head
aún no existen. LosDOMContentLoaded
yload
window
aún no se hanDOMContentLoaded
. Puede agregar cosas al DOM agregándolas aldocument.documentElement
. Es posible que necesite usar unMutationObserver
para observar los elementos que le interesan agregar al DOM, o espere que un evento comoDOMContentLoaded
indique que el DOM está disponible. -
document_end
(predeterminado)
La inyección tiene lugar después de que el DOM esté completo, pero antes de que se carguen los subrecursos (por ejemplo, imágenes y marcos). EstoDOMContentLoaded
generalmente después de queDOMContentLoaded
haya disparado, pero antes de que se active el evento deload
lawindow
. document_idle
La inyección se lleva a cabo en algún momento después dedocument_end
e inmediatamente después dewindow
load
evento deload
lawindow
. La respuesta a "¿Cuándo se ejecuta un script de script run_at: document_idle?" indica que este es el anterior de:- Después de
window
load
evento deload
lawindow
, o - 200ms después del evento
DOMContentLoaded
disparado.
Esto significa que su script de contenido se inyectará después de que
DOMContentLoaded
haya disparado, pero el evento deload
lawindow
puede, o no, haberse disparado.- Después de
Cuando escuche DOMContentLoaded
, o load
window
, primero debe verificar document.readyState
Siempre que utilice un oyente de load
DOMContentLoaded
, o un oyente de load
window
, siempre debe verificar document.readyState
antes de agregar el oyente para asegurarse de que está agregando el oyente antes de que se DOMContentLoaded
evento DOMContentLoaded
(o antes del evento de load
ser despedido, si eso es lo que estás escuchando). Esto debería ser un hábito normal cuando desee escuchar estos eventos. Si agrega el oyente después de que se haya disparado el evento, el oyente nunca se ejecutará.
Para agregar un oyente DOMContentLoaded
, debe usar algo como:
if(document.readyState === ''loading'') {
document.addEventListener(''DOMContentLoaded'',afterDOMLoaded);
} else {
afterDOMLoaded();
}
function afterDOMLoaded(){
//Everything that needs to happen after the DOM has initially loaded.
}
Para agregar un oyente de load
window
, podría usar algo como:
if(document.readyState !== ''complete'') {
window.addEventListener(''load'',afterWindowLoaded);
} else {
afterWindowLoaded();
}
function afterWindowLoaded(){
//Everything that needs to happen after the window is fully loaded.
}
- Si usa
tabs.executeScript()
, el valor que proporciona pararunAt
solo indica la fecha más temprana en que desea que serunAt
el script. Si está ejecutandotabs.executeScript()
antes de ese momento, entonces la inyección se retrasa hasta el tiempo especificado. Tenga en cuenta que paradocument_start
el punto en que ejecutartabs.executeScript()
será válido para una página nueva es un tema complejo, que merece su propia pregunta / respuesta. - Partes de esta respuesta se copiaron de mi respuesta a "Detectar y manejar un clic de botón en la página HTML activa" .
Estoy intentando codificar la extensión que corrige errores ortográficos en 1 foro.
Estoy intentando acceder a la etiqueta <p>
, con script de contenido, pero no cambia nada (usando el código siguiente):
document.addEventListener("DOMContentLoaded", function() {
document.getElementsByTagName("P")[4].innerHTML = "correct_word";
});
No cambia nada cuando se agrega como una extensión, aparentemente, si wget
la página y pongo el script allí, todo funciona. ¿Alguna idea?
Mi archivo manifest.json :
{
"manifest_version": 2,
"name": "Extension",
"description": "Description",
"version": "1.0",
"content_scripts": [{
"run_at": "document_end",
"matches": ["http://example.com/"],
"js": ["script.js"]
}],
"web_accessible_resources": ["Filedeleted(really).html"]
}
Sé que las secuencias de comandos de contenido y las páginas WWW tienen diferentes areneros, tal vez las secuencias de comandos de contenido no pueden acceder a la página (y a la etiqueta).