5

Estoy muy cerca de hacer que mi extensión de Chrome funcione a la perfección, pero ahora me encuentro con una última cuestión.Extensión de Chrome: secuencias de comandos de contenido acumulando varias veces desde vínculos AJAX/navegación

El problema parece estar relacionado con el contenido de la secuencia de comandos 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 la el sitio es muy dependiente de AJAX.

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

Sin embargo, si cargo la página la hora inicial, haga clic en un enlace en el sitio, la "sección de contenido" de Facebook cargará el enlace en el que hizo clic, mientras que la barra de navegación azul flotante en la parte superior no t actualizar o cambiar en absoluto.

I.E. toda la página no se recarga Dado que tanto la "sección de contenido" del sitio como la barra de navegación están ambas en el mismo marco, la secuencia de comandos de contenido se sigue inyectando en cualquier momento por cada enlace en el que haga clic.

Por lo tanto, eventualmente veo en mi registro de consola que se está ejecutando 2X, 3X, 4X, 5X, etc. Al hacer clic en más enlaces, el número aumenta en 1 cada vez.

Así que mi pregunta es la siguiente:

¿Hay una manera sencilla de comprobar si el guión de contenido que ya está presente/activa antes de inyectarla de nuevo? ¿O qué más se puede usar como solución para una situación como esta?

Respuesta

1

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

Lo primero que hace el script de contenido es comprobar si este atributo ya tiene 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 quiere ver mi solution;

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

Para ver exactamente cómo alcancé este aspecto en las funciones init y onRequestHelperhere;

Por supuesto, puede codificar la versión u omitirla por completo. Siempre que el nombre del atributo sea único.

+0

Gracias por los enlaces y ejemplos de código! – delta9

+0

Creo que el enlace actualizado a su solución ahora es https://github.com/neocotic/template/blob/master/chrome/bin/lib/content.js –

+0

Gracias @SarahVessels, he actualizado todos los enlaces relevantes. – Alasdair

1

En el marco principal, ¿podría agregar window.doneInjecting = true; o algo similar? (o quizás agregue un elemento oculto a la página - No estoy seguro de si los marcos secundarios pueden acceder a las variables de JavaScript de sus padres)

Pero básicamente configurando un indicador simple, para que cada vez que se inserte su secuencia de comandos de contenido, verifique si el bandera existe y solo continuar si no?

1

activadoActualiza los incendios cada vez que cambia el estado de una pestaña.sólo tiene que cargar los scripts contenidos en changeInfo.status == "complete"

background.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"}); 
    } 
}); 
}); 
Cuestiones relacionadas