Jak mogę uzyskać adres URL bieżącej karty z rozszerzenia Google Chrome?


Odpowiedzi:


217

Użyj w chrome.tabs.query()ten sposób:

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

Wymaga to żądania dostępu do chrome.tabsinterfejsu API w manifeście rozszerzenia :

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

Należy pamiętać, że definicja „bieżącej karty” może się różnić w zależności od potrzeb rozszerzenia.

Ustawienie lastFocusedWindow: truew zapytaniu jest odpowiednie, gdy chcesz uzyskać dostęp do bieżącej karty w oknie użytkownika (zazwyczaj najwyższym oknie).

Ustawienie currentWindow: truepozwala uzyskać bieżącą kartę w oknie, w którym aktualnie działa kod twojego rozszerzenia. Na przykład może to być przydatne, jeśli twoje rozszerzenie tworzy nowe okno / wyskakujące okienko (zmieniając fokus), ale nadal chce uzyskać dostęp do informacji o karcie z okna, w którym rozszerzenie zostało uruchomione.

Wybrałem użycie lastFocusedWindow: truew tym przykładzie, ponieważ Google przywołuje przypadki, w których currentWindow nie zawsze mogą być obecne .

Możesz dodatkowo zawęzić zapytanie dotyczące karty, korzystając z dowolnej zdefiniowanej tutaj właściwości: chrome.tabs.query


27
Dlaczego adres URL jest zawsze niezdefiniowany?
nnm

2
Jeśli adres URL jest niezdefiniowany, spróbuj ponownie załadować rozszerzenie z chrome: // extensions To przeładuje konfigurację rozszerzenia i zastosuje nowo dodane uprawnienie „tabs”.
flashbackzoo

2
adres URL jest niezdefiniowany, ponieważ stackoverflow.com/questions/28786723/… (odpowiedź: zamknij okno narzędzi programistycznych lub zmień na currentWindow zamiast lastFocusedWindow)
kspearrin 14.09.16

2
Niezdefiniowałem się, gdy okno narzędzi programistów zostało oddokowane. Zadokowanie rozwiązało nieokreślony problem.
Fisu,

To nie zwraca zmiennego adresu URL dzwoniącemu. Chciałbym prostą funkcję url = GetCurrentTabUrl (), która zwraca bieżący adres tabulatorowi wywołującemu. Tutaj zmienna znajduje się w funkcji wywołania zwrotnego. Mogę przekazać ją do innej funkcji, ale sprawia, że ​​struktura kodu jest podobna. Chciałbym również unikać używania zmiennych globalnych. jakiś pomysł @ thauburger?
Thierry Dalon

78

Ostrzeżenie! chrome.tabs.getSelectedjest przestarzałe . Użyj, chrome.tabs.queryjak pokazano w innych odpowiedziach.


Najpierw musisz ustawić uprawnienia do interfejsu API w pliku manifest.json:

"permissions": [
    "tabs"
]

I do przechowywania adresu URL:

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

1
Powodem, dla którego jest to tylko wyskakujące okienko (akcja strony, akcja przeglądarki), jest to, że wysyłasz „zero” do pierwszego parametru. code.google.com/chrome/extensions/tabs.html#method-getSelected Dokumenty stwierdzają, że pierwszym parametrem jest windowId, jeśli chcesz użyć tego w opcjach lub stronie w tle, musisz podać identyfikator okna lub dostaniesz bieżącą kartę do przeglądania, która jest niezdefiniowana, odpowiednio opcje.
Mohamed Mansour,

1
tak, to działa, ale nie jestem pewien, dlaczego nie można znaleźć metody chrome.tabs.getSelected w dokumencie referencyjnym.
swimmingfisher

To coś nie działa dla mnie, chrome.tabs.getSelectedjest niezdefiniowane, czy mógłbym zadać to w osobnym pytaniu?
Mostafa Shahverdy

11
chrome.tabs.getSelectedMetoda została zaniechana, prawidłowa metoda jest notowana na ten temat poniżej odpowiedź .
Rob W

1
I jak uzyskać linki do wszystkich otwartych kart
Enve

