2012-02-11 15 views
15

Stavo giocando intorno con alcune estensioni di Chrome e ho trovato questo esempio: http://src.chromium.org/viewvc/chrome/trunk/src/chrome/common/extensions/docs/examples/api/pageAction/pageaction_by_url/Come si visualizza l'opzione page_action per pagine specifiche?

Tutto funziona bene, ma voglio creare la mia propria estensione e voglio vedere l'icona page_action su un sito specifico, non quelli con ' g 'nei loro url. Così ho cercato semplicemente di cambiare lo script da questo:

// Copyright (c) 2011 The Chromium Authors. All rights reserved. 
// Use of this source code is governed by a BSD-style license that can be 
// found in the LICENSE file. 

// Called when the url of a tab changes. 
function checkForValidUrl(tabId, changeInfo, tab) { 
// If the letter 'g' is found in the tab's URL... 
if (tab.url.indexOf('g') > -1) { 
// ... show the page action. 
chrome.pageAction.show(tabId); 
} 
}; 

// Listen for any changes to the URL of any tab. 
chrome.tabs.onUpdated.addListener(checkForValidUrl); 

In questa:

chrome.pageAction.show(tabId); 

Ma ora non funziona ... Io non capisco. Ovviamente posso usare una soluzione alternativa, ma non è questo il punto ... Prima di tutto, devo creare una pagina di sfondo per farlo? Penso di sì ma non riesco a capire perché, e perché il metodo .show non funziona da solo? Ho provato a cercare nella documentazione di google e cose del genere, ma non sono riuscito a trovare nulla di utile non sono esperto e questo è stato il mio primo pomeriggio dedicato all'estensione di google, ma come dovrei sapere che "chrome.page.show (tabId) "deve andare in una pagina di sfondo se non è scritta da nessuna parte? Nessuna intenzione di criticare, ma come diavolo hai scoperto? Tutti i metodi di Chrome devono andare in una pagina di sfondo? Beh, sicuramente molte più domande allora che cosa è legittimo. Spero che tu possa darmi almeno una risposta!

+0

Gli stai dando un 'tabId' valido? – abraham

risposta

28

http://code.google.com/chrome/extensions/pageAction.html
... dice ...

Per impostazione predefinita, l'azione di pagina è nascosta. Quando lo si mostra, si specifica la scheda in cui dovrebbe apparire l'icona. L'icona rimane visibile fino al la scheda è chiusa o inizia a visualizzare un URL diverso (perché l'utente fa clic su un collegamento, ad esempio).

Quindi, anche se il vostro tabid fosse valido, scomparirebbe piuttosto rapidamente come l'unica volta che si esegue chrome.pageAction.show(tabId); una volta che la pagina di sfondo viene eseguita per la prima volta.
È necessario controllare costantemente le modifiche alle schede in background perché le pageactions non hanno impostazioni match/exclude_matches nel manifest come fanno gli script di contenuto (pietà). Quindi devi controllarti e rispondere ai cambiamenti.
Se si desidera lavorare per un sito specifico basta cambiare a qualcosa come ...

// Copyright (c) 2011 The Chromium Authors. All rights reserved. 
// Use of this source code is governed by a BSD-style license that can be 
// found in the LICENSE file. 

// Called when the url of a tab changes. 
function checkForValidUrl(tabId, changeInfo, tab) { 
// If the tabs url starts with "http://specificsite.com"... 
if (tab.url.indexOf('http://specificsite.com') == 0) { 
// ... show the page action. 
chrome.pageAction.show(tabId); 
} 
}; 

// Listen for any changes to the URL of any tab. 
chrome.tabs.onUpdated.addListener(checkForValidUrl); 
+0

Capito, grazie mille. Ho letto quel brano che hai citato, ma a quanto pare non l'ho capito bene! – Treferwynd

+0

Mmh, puoi rispondere anche a questa domanda: Supponendo che bg.js sia il file che contiene (e contiene ** solo **) il codice che ho citato (o quello che hai citato). Perché se scrivo questo: nel background.html funziona, ma se provo a scrivere il codice direttamente in background.html no? – Treferwynd

+4

Credo che tu abbia '" manifest_version ": 2' nel file manifest, che non consentirà i blocchi in linea ' in uno background.html, o rimuovete '" manifest_version ": 2' nel vostro manifest, o cambiate anche la parte di sfondo del manifest' 'background ': {"scripts": ["bg.js"]} '... non sapevo che potevi fare l'ultimo fino ad ora. – PAEz

1

Per chi cerca un modo per gestire sottodomini, se si dispone di un sito con un sottodominio, come blog .specificsite.com, o necessità di utilizzare i caratteri jolly, è anche possibile utilizzare espressioni regolari in questo formato

function checkForValidUrl(tabId, changeInfo, tab) 
{ 
    if(typeof tab != "undefined" && typeof tab != "null") 
    { 
     // If the tabs URL contains "specificsite.com"... 
     //This would work in the same way as *specificsite.com*, with 0 or more characters surrounding the URL. 
     if (/specificsite[.]com/.test(tab.url)) 
     { 
      // ... show the page action. 
      chrome.pageAction.show(tabId); 
     } 
    } 
}; 

// Listen for any changes to the URL of any tab. 
chrome.tabs.onUpdated.addListener(checkForValidUrl); 

per abbinare la stringa all'interno di un URL. Aiuta inoltre il calcolo a eseguire un controllo nullo/non definito per evitare un'ulteriore gestione delle eccezioni.

Problemi correlati