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); }); 
  • Как связать с событием изменения localStorage с помощью jQuery для всех браузеров?
  • Можно ли ввести код javascript, который ОПИСАЕТ тот, который существует в DOM? (например, функция предупреждения по умолчанию)
  • Как использовать отладчик сети chrome с переадресацией
  • хром-скрипты контента и newtab
  • Увеличение максимального количества подключений Google Chrome на сервер до более чем 6
  • Отладка iframe с помощью инструментов разработчика Chrome
  • Автоматически открывать инструменты разработчика Chrome при открытии новой вкладки / нового windows
  • Что означает == $ 0 (double equals dollar zero) в инструментах разработчика Chrome?
  • Как имитировать нажатия клавиш или щелчок с помощью JavaScript?
  • Chrome 18+: как разрешить встроенные скрипты с политикой безопасности контента?
  • Получение URL текущей вкладки из Google Chrome с помощью C #
  • Interesting Posts

    Как сделать копию принтера в Windows 7?

    Получить управляемый bean-элемент JSF по имени в любом classе, связанном с Servlet

    Убедитесь, что UIColor темный или яркий?

    Невозможно использовать Wi-Fi при активном Ethernet

    Как найти окно Заголовок активного (переднего плана) windows с помощью Window Script Host

    Печать большого компонента Swing

    Настройте apache для прослушивания на порту, отличном от 80

    как иметь дело с google-картой внутри скрытого div (обновленное изображение)

    Как я могу разместить свой веб-сайт в Windows Vista на домашнем компьютере?

    Как я могу переключать представления программным образом в controllerе представления? (Xcode, iPhone)

    Массив для разметки указателя и передачи многомерных массивов в функции

    Как вы запускаете несколько программ параллельно из сценария bash?

    SSH для Cygwin медленно реагирует

    PostgreSQL: ОШИБКА: 42601: необходим список определения столбцов для функций, возвращающих «запись»,

    Как инициализировать все элементы массива с одинаковым значением?

    Давайте будем гением компьютера.