2013-08-24 11 views
7

Voglio eseguire una funzione di script del contenuto ogni volta che viene aggiornata una scheda. Il problema è che, a volte l'aggiornamento delle schede è ajax (senza una pagina di ricarica), mentre si modifica ancora l'URL della pagina. Pertanto il vecchio script di contenuto iniettato esiste ancora nella pagina. Il risultato sono molteplici istanze di script di contenuto iniettate e in esecuzione sulla stessa pagina.rileva se lo script del contenuto dell'estensione di Chrome è stato inserito/lo script del contenuto include guardia

Quindi, sto cercando un meccanismo per iniettare uno script di contenuto, solo se in passato non è stato iniettato lo stesso script di contenuto. Qualche idea?

+0

Quindi sono curioso di sapere se sono stati in grado di trovare una soluzione di lavoro a parte cercando di inviare un messaggio e attendere un risposta dallo script di contenuto? – c00000fd

+0

@ c00000fd: rivisitando questa domanda, penso che la soluzione di Rob W sia più semplice, nel senso che non si basa sul passaggio dei messaggi di Chrome. –

risposta

14

È possibile provare a inviare un messaggio allo script di contenuto (Message Passing). Se lo script di contenuto restituisce correttamente una risposta, significa che lo script di contenuto è già presente altrimenti viene restituita una risposta vuota, è possibile verificare una risposta vuota e iniettare lo script di contenuto.

Background:

chrome.tabs.query({active: true, currentWindow: true}, function(tabs) { 
    chrome.tabs.sendMessage(tabs[0].id, {greeting: "hello"}, function(response) { 
     if (response) { 
      console.log("Already there"); 
     } 
     else { 
      console.log("Not there, inject contentscript"); 
     } 
    }); 
}); 

ContentScript:

chrome.runtime.onMessage.addListener(
    function(request, sender, sendResponse) { 
     if (request.greeting == "hello") 
      sendResponse({message: "hi"}); 
}); 
+0

Provato questo. Ma si conosce solo l'errore nella richiamata di sendMessage. E non è possibile rilevare l'errore generato in una funzione di callback. –

+0

@KevenWang si prega di consultare la mia risposta aggiornata –

7

Implementazione di un include guardia è estremamente facile:

(function() { 
    if (window.hasRun) return; 
    window.hasRun = true; 
    // Rest of code 
})(); 

Se si vuole iniettare programatically un content script, è possibile utilizzare uno dei webNavigation eventi (ad esempio onCommitted) invece di chrome.tabs.onUpdated. A differenza degli eventi tabs, gli eventi webNavigation vengono attivati ​​anche per la navigazione all'interno di frame e offrono un modo per dichiarare un filtro URL in anticipo.

+0

Buono a sapersi su WebNavigation! Con questo include guardia, il codice stesso è ancora iniettato però. Dopo molte navigazioni, potrebbero esserci molti script di contenuto inseriti in questa pagina. Ciò causerebbe problemi di prestazioni? C'è un modo per iniettare controllando che non esiste uno script di contenuto? –

+0

Tutti gli script di contenuto della stessa estensione vengono eseguiti nello stesso contesto. Non preoccuparti delle prestazioni. –

+1

Tutti gli script di contenuto della stessa estensione vengono eseguiti nello stesso contesto ... ** finché l'estensione non viene ricaricata **. Fai attenzione se ricarichi l'estensione: ciò comporterà l'esecuzione di due estensioni. – vaughan

Problemi correlati