48

Inne odpowiedzi zakładają, że chcesz to wiedzieć ze skryptu wyskakującego lub tła.

Jeśli chcesz znać bieżący adres URL ze skryptu treści , zastosowanie ma standardowy sposób JS:

window.location.toString()

Możesz użyć właściwości, window.locationaby uzyskać dostęp do poszczególnych części adresu URL, takich jak host, protokół lub ścieżka.


1
Świetna odpowiedź. Chciałem window.location.hosttylko zobaczyć, czy jestem na „stackoverflow.com”, czy nie.
Salyangoz,

1
Właśnie tego szukałem. Byłem tak pochłonięty mechaniką rozszerzeń, że zapomniałem, że możesz po prostu pobrać adres URL strony za pomocą window.location.href.
felwithe

Wymaga to match:"<all_urls>"sytuacji w sekcji content_script, a Chrome nie poleca <all_urls>.
mcan

@Tahtakafa Nie, nie ma. Zakłada, że ​​skrypt treści jest już uruchomiony (czy to przez pozwolenie hosta dla tej strony lub activeTab).
Xan

Upewnij się, aby uruchomić to w, contentScript.jsa nie w background.js. Po prostu przekaż wszystkie dane, które przefiltrowałeś z adresu URL, do wiadomości background.js. Przykład: let message = { type: "fetchVideoDate", id: getVideoId() };gdzie getVideoId()zawiera wykonanie window.location.toString(). W przeciwnym razie otrzymasz trochę chrome://temp_background_file.htmldanych. Zauważ też, że czasami messagesię nazywa request.
DavidHulsman

25

Problem polega na tym, że chrome.tabs.getSelected jest asynchroniczny. Poniższy kod zazwyczaj nie będzie działał zgodnie z oczekiwaniami. Wartość „tablink” będzie nadal niezdefiniowana, gdy zostanie zapisana w konsoli, ponieważ getSelected nie wywołał jeszcze wywołania zwrotnego, które resetuje wartość:

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

Rozwiązaniem jest zawinięcie kodu, w którym będzie używana wartość w funkcji, i wywołanie jej przez getSelected. W ten sposób masz gwarancję, że zawsze ustawisz wartość, ponieważ Twój kod będzie musiał czekać na podanie wartości przed jej wykonaniem.

Wypróbuj coś takiego:

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

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

Dzięki za kod, to zadziałało dla mnie, „tabs” należy dodać do uprawnień w pliku manifest.json „permissions”: [„tabs”]
Doug Molineux


I jak uzyskać linki do wszystkich otwartych kart
Enve

2
próbowałem tego, ale uzyskiwanie adresu URL jest niezdefiniowane, dlaczego tak jest?
nnm

1

Cześć, oto próbka Google Chrome, która wysyła wiadomość e-mail do aktualnej witryny do znajomego. Podstawową ideą jest to, czego chcesz ... przede wszystkim pobiera zawartość strony (nie jest dla ciebie interesująca) ... następnie otrzymuje adres URL (<- dobra część)

Dodatkowo jest to dobry przykład działającego kodu, który wolę bardziej niż czytanie Dokumentów.

Można znaleźć tutaj: Wyślij tę stronę pocztą e-mail


1

To rozwiązanie jest już TESTOWANE.

ustaw uprawnienia dla interfejsu API w pliku manifest.json

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

Przy pierwszym wywołaniu funkcji wywołania. https://developer.chrome.com/extensions/tabs#event-onActivated

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

Przy zmianie funkcji połączenia. https://developer.chrome.com/extensions/tabs#event-onSelectionChanged

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

funkcja uzyskania adresu URL

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


-2

Trzeba sprawdzić to .

HTML

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

manifest.json

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

JavaScript
Poniższy kod zapisze wszystkie adresy URL aktywnego okna w obiekcie JSON w ramach kliknięcia przycisku.

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);

Moje rozszerzenie chrome do zapisywania adresów URL w aktywnych oknach to chrome.google.com/webstore/detail/tabstore-plugin/…
Kanagavelu Sugumar
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.