2012-01-14 15 views
11

Tengo el siguiente código en mi guión fondo:Extensión de Chrome: ¿cómo detectar que el script de contenido ya está cargado en una pestaña?

chrome.tabs.onUpdated.addListener(function(tabId, changeinfo, tab) { 
    if (changeinfo.status !== 'complete') 
     return; 

    if (!matchesUrlFilters(tab.url)) 
     return; 

    chrome.tabs.executeScript(tabId, { file: "jquery-1.7.1.min.js" }, function() { 
     chrome.tabs.executeScript(tabId, { file: "enhance.js" }); 
    }); 
}); 

Sin embargo, esto parece inyectar mi guión contenido dos veces en algunos casos (que podría suceder cuando enhance.js hace window.history.pushState).

¿Cómo puedo saber si la pestaña ya tiene mi secuencia de comandos de contenido? Intenté chrome.tabs.sendRequest pero nunca llamó a la devolución de llamada si todavía no se agregó la secuencia de comandos de contenido.

+0

Cuando el guión se inyecta dos veces, ¿los dos guiones 'enhance.js' comparten un único entorno de ejecución con variables compartidas? – abraham

+0

No lo sé (y ahora probablemente nunca lo comprobará debido a la respuesta que resuelve el problema por completo). –

+0

Sé que esta es una vieja pregunta, pero me encontré con este problema también. En lugar de agregar un cheque para el script cargado, solo tuve que eliminar el script de la porción "content_scripts" de mi manifest.json ya que estoy delegando la ejecución del script y no quiero que se cargue siempre. – Andrew

Respuesta

10

EDITAR: Actualizado por primer comentario sobre esta respuesta.

Puede intentar algo como esto. Agregue un oyente onRequest que se utilizará como devolución de llamada para cargar los scripts que desee, pero solo se cargarán en función de un valor enviado como parte del mensaje de solicitud. Luego use executeScript para llamar directamente al "código" que envía un mensaje con el valor de una variable global (si existe).

chrome.tabs.onUpdated.addListener(function(tabId, changeinfo, tab) { 
    ... 

    // execute a content script that immediately sends back a message 
    // that checks for the value of a global variable which is set when 
    // the library has been loaded 
    chrome.tabs.executeScript(tabId, { 
     code: "chrome.extension.sendRequest({ loaded: EnhanceLibIsLoaded || false });" 
    }); 

    ... 
}); 

// listen for requests 
chrome.extension.onRequest.addListener(function(req, sender, sendResponse) { 
    if (req.loaded === false) { 
     chrome.tabs.executeScript(tabId, { file: "jquery-1.7.1.min.js" }, function() { 
      chrome.tabs.executeScript(tabId, { file: "enhance.js" }, function() { 
       // set the global variable that the scripts have been loaded 
       // this could also be set as part of the enhance.js lib 
       chrome.tabs.executeScript(tabId, { code: "var EnhanceLibIsLoaded = true;" }); 
      }); 
     }); 
    } 
}); 
+0

Esto es genio, lo modifiqué un poco (moví 'onRequest.addListener' afuera), pero de todos modos funciona perfectamente. Sin embargo, tenga en cuenta que debe ser 'chrome.extension.onRequest.addListener' en lugar de' chrome.tabs.onUpdated.addListener'. –

+0

Me alegra oír que funcionó, edité la respuesta de acuerdo con sus comentarios (avíseme si no lo hice bien o si me da la libertad de editarlo). –

+1

Quería usar esto, pero hay un error en la consol diciendo: 'UnSolección ReferenceError: EnhanceLibIsLoaded no está definido' :( – Alireza

Cuestiones relacionadas