Как получить 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.