5

Quindi mi piacerebbe eseguire uno script quando la scheda si ricarica in un URL specificato. Funziona quasi, ma in realtà non id :) Questo è il mio file manifesto:Come posso eseguire questo script quando la scheda viene ricaricata (estensione chrome)?

{ 
"manifest_version": 2, 

"name": "Sample Extension", 
"description": "Sample Chrome Extension", 
"version": "1.0", 

"content_scripts": 
[ 
    { 
     "matches": ["http://translate.google.hu/*"], 
     "js": ["run.js"] 
    } 
], 

"permissions": 
[ 
    "activeTab", 
    "tabs" 
], 

"browser_action": 
{ 
    "default_title": "Sample", 
    "default_icon": "icon.png" 
} 
} 

e questo è run.js:

chrome.tabs.onUpdated.addListener(
function (tabId, changeInfo, tab) 
{ 
    if (changeInfo.status === "complete") 
    { 
     chrome.tabs.executeScript(null, {file: "program.js"}); 
    } 
} 
); 

I programs.js avvisi solo una parte di testo (ancora). Quando metto un avviso sulla prima riga di run.js, avvisa, ma quando lo metto in if, non lo fa. Non riesco a trovare il problema. Ho scritto qualcosa di sbagliato?

+0

Hai controllato gli errori nella console di sviluppo? Penso che tu debba eseguire questo da una pagina di sfondo piuttosto che dallo script di contenuto. Credo che gli script di contenuto possano utilizzare chrome.extension e tutti gli altri metodi nell'API devono essere richiamati su una pagina background.js. – QFDev

+0

Hooking https://stackoverflow.com/q/23333771/632951 – Pacerier

risposta

8

Supponendo che le pagine http://translate.google.hu/* siano quelle in cui si desidera inserire il codice in modalità di ricarica, si dovrebbe procedere in un modo leggermente diverso. Attualmente sei sempre inserire il codice in quelle pagine (senza il permesso di farlo, non di meno) e poi provare a usare l'API chrome.tabs all'interno dello script di contenuto, che non puoi fare. Invece, inseriremo il listener in una pagina di sfondo e inseriremo il codice solo in un aggiornamento della pagina, come desiderato. In primo luogo i manifesta:

{ 
    "manifest_version": 2, 
    "name": "Sample Extension", 
    "description": "Sample Chrome Extension", 
    "version": "1.0", 
    "background": { 
    "scripts": ["background.js"] 
    }, 
    "permissions":[ 
    "http://translate.google.hu/*", "tabs" 
    ] 
} 

background.js

chrome.tabs.onUpdated.addListener(function(tabId,changeInfo,tab){ 
    if (tab.url.indexOf("http://translate.google.hu/") > -1 && 
     changeInfo.url === undefined){ 
    chrome.tabs.executeScript(tabId, {file: "program.js"}); 
    } 
}); 

Questa ascolterà per l'evento onUpdated, controlla se si tratta di uno dei 's url che vogliamo iniettare, e poi controlla se la pagina è stata ricaricata. L'ultimo passaggio si ottiene controllando se esiste changeInfo.url. Se lo fa, allora significa che l'url è stato cambiato e quindi non un aggiornamento. Al contrario, se non esiste, la pagina deve essere stata aggiornata solo.

+0

Grazie, funziona, ma come posso eseguire questo script se c'è un'altra scheda in alto? –

+0

@Geiszla Cosa intendi con un'altra scheda in cima? – BeardFist

+1

Quindi quando ricarico la scheda, ma cambio scheda. Quindi lo script non viene eseguito, perché non è quello (ad esempio translate.google.hu) il sito web. –

1

content_scripts vengono eseguiti a ogni pagina (ri) caricati, quindi è meglio usare solo quelli per rilevarlo.

In questo modo non si rischia di eseguire alcun codice nello background prima che lo content_script sia pronto per ricevere qualsiasi messaggio.

+0

Sembra esserci un bug di Chrome per cui a volte manifest contentscript non viene eseguito al caricamento della pagina. Vedi https://stackoverflow.com/questions/19191679/chrome-extension-inject-js-before-page-load/19192010#comment78166411_19192010 – Pacerier