Как я могу получить URL-адрес текущей вкладки из расширения Google Chrome?

Мне нравится расширение Google Chrome, и я просто хочу знать, как сохранить URL-адрес текущей вкладки в переменной?


person Axiol    schedule 30.12.2009    source источник


Ответы (8)


Используйте 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.tabs API в вашем манифесте расширения:

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

Важно отметить, что определение вашей «текущей вкладки» может отличаться в зависимости от потребностей вашего расширения.

Установка lastFocusedWindow: true в запросе подходит, если вы хотите получить доступ к текущей вкладке в окне, ориентированном на пользователя (обычно в самом верхнем окне).

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

Я решил использовать lastFocusedWindow: true в этом примере, потому что Google указывает случаи, в которых currentWindow не всегда может быть присутствует.

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

person thauburger    schedule 10.01.2013
comment
Почему URL-адрес всегда не определен? - person nnm; 31.05.2014
comment
Если url не определен, попробуйте перезагрузить расширение из chrome: // extensions. Это перезагрузит конфигурацию расширения и применит недавно добавленное разрешение на вкладки. - person flashbackzoo; 17.04.2016
comment
URL-адрес не определен, потому что stackoverflow.com/questions/28786723/ (ответ: закройте окно инструментов разработчика или перейдите на currentWindow вместо lastFocusedWindow) - person kspearrin; 14.09.2016
comment
Я получил undefined, когда мое окно инструментов разработчика было отстыковано. Пристыковка решила неопределенную проблему. - person Fisu; 06.03.2018
comment
Это не возвращает URL-адрес переменной вызывающей стороне. Мне нужна простая функция url = GetCurrentTabUrl (), которая возвращает текущий URL-адрес вкладки вызывающему. Здесь переменная находится внутри функции обратного вызова. Я могу передать его другой функции, но это усложняет структуру кода. Я бы также хотел избежать использования глобальных переменных. есть идеи @thauburger? - person Thierry Dalon; 11.03.2020
comment
@ThierryDalon Думаю, ты мог бы использовать async/await. - person Camilo; 25.11.2020
comment
В этом ответе, к сожалению, не упоминается, что вы не можете получить доступ к области chrome.tabs внутри сценария содержимого. См .: stackoverflow.com/a/35523438/1576548 - person Raleigh L.; 14.03.2021
comment
permissions: ['activeTab'] тоже работает - person Sodj; 09.04.2021

Внимание! chrome.tabs.getSelected устарел. Пожалуйста, используйте chrome.tabs.query, как показано в других ответах.


Во-первых, вы должны установить разрешения для API в manifest.json:

"permissions": [
    "tabs"
]

И чтобы сохранить URL:

chrome.tabs.getSelected(null,function(tab) {
    var tablink = tab.url;
});
person Axiol    schedule 30.12.2009
comment
Причина, по которой это только для всплывающего окна (действие страницы, действие браузера), заключается в том, что вы отправляете нулевое значение в первый параметр. code.google.com/chrome/extensions/tabs.html#method- getSelected В документации указано, что первым параметром является windowId, если вы хотите использовать его в параметрах или на фоновой странице, вам нужно будет указать идентификатор окна, иначе вы получите текущую вкладку, которую вы просматриваете, которая не определена, варианты соответственно. - person Mohamed Mansour; 30.12.2009
comment
да, это работает, но не уверен, почему метод chrome.tabs.getSelected не может быть найден в справочном документе. - person swimmingfisher; 25.04.2012
comment
У меня эта штука не работает, chrome.tabs.getSelected не определено, можно задать отдельный вопрос? - person Mostafa Shahverdy; 21.03.2013
comment
Метод chrome.tabs.getSelected устарел, правильный метод указан в ответ ниже. - person Rob W; 29.06.2013
comment
Я помещаю вкладки в разрешения в файле json, но это решение получает URL-адрес chrome: // extensions /, хотя я на этой странице .... я что-то пропустил? - person Tarek; 20.07.2013
comment
И как получить ссылки на все открытые вкладки - person Enve; 27.07.2013
comment
Я хочу получить текущий URL внутри main.js, есть какие-нибудь указания? - person Tahir Yasin; 18.10.2015
comment
Это решение не сработает, если вы попытаетесь использовать его на веб-сайте bloomberg.com, где URL-адрес в Chrome обновляется по мере прокрутки пользователя. . - person AndroidDev; 25.07.2017
comment
вкладки больше не являются разрешениями developer.chrome.com/apps/declare_permissions - person sdfsdf; 12.11.2017

