Wie kann ich die URL des aktuellen Tabs von einer Google Chrome-Erweiterung abrufen?

Antworten:

215

Verwenden Sie chrome.tabs.query()wie folgt:

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

Dies erfordert, dass Sie chrome.tabsin Ihrem Erweiterungsmanifest Zugriff auf die API anfordern :

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

Es ist wichtig zu beachten, dass die Definition Ihrer "aktuellen Registerkarte" je nach den Anforderungen Ihrer Erweiterung unterschiedlich sein kann.

Die Einstellung lastFocusedWindow: truein der Abfrage ist angemessen, wenn Sie auf die aktuelle Registerkarte im fokussierten Fenster des Benutzers zugreifen möchten (normalerweise das oberste Fenster).

Mit der Einstellung currentWindow: truekönnen Sie die aktuelle Registerkarte in dem Fenster abrufen, in dem der Code Ihrer Erweiterung gerade ausgeführt wird. Dies kann beispielsweise nützlich sein, wenn Ihre Erweiterung ein neues Fenster / Popup erstellt (Fokus ändern), aber dennoch über das Fenster, in dem die Erweiterung ausgeführt wurde, auf Registerkarteninformationen zugreifen möchte.

Ich habe mich für lastFocusedWindow: truedieses Beispiel entschieden, da Google Fälle aufruft, in denen dies currentWindow möglicherweise nicht immer der Fall ist .

Sie können Ihre Tab-Abfrage mithilfe einer der hier definierten Eigenschaften weiter verfeinern: chrome.tabs.query

thauburger
quelle
27
Warum ist die URL immer undefiniert?
nnm
2
Wenn die URL nicht definiert ist, laden Sie Ihre Erweiterung von chrome: // extensions neu. Dadurch wird die Konfiguration der Erweiterung neu geladen und die neu hinzugefügte Berechtigung "tabs" angewendet.
Flashbackzoo
2
URL ist undefiniert, weil stackoverflow.com/questions/28786723/… (Antwort: Schließen Sie Ihr Dev Tools-Fenster oder wechseln Sie zu currentWindow anstelle von lastFocusedWindow)
kspearrin
2
Ich wurde undefiniert, als mein Entwicklungswerkzeugfenster abgedockt wurde. Durch das Andocken wurde das undefinierte Problem behoben.
Fisu
Dadurch wird die variable URL nicht an den Aufrufer zurückgegeben. Ich möchte eine einfache Funktion url = GetCurrentTabUrl (), die die aktuelle Tab-URL an den Aufrufer zurückgibt. Hier befindet sich die Variable innerhalb der Rückruffunktion. Ich kann es an eine andere Funktion übergeben, aber es macht die Codestruktur akward. Ich möchte auch die Verwendung globaler Variablen vermeiden. Irgendeine Idee @thauburger?
Thierry Dalon
77

Warnung! chrome.tabs.getSelectedist veraltet . Bitte verwenden Sie chrome.tabs.querywie in den anderen Antworten gezeigt.


Zunächst müssen Sie die Berechtigungen für die API in manifest.json festlegen:

"permissions": [
    "tabs"
]

Und um die URL zu speichern:

chrome.tabs.getSelected(null,function(tab) {
    var tablink = tab.url;
});
Axiol
quelle
1
Der Grund, warum es nur für das Popup (Seitenaktion, Browseraktion) ist, ist, dass Sie eine "Null" in den ersten Parameter senden. code.google.com/chrome/extensions/tabs.html#method-getSelected Die Dokumente geben an, dass der erste Parameter die windowId ist. Wenn Sie dies in Optionen oder auf der Hintergrundseite verwenden möchten, müssen Sie die Fenster-ID oder eingeben Sie erhalten die aktuelle Registerkarte Ihrer Anzeige, die jeweils nicht definiert ist.
Mohamed Mansour
1
Ja, es funktioniert, aber nicht sicher, warum die Methode chrome.tabs.getSelected nicht im Referenzdokument gefunden werden kann.
Schwimmfischer
Dieses Ding funktioniert bei mir nicht, chrome.tabs.getSelectedist undefiniert, soll ich es in einer separaten Frage stellen?
Mostafa Shahverdy
11
Die chrome.tabs.getSelectedMethode ist veraltet, die richtige Methode ist in der folgenden Antwort aufgeführt .
Rob W
1
Und wie man Links von allen geöffneten Tabs
bekommt
48

Bei anderen Antworten wird davon ausgegangen, dass Sie dies anhand eines Popup- oder Hintergrundskripts wissen möchten.

Wenn Sie die aktuelle URL aus einem Inhaltsskript kennen möchten , gilt die Standard-JS-Methode:

window.location.toString()

Mit den Eigenschaften von können Sie window.locationauf einzelne Teile der URL zugreifen, z. B. Host, Protokoll oder Pfad.

Xan
quelle
1
Gute Antwort. Ich wollte nur window.location.hostsehen, ob ich bei "stackoverflow.com" bin oder nicht.
Salyangoz
1
Das ist eigentlich das, wonach ich gesucht habe. Ich war so in die Erweiterungsmechanik verwickelt, dass ich vergaß, dass Sie einfach die URL der Seite mit window.location.href abrufen können.
felwithe
Dies erfordert eine match:"<all_urls>"Situation im Abschnitt content_script, und Chrome empfiehlt <all_urls> nicht.
Mai
@ Tahtakafa Nein, das tut es nicht. Es wird davon ausgegangen, dass bereits ein Inhaltsskript ausgeführt wird (sei es über eine Host-Berechtigung für diese Seite oder activeTab).
Xan
Stellen Sie sicher, dass Sie dies in contentScript.jsund nicht in der ausführen background.js. Übergeben Sie einfach alle Daten, die Sie aus der URL gefiltert haben, an die Nachricht an background.js. Beispiel: let message = { type: "fetchVideoDate", id: getVideoId() };wo getVideoId()enthält eine Ausführung von window.location.toString(). Andernfalls erhalten Sie einige chrome://temp_background_file.htmlDaten. Beachten Sie auch, dass manchmal messageaufgerufen wird request.
DavidHulsman
25

Das Problem ist, dass chrome.tabs.getSelected asynchron ist. Dieser Code unten funktioniert im Allgemeinen nicht wie erwartet. Der Wert von 'tablink' bleibt beim Schreiben in die Konsole undefiniert, da getSelected den Rückruf, der den Wert zurücksetzt, noch nicht aufgerufen hat:

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

Die Lösung besteht darin, den Code so zu verpacken, dass Sie den Wert in einer Funktion verwenden und diesen von getSelected aufrufen lassen. Auf diese Weise ist garantiert immer ein Wert festgelegt, da Ihr Code warten muss, bis der Wert bereitgestellt wird, bevor er ausgeführt wird.

Versuchen Sie etwas wie:

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

function myFunction(tablink) {
  // do stuff here
  console.log(tablink);
}
Nyk Cowham
quelle
Vielen Dank für den Code, das hat bei mir funktioniert. "Tabs" müssen zu den Berechtigungen in der manifest.json-Datei "permissions" hinzugefügt werden: ["tabs"]
Doug Molineux
Auch das funktioniert wie ein Zauber: Aktuelles Fenster in einem Popup
abrufen
Und wie man Links von allen geöffneten Tabs
bekommt
2
Ich habe es versucht, aber URL undefiniert bekommen, warum ist das so?
nnm
1

Hallo, hier ist ein Google Chrome-Beispiel, das die aktuelle Website per E-Mail an einen Freund sendet. Die Grundidee dahinter ist, was Sie wollen ... zuerst wird der Inhalt der Seite abgerufen (was für Sie nicht interessant ist) ... danach wird die URL abgerufen (<- guter Teil)

Außerdem ist es ein schönes funktionierendes Codebeispiel, das ich lieber als Dokumente lese.

Hier finden Sie: E-Mail an diese Seite

Bastianneu
quelle
1

Diese Lösung ist bereits getestet.

Legen Sie die Berechtigungen für die API in manifest.json fest

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

Beim ersten Laden Aufruffunktion. https://developer.chrome.com/extensions/tabs#event-onActivated

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

Bei Änderungsaufruffunktion. https://developer.chrome.com/extensions/tabs#event-onSelectionChanged

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

die Funktion zum Abrufen der URL

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

Für diejenigen, die das verwenden context menu api, ist in den Dokumenten nicht sofort klar, wie Registerkarteninformationen abgerufen werden können.

  chrome.contextMenus.onClicked.addListener(function(info, tab) {
    console.log(info);
    return console.log(tab);
  });

https://developer.chrome.com/extensions/contextMenus

lfender6445
quelle
-2

Sie haben auf überprüfen diese .

HTML

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

manifest.json

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

JavaScript
Der folgende Code speichert alle URLs des aktiven Fensters im Rahmen eines Schaltflächenklicks im JSON-Objekt.

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);
Kanagavelu Sugumar
quelle
Meine Chrome-Erweiterung zum Speichern von URLs unter
Kanagavelu Sugumar