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


Ответы:


219

Используйте 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 всегда неопределен?
НМ

2
Если url не определен, попробуйте перезагрузить ваше расширение из chrome: // extensions. Это перезагрузит конфигурацию расширения и применит вновь добавленное разрешение «вкладки».
flashbackzoo

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

2
Я получил неопределенность, когда мое окно инструментов разработки было откреплено. Стыковка это исправило неопределенную проблему.
Fisu

Это не возвращает переменную 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Метод устарел, правильный метод указан в этом ниже ответ .
Роб W

1
И как получить ссылки на все открытые вкладки
Enve

48

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

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

window.location.toString()

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


1
Отличный ответ. Все, что я хотел, window.location.hostэто посмотреть, нахожусь ли я на «stackoverflow.com» или нет.
Сальянгоз

1
Это на самом деле то, что я искал. Я был настолько увлечен механикой расширений, что забыл, что вы можете просто взять URL страницы с помощью window.location.href.
18:15

Это требует match:"<all_urls>"ситуации в разделе content_script, и Chrome не рекомендует <all_urls>.
может

@ Тахтакафа Нет, это не так. Предполагается, что скрипт контента уже запущен (будь то через разрешение хоста для этой страницы или 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 является асинхронным. Этот код ниже, как правило, не будет работать, как ожидалось. Значение '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);
}

Спасибо за код, это сработало для меня, необходимо добавить "tabs" к разрешениям в файле "permissions" файла manifest.json: ["tabs"]
Doug Molineux


И как получить ссылки на все открытые вкладки
Enve

2
я пробовал это, но получение URL-адреса не определено, почему это?
НМ

1

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

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

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


1

Это решение уже протестировано.

установить разрешения для 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)
  })


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

Мое расширение Chrome для сохранения URL-адресов в активных окнах - это chrome.google.com/webstore/detail/tabstore-plugin/…
Канагавелу Сугамар,
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.