Як я можу отримати URL-адресу поточної вкладки з розширення Google Chrome?


Відповіді:


217

Використовуйте chrome.tabs.query()так:

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

Для цього потрібно надіслати запит на доступ до chrome.tabsAPI в своєму маніфесті розширення :

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

Важливо зауважити, що визначення вашої "поточної вкладки" може відрізнятися залежно від потреб вашого розширення.

Налаштування lastFocusedWindow: trueв запиті доцільно, коли ви хочете отримати доступ до поточної вкладки у зосередженому вікні користувача (зазвичай це саме верхнє вікно).

Налаштування currentWindow: trueдозволяє отримати поточну вкладку у вікні, де зараз виконується код розширення. Наприклад, це може бути корисно, якщо розширення створює нове вікно / спливаюче вікно (змінюється фокус), але все ж хоче отримати доступ до інформації вкладки з вікна, де було запущено розширення.

Я вирішив використовувати lastFocusedWindow: trueв цьому прикладі, оскільки Google викриває випадки, в яких currentWindow може бути не завжди .

Ви можете додатково уточнити запит на вкладці, використовуючи будь-які властивості, визначені тут: chrome.tabs.query


27
Чому URL-адреса завжди не визначена?
nnm

2
Якщо URL не визначений, спробуйте перезавантажити розширення з chrome: // extensions Це перезавантажить конфігурацію розширення та застосує нещодавно доданий дозвіл "вкладки".
flashbackzoo

2
URL не визначено, тому що stackoverflow.com/questions/28786723/… (відповідь: закрити вікно інструментів розробки або змінити на currentWindow замість lastFocusedWindow)
kspearrin

2
Я не визначив, коли вікно інструментів для розробників було відключено. Док-станція вирішила невизначене питання.
Фісу

Це не повертає URL-адресу змінної абоненту. Я хотів би просту функцію url = GetCurrentTabUrl (), яка повертає поточний URL-адресу вкладки абоненту. Тут змінна знаходиться всередині функції зворотного виклику. Я можу передати його іншій функції, але вона змушує структуру коду збігатися. Я також хотів би уникати використання глобальних змінних. будь-яка ідея @thauburger?
Тьєррі Далон

78

Увага! chrome.tabs.getSelectedє застарілим . Будь ласка, використовуйте, chrome.tabs.queryяк показано в інших відповідях.


Спочатку потрібно встановити дозволи для API в manifest.json:

"permissions": [
    "tabs"
]

І щоб зберегти URL-адресу:

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

1
Причина, чому його тільки для спливаючого вікна (дія на сторінці, дія браузера), полягає в тому, що ваше надсилання "нуль" в перший параметр. code.google.com/chrome/extensions/tabs.html#method-getSelected У документі вказано, що першим параметром є windowId, якщо ви хочете використовувати це в параметрах або на фоновій сторінці, вам потрібно буде поставити ідентифікатор вікна або ви отримаєте поточну вкладку, перегляд якої не визначено, параметри відповідно.
Мохаммед Мансур

1
так, він працює, але не впевнений, чому метод chrome.tabs.getSelected не можна знайти у довідковому документі.
плавець-

Ця річ не працює для мене, chrome.tabs.getSelectedє невизначеною, чи можу я її задати окремим запитанням?
Мостафа Шахверді

11
chrome.tabs.getSelectedМетод застарів, правильний метод вказано в цьому нижче відповідь .
Роб Ш

1
І як отримати посилання на всі відкриті вкладки
Enve

48

Інші відповіді припускають, що ви хочете знати це зі спливаючого або фонового сценарію.

Якщо ви хочете знати поточну URL-адресу з вмісту сценарію , застосовується стандартний спосіб JS:

window.location.toString()

Ви можете використовувати властивості window.locationдля доступу до окремих частин URL-адреси, таких як хост, протокол або шлях.


1
Чудова відповідь. Все, що я хотів, було window.location.hostпобачити, чи я на "stackoverflow.com" чи ні.
Сальянгоз

1
Це власне те, що я шукав. Мене так захопили механіки розширень, що я забув, що ви можете просто захопити URL-адресу сторінки за допомогою window.location.href.
фельдшер

Це вимагає match:"<all_urls>"ситуації в розділі content_script, і Chrome не рекомендує <all_urls>.
mcan

@Tahtakafa Ні, це не так. Він передбачає, що сценарій вмісту вже запущений (будь то через дозвіл хоста для цієї сторінки або activeTab).
Ксан

Не забудьте запустити це в, contentScript.jsа не в background.js. Просто передайте будь-які дані, відфільтровані з URL-адреси, у повідомлення background.js. Приклад: let message = { type: "fetchVideoDate", id: getVideoId() };де getVideoId()міститься виконання window.location.toString(). Інакше ви отримаєте деякі chrome://temp_background_file.htmlдані. Також зауважте, що іноді messageдзвонять request.
DavidHulsman

25

Проблема полягає в тому, що chrome.tabs.getSelected є асинхронним. Цей код нижче не працює як слід. Значення "табло" ще не буде визначеним, коли воно записується на консоль, оскільки getSelected ще не викликав зворотний виклик, який скидає значення:

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

Рішення полягає в тому, щоб обернути код, де ви будете використовувати значення у функції, і мати те, на яке посилається getSelected. Таким чином, ви гарантовано завжди будете мати набір значень, оскільки ваш код повинен буде чекати, коли воно буде надане до його виконання.

Спробуйте щось на кшталт:

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

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

Дякую за код, це спрацювало для мене, "вкладки" потрібно додати до дозволів у файлі manifest.json "permissions": ["вкладки"]
Doug Molineux


І як отримати посилання на всі відкриті вкладки
Enve

2
Я спробував це, але отримання URL-адреси не визначено, чому це?
nnm

1

Привіт, ось зразок Google Chrome, який надсилає другу поточний сайт електронною поштою. Основна ідея - це те, що ви хочете ... Перш за все, він отримує вміст сторінки (не цікавий для вас) ... згодом він отримує URL-адресу (<- хороша частина)

Крім того, це приємний приклад робочого коду, який я більше віддаю перевагу читанню Документів.

Ви можете знайти тут: Надіслати цю сторінку електронною поштою


1

Це рішення вже випробоване.

встановити дозволи для API в manifest.json

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

Функція виклику першого завантаження. https://developer.chrome.com/extensions/tabs#event-onActivate

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

Функція зміни дзвінка. https://developer.chrome.com/extensions/tabs#event-onSelectionChanged

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

функція отримання URL-адреси

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


-2

Ви повинні перевірити це .

HTML

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

manifest.json

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

JavaScript
Наведений нижче код збереже всі URL-адреси активного вікна в об'єкт JSON як частина натискання кнопки.

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

Моє розширення для збереження URL-адрес для активних вікон - chrome.google.com/webstore/detail/tabstore-plugin/…
Kanagavelu Sugumar
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.