Domanda

Io sono super vicino a ottenere la mia Estensione per Chrome funziona perfettamente, ma sono in esecuzione in un ultimo problema.

Il problema sembra essere legato al contenuto di uno script iniettato più volte su siti come Facebook, dove la pagina non viene ricaricata cliccando su un link, ecc...

Penso che il problema è legato al sito che e ' molto AJAX-dipendente.

Se posso aggiornare l'intera pagina, o caricare per la prima volta, quindi non c'è nessun problema.La mia estensione delle piste ed il contenuto dello script viene iniettato correttamente.

Tuttavia, se carico la pagina iniziale, quindi fare clic su un link sul sito, il "contenuto sezione" di Facebook di caricare qualunque sia il link che hai cliccato su, mentre il galleggiante nella barra di navigazione blu in alto non aggiornare o modificare in tutto.

I. E.l'intera pagina non si ricarica.Dal momento che sia il "contenuto sezione" del sito e la barra di navigazione nella stessa cornice, il contenuto dello script sempre iniettato un'altra volta per ogni link si fa clic su.

Quindi, alla fine, vedo nel mio log della console che è in esecuzione 2X, 3X, 4X, 5X, ecc..Come faccio clic in giro su altri link, il numero aumenta di 1 ogni volta.

Quindi la mia domanda è questa:

C'è un modo semplice per verificare se il contenuto dello script è GIÀ presente e attivo prima di iniettare di nuovo?O cos'altro può essere utilizzato come un work-around per una situazione come questa?

È stato utile?

Soluzione

Avevo previsto un problema simile quando si scrive il contenuto di script per la mia estensione per cui ho aggiunto un attributo univoco per la <body> elemento di ogni pagina con l'estensione del nome e versione.

La prima cosa che il contenuto dello script fa è controllare se questo attributo è già script e si ferma, se lo fa.In caso contrario, aggiungere questo attributo (con un valore di true) e continuare con il suo scopo.

Se vuoi vedere il mio soluzione;

Leggermente più complicato aspetto di questa tecnica sta recuperando la versione utilizzando il messaggio che passa l'analisi e il manifesto (recuperati in una richiesta AJAX) in un oggetto JSON.

Per vedere esattamente come ho ottenuto questo sguardo al init e onRequestHelper funzioni qui;

Naturalmente, si potrebbe codificare la versione o omettere del tutto.Così a lungo come il attributo ha un nome univoco.

Altri suggerimenti

Nel frame superiore, si potrebbe aggiungere window.doneInjecting = true; o qualcosa di simile?(o forse aggiungere un elemento nascosto alla pagina - non sono sicuro se il bambino cornici possono accedere ai loro genitori JavaScript le variabili)

Ma sostanzialmente l'impostazione di una semplice bandiera, in modo che ogni volta che il contenuto dello script viene iniettato, controllare se il flag non esiste e continuare solo se non?

onUpdated accende ogni volta che una scheda cambiamento di stato.basta caricare il tuo contenuto degli script in 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"});
    }
});
});
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top