Другие ответы предполагают, что вы хотите узнать это из всплывающего или фонового сценария.

Если вы хотите узнать текущий URL из сценария содержимого, применяется стандартный способ JS:

window.location.toString()

Вы можете использовать свойства window.location для доступа к отдельным частям URL, таким как хост, протокол или путь.

person Xan    schedule 20.07.2016
comment
Отличный ответ. Все, что я хотел, это window.location.host посмотреть, нахожусь ли я в stackoverflow.com или нет. - person Salyangoz; 07.09.2017
comment
На самом деле это то, что я искал. Я был настолько увлечен механизмом расширения, что забыл, что вы можете просто получить URL-адрес страницы с помощью window.location.href. - person felwithe; 25.03.2018
comment
Для этого требуется match:"<all_urls>" ситуация в разделе content_script, и Chrome не рекомендуется ‹all_urls›. - person mcan; 07.11.2018
comment
@Tahtakafa Нет, это не так. Предполагается, что сценарий содержимого уже запущен (будь то разрешение хоста для этой страницы или activeTab). - person Xan; 07.11.2018
comment
Обязательно запустите это в contentScript.js, а не в background.js. Просто передайте все данные, которые вы отфильтровали из URL-адреса, в сообщение background.js. Пример: let message = { type: "fetchVideoDate", id: getVideoId() };, где getVideoId() содержит выполнение window.location.toString(). В противном случае вы получите chrome://temp_background_file.html данные. Также обратите внимание, что иногда message называется request. - person DavidHulsman; 29.04.2019
comment
это не будет работать должным образом в Firefox, если content.js запущен на странице, содержащей фреймы. Я не знаю, нормально ли это или это ошибка Firefox. - person crisc2000; 07.11.2019
comment
после нескольких тестов я выяснил, почему этот метод не работает должным образом на страницах с iframe. в моем манифесте для content_scripts: all_frames установлено значение true. Я установил значение false, и теперь он работает правильно. - person crisc2000; 07.11.2019
comment
проголосовали за объяснение почему другие ответы игнорируют стандартный способ - person OfirD; 14.05.2020

Проблема в том, что chrome.tabs.getSelected является асинхронным. Приведенный ниже код обычно не работает должным образом. Значение 'tablink' по-прежнему будет неопределенным, когда оно будет записано в консоль, потому что 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);
}
person Nyk Cowham    schedule 30.03.2010
comment
Спасибо за код, у меня это сработало, в разрешения в файле manifest.json нужно добавить вкладки: [tabs] - person Doug Molineux; 13.04.2011
comment
Также это работает как шарм: Получение текущего окна во всплывающем окне ( расширение Google Chrome) - person chemark; 31.05.2013
comment
И как получить ссылки на все открытые вкладки - person Enve; 27.07.2013
comment
я пробовал это, но получаю url undefined, почему это? - person nnm; 31.05.2014

Привет, вот образец Google Chrome, который отправляет другу по электронной почте текущий сайт. Основная идея - это то, что вы хотите ... сначала он извлекает содержимое страницы (не интересует вас) ... затем получает URL-адрес (‹- хорошая часть)

Кроме того, это хороший пример рабочего кода, который я предпочитаю читать документам.

Можно найти здесь: Отправить эту страницу по электронной почте

person bastianneu    schedule 30.12.2009

Это решение уже ПРОВЕРЕНО.

установить разрешения для API в manifest.json

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

При первой загрузке функции вызова. https://developer.chrome.com/extensions/tabs#event-onActivated

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)
  })
person Jelly    schedule 15.06.2020

Для тех, кто использует context menu api, в документации не сразу понятно, как получить информацию о вкладках.

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

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

person lfender6445    schedule 16.11.2014

Вы должны проверить это.

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);
person Kanagavelu Sugumar    schedule 08.10.2015
comment
Мое расширение Chrome для сохранения URL-адресов в активных окнах - chrome.google.com/webstore/ деталь / tabstore-plugin / - person Kanagavelu Sugumar; 08.10.2015