Come posso ottenere l'URL della scheda corrente da un'estensione di Google Chrome?


Risposte:


219

Usa chrome.tabs.query()così:

chrome.tabs.query({active: true, lastFocusedWindow: true}, tabs => {
    let url = tabs[0].url;
    // use `url` here inside the callback because it's asynchronous!
});

Ciò richiede che tu richieda l'accesso chrome.tabsall'API nel tuo manifest di estensione :

"permissions": [ ...
   "tabs"
]

È importante notare che la definizione della tua "scheda corrente" può variare a seconda delle esigenze della tua estensione.

L'impostazione lastFocusedWindow: truenella query è appropriata quando si desidera accedere alla scheda corrente nella finestra focalizzata dell'utente (in genere la finestra più in alto).

L'impostazione currentWindow: trueconsente di ottenere la scheda corrente nella finestra in cui è attualmente in esecuzione il codice dell'estensione. Ad esempio, questo potrebbe essere utile se l'estensione crea una nuova finestra / popup (modificando lo stato attivo), ma desidera comunque accedere alle informazioni sulla scheda dalla finestra in cui è stata eseguita l'estensione.

Ho scelto di utilizzare lastFocusedWindow: truein questo esempio, perché Google chiama casi in cui currentWindow potrebbe non essere sempre presente .

Sei libero di perfezionare ulteriormente la query della scheda utilizzando una delle proprietà definite qui: chrome.tabs.query


27
Perché l'URL è sempre indefinito?
nnm,

2
Se l'URL non è definito prova a ricaricare l'estensione da chrome: // extensions Questo ricaricherà la configurazione dell'estensione e applicherà l'autorizzazione "tabs" appena aggiunta.
flashbackzoo

2
l'URL non è definito perché stackoverflow.com/questions/28786723/… (risposta: chiudi la finestra degli strumenti di sviluppo o passa alla finestra corrente anziché all'ultima finestra a fuoco)
kspearrin

2
Sono stato indefinito quando la finestra degli strumenti di sviluppo è stata sganciata. Il docking ha risolto il problema indefinito.
Fisu

Questo non restituisce l'URL variabile al chiamante. Vorrei una semplice funzione url = GetCurrentTabUrl () che restituisce l'URL della scheda corrente al chiamante. Qui la variabile è all'interno della funzione di callback. Posso passarlo a un'altra funzione ma rende la struttura del codice inaffidabile. Vorrei anche evitare di utilizzare le variabili globali. qualche idea @thauburger?
Thierry Dalon,

78

Avvertimento! chrome.tabs.getSelectedè deprecato . Si prega di utilizzare chrome.tabs.querycome mostrato nelle altre risposte.


Innanzitutto, devi impostare le autorizzazioni per l'API in manifest.json:

"permissions": [
    "tabs"
]

E per memorizzare l'URL:

chrome.tabs.getSelected(null,function(tab) {
    var tablink = tab.url;
});

1
Il motivo per cui è solo per il popup (azione della pagina, azione del browser) è perché l'invio di un "null" nel primo parametro. code.google.com/chrome/extensions/tabs.html#method-getSelected I documenti indicano che il primo parametro è windowId, se si desidera utilizzarlo nelle opzioni o nella pagina di sfondo, è necessario inserire l'id della finestra o visualizzerai la scheda corrente che non è definita, opzioni rispettivamente.
Mohamed Mansour,

1
sì, funziona, ma non so perché il metodo chrome.tabs.getSelected non sia stato trovato nel documento di riferimento.
swimmingfisher

Questa cosa non funziona per me, chrome.tabs.getSelectednon è definita, dovrei farla in una domanda separata?
Mostafa Shahverdy,

11
Il chrome.tabs.getSelectedmetodo è stato deprecato, il metodo corretto è elencato nella seguente risposta .
Rob W,

1
E, come ottenere i collegamenti di tutte le schede aperte
Enve,

48

Altre risposte presuppongono che tu voglia conoscerlo da un popup o da uno script in background.

Nel caso in cui si desideri conoscere l'URL corrente da uno script di contenuto , si applica il modo JS standard:

window.location.toString()

È possibile utilizzare le proprietà di window.locationper accedere a singole parti dell'URL, come host, protocollo o percorso.


1
Bella risposta. Tutto quello che volevo era window.location.hostvedere se sono su "stackoverflow.com" o no.
Salyangoz,

1
Questo è in realtà quello che stavo cercando. Ero così preso dalla meccanica delle estensioni che ho dimenticato che puoi semplicemente prendere l'URL della pagina con window.location.href.
Accusa il

Ciò richiede una match:"<all_urls>"situazione nella sezione content_script e Chrome non è consigliato <all_urls>.
Dal

@Tahtakafa No, non lo è. Presuppone che uno script di contenuto sia già in esecuzione (tramite un'autorizzazione host per quella pagina o ActiveTab).
Xan,

Assicurati di eseguirlo contentScript.jse non in background.js. Passa semplicemente tutti i dati che hai filtrato dall'URL nel messaggio a background.js. Esempio: let message = { type: "fetchVideoDate", id: getVideoId() };dove getVideoId()contiene un'esecuzione di window.location.toString(). Altrimenti otterrai alcuni chrome://temp_background_file.htmldati. Si noti inoltre che a volte messageviene chiamato request.
DavidHulsman,

25

Il problema è che chrome.tabs.getSelected è asincrono. Questo codice di seguito non funzionerà generalmente come previsto. Il valore di 'tablink' sarà ancora indefinito quando viene scritto sulla console perché getSelected non ha ancora invocato il callback che reimposta il valore:

var tablink;
chrome.tabs.getSelected(null,function(tab) {
    tablink = tab.url;
});
console.log(tablink);

La soluzione è racchiudere il codice in cui verrà utilizzato il valore in una funzione e farlo richiamare da getSelected. In questo modo avrai la certezza di avere sempre un valore impostato, perché il tuo codice dovrà attendere che il valore venga fornito prima che venga eseguito.

Prova qualcosa del tipo:

chrome.tabs.getSelected(null, function(tab) {
    myFunction(tab.url);
});

function myFunction(tablink) {
  // do stuff here
  console.log(tablink);
}

Grazie per il codice, questo ha funzionato per me, è necessario aggiungere "tabs" alle autorizzazioni nel file manifest.json "Permessi": ["tabs"]
Doug Molineux,


E, come ottenere i collegamenti di tutte le schede aperte
Enve,

2
ho provato questo, ma l'URL non è definito perché è questo?
nnm,

1

Salve, ecco un esempio di Google Chrome che invia il sito corrente a un amico. L'idea di base dietro è ciò che vuoi ... prima di tutto recupera il contenuto della pagina (non interessante per te) ... poi ottiene l'URL (<- buona parte)

Inoltre è un bell'esempio di codice funzionante, che preferisco volutamente alla lettura di Documenti.

Puoi trovarlo qui: Invia questa pagina per e-mail


1

Questa soluzione è già TESTATA.

imposta le autorizzazioni per l'API in manifest.json

"permissions": [ ...
   "tabs",
    "activeTab",
    "<all_urls>"
]

Al primo caricamento della funzione di chiamata. https://developer.chrome.com/extensions/tabs#event-onActivated

chrome.tabs.onActivated.addListener((activeInfo) => {  
  sendCurrentUrl()
})

Al cambio della funzione di chiamata. https://developer.chrome.com/extensions/tabs#event-onSelectionChanged

chrome.tabs.onSelectionChanged.addListener(() => {
  sendCurrentUrl()
})

la funzione per ottenere l'URL

function sendCurrentUrl() {
  chrome.tabs.getSelected(null, function(tab) {
    var tablink = tab.url
    console.log(tablink)
  })


-2

Devi controllare questo .

HTML

<button id="saveActionId"> Save </button>

manifest.json

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

JavaScript
Il codice seguente salverà tutti gli URL della finestra attiva nell'oggetto JSON come parte del clic sul pulsante.

var saveActionButton = document.getElementById('saveActionId');
saveActionButton.addEventListener('click', function() {
    myArray = [];
    chrome.tabs.query({"currentWindow": true},  //{"windowId": targetWindow.id, "index": tabPosition});
    function (array_of_Tabs) {  //Tab tab
        arrayLength = array_of_Tabs.length;
        //alert(arrayLength);
        for (var i = 0; i < arrayLength; i++) {
            myArray.push(array_of_Tabs[i].url);
        }
        obj = JSON.parse(JSON.stringify(myArray));
    });
}, false);

La mia estensione Chrome per il salvataggio degli URL su Windows attivi è chrome.google.com/webstore/detail/tabstore-plugin/…
Kanagavelu Sugumar
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.