Pregunta

Estoy muy cerca de que mi extensión de Chrome funcione perfectamente, pero ahora me estoy encontrando con un último problema.

El problema parece estar relacionado con el script de contenido que se inyecta repetidamente en sitios como Facebook, donde toda la página no se vuelve a cargar al hacer clic en un enlace, etc.

Creo que el problema está relacionado con que el sitio sea muy dependiente de AJAX.

Si actualizo la página completa o la carga por primera vez, entonces no hay problema. Mi extensión se ejecuta y el script de contenido se inyecta correctamente.

Sin embargo, si carga la página en la hora inicial, luego haga clic en un enlace en el sitio, la "sección de contenido" de Facebook cargará cualquier enlace en el que haya hecho clic, mientras que la barra de navegación azul flotante en la parte superior no se actualiza ni cambia en absoluto.

Es decir, toda la página no vuelve a cargar. Dado que tanto la "sección de contenido" del Sitio como la barra de navegación están en el mismo cuadro, el script de contenido sigue siendo inyectado en otro momento para cada enlace que haga clic.

Así que eventualmente veo en mi registro de consola que se ejecuta 2x, 3x, 4x, 5x, etc., a medida que hago clic en más enlaces, el número aumenta en 1 cada vez.

Así que mi pregunta es esta:

¿Existe una manera simple de verificar si el script de contenido ya está presente/activo antes de inyectarlo nuevamente? ¿O qué más se puede usar como una solución para una situación como esta?

¿Fue útil?

Solución

Predije un problema similar al escribir el script de contenido para mi extensión, así que agregué un atributo único al <body> Elemento de cada página con el nombre y la versión de la extensión.

Lo primero que hace el script de contenido es verificar si este atributo ya scripts y se detiene si lo hace. De lo contrario, agregará este atributo (con un valor de true) y continuar con su propósito.

Si quieres ver mi solución;

El aspecto un poco más complicado de esta técnica es obtener la versión utilizando paso de mensajes y analizar el manifiesto (recuperado en una solicitud AJAX) en un objeto JSON.

Para ver exactamente cómo logré esta mirada al init y onRequestHelper funciones aquí;

Por supuesto, podría codificar la versión u omitirla por completo. Mientras el nombre del atributo sea único.

Otros consejos

En el marco principal, ¿podrías agregar? window.doneInjecting = true; ¿o algo similar? (O tal vez agregue un elemento oculto a la página: no estoy seguro de si los marcos de niños pueden acceder a las variables JavaScript de sus padres)

Pero básicamente establece una bandera simple, de modo que cada vez que se inyecte su script de contenido, verifique si el indicador existe y solo continúa si no es así.

incendios inapedados cada vez que cambia el estado de una pestaña. Simplemente cargue sus scripts de contenido en changeInfo.status == "complete"

fondo.js

chrome.tabs.onUpdated.addListener(function(tabId, changeInfo, tab) {
chrome.tabs.getSelected(null, function(tab) {
    // Do some stuff
    if (changeInfo.status == "complete")
    {
        // load your scripts here
        chrome.tabs.executeScript(tabId, {file: "jquery.js"});
        chrome.tabs.executeScript(tabId, {file: "jquery.highlight.js"});
    }
});
});
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top