chrome.tabs возвращает undefined в скрипте содержимого

chrome.tabs возвращает undefined, несмотря на то, что я устанавливаю вкладки в блоке разрешений.

"permissions": [ "tabs", "http://*/*", "https://*/*" ], "content_scripts": [ { "matches": [ "http://*/*", "https://*/*" ], "js": [ "js/myScript.js" ], "all_frames": true } ], 

Но в myScript.js следующее возвращает undefined.

 chrome.tabs 

Поскольку сценарий содержания имеет свои собственные ограничения,

chrome.tabs доступен только в фоновых сценариях и всплывающих скриптах.

Если вы хотите использовать chrome.tabs тогда передайте сообщение из content_script в фоновый скрипт и играйте с chrome.tabs .

Скрипты содержимого имеют ограниченный доступ к API Chrome. Этот доступ не включает API, который вы пытаетесь использовать (например, chrome.tabs ). Если вам нужно использовать этот API, вам нужно будет сделать это в фоновом скрипте 1 .

Как указано в документации по сценариям контента Chrome, API-интерфейсы, доступные для скрипта содержимого, – это [Я поместил устаревшие методы в просачивание формат]:

  • расширение ( getURL , inIncognitoContext , lastError , по запросу , послать запрос )
  • i18n
  • runtime ( connect , getManifest , getURL , id , onConnect , onMessage , sendMessage )
  • место хранения

Пара перечисленных API устарела и была на некоторое время. Те, которые устарели, переместились в разные места (также перечисленные выше):

  • extension.onRequestruntime.onMessage
  • extension.sendRequestruntime.sendMessage

В то время как официальная устаревшая runtime.lastError , extension.lastError также доступна как runtime.lastError . На данный момент он обычно упоминается в этом месте:

  • extension.lastErrorruntime.lastError

Разделите расширение на фоновые скрипты и скрипты содержимого.

Вам нужно будет отделить свой код от того, что должно быть в фоновом скрипте, и что должно быть в сценариях контента, на основе возможностей, доступных для каждого типа скриптов. Скрипты содержимого имеют доступ к DOM веб-страницы, на которую они вводятся, но ограниченный доступ к API расширений. Фоновые сценарии имеют полный доступ к API расширений, но не имеют доступа к содержимому веб-страницы. Вы должны прочитать обзор расширения Chrome и связанные с ним страницы, чтобы понять, какая функциональность должна располагаться в том типе сценария.

Обычно необходимо обмениваться информацией между вашими сценариями контента и фоновыми скриптами. Для этого вы можете использовать передачу сообщений . Это позволяет вам передавать информацию между двумя сценариями для выполнения действий, которые невозможны, используя только один тип скрипта. Например, в вашем скрипте содержимого вам может понадобиться информация, доступная только из одного из других API Chrome, или вам нужно что-то, что может быть выполнено (или только) с помощью одного из других API расширения Chrome. В этих случаях вам нужно будет отправить сообщение в фоновый скрипт, используя chrome.runtime.sendMessage() , чтобы сообщить ему, что нужно сделать, предоставляя достаточно информации, чтобы он мог это сделать. Затем ваш фоновый скрипт может вернуть желаемую информацию, если она есть, в ваш скрипт содержимого. В качестве альтернативы вы будете иметь время, когда обработка будет в основном выполняться в фоновом скрипте. Фоновый сценарий может вводить сценарий содержимого или просто сообщение уже введенного сценария, получать информацию со страницы или вносить изменения в веб-страницу.


  1. Фоновый скрипт означает любой скрипт, который находится в фоновом контексте. В дополнение к фактическим background сценариям это включает всплывающие windows и страницы с параметрами и т. Д. Однако единственная страница, на которой вы можете быть уверены, что она всегда доступна для приема сообщений из сценария контента, – это ваши фактические background сценарии, определенные в manifest.json . Другие страницы могут быть доступны в некоторых случаях в результате взаимодействия пользователя с браузером, но они не доступны последовательно.

Этот ответ был перенесен из дублированного вопроса , а затем изменен.

https://developer.chrome.com/extensions/tabs#method-getSelected показывает

getSelected

chrome.tabs.getSelected (integer windowId, обратный вызов функции)
Устаревший с Chrome 33. Используйте tabs.query {active: true}.
Получает вкладку, выбранную в указанном окне.

Возможно, вы должны использовать chrome.tabs.query в popup.js, как это

 chrome.tabs.query({active: true, currentWindow: true}, function(tabs){ console.log(tabs[0].url); }); 

, перезагрузите расширение и проверьте результат в элементе проверки вашего расширения.

Изображение результатов

изображение кода

https://developer.chrome.com/extensions/tabs#type-Tab показывает, что URL-адрес вкладки отображается. Это свойство присутствует только в том случае, если манифест расширения содержит разрешение «tabs». (Только для того, чтобы напомнить, что кто-то забыл. Я был забыт, когда я просто проверял это.)

Проверьте этот ответ и https://stackoverflow.com/a/6718277/449345. Это помогло мне

 chrome.tabs.getSelected(null, function(tab){ console.log(tab); }); 
  • Есть ли способ получить xpath в Google Chrome?
  • Как искать все загруженные скрипты в инструментах разработчика Chrome?
  • Как получить текущий URL-адрес вкладки для расширения chrome?
  • Как заставить Chrome разрешить смешанный контент?
  • Программный доступ к главной странице Google Chrome или стартовой странице
  • Chrome getUserMedia не запрашивает разрешения на локальном уровне
  • Как использовать отладчик сети chrome с переадресацией
  • Android Chrome игнорирует -webkit-text-size-adjust: none свойство. При масштабировании текст масштабируется
  • Фоновое изображение для выбора (выпадающее меню) не работает в Chrome
  • Расширение Chrome: как захватить выделенный текст и отправить веб-службу
  • Удаленная отладка iOS
  • Давайте будем гением компьютера.