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
- XMLHttpRequest не может загрузить файл. Запросы на кросс-начало поддерживаются только для HTTP
- Как я могу получить URL-адрес текущей вкладки из расширения Google Chrome?
- дважды загружается в Google Chrome
- Расширение отказывается загружать скрипт из-за директивы политики безопасности контента
- Как вы проверяете веб-инспектора в хроме?
- Как получить доступ к веб-странице DOM, а не к странице расширения DOM?
- Как я могу заставить XSLT работать в хроме?
- Можно ли ввести код javascript, который ОПИСАЕТ тот, который существует в DOM? (например, функция предупреждения по умолчанию)
- Использовать инспектор элементов Chrome в режиме предварительного просмотра?
- Как определить тип mime текущей вкладки в расширении Google Chrome?
- Выбор текста в фокусе с использованием jQuery, не работающего в Safari и Chrome
- net :: ERR_INSECURE_RESPONSE в Chrome
- Использование ECMAScript 6
Поскольку сценарий содержания имеет свои собственные ограничения,
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.onRequest
➞runtime.onMessage
-
extension.sendRequest
➞runtime.sendMessage
В то время как официальная устаревшая runtime.lastError
, extension.lastError
также доступна как runtime.lastError
. На данный момент он обычно упоминается в этом месте:
-
extension.lastError
➞runtime.lastError
Разделите расширение на фоновые скрипты и скрипты содержимого.
Вам нужно будет отделить свой код от того, что должно быть в фоновом скрипте, и что должно быть в сценариях контента, на основе возможностей, доступных для каждого типа скриптов. Скрипты содержимого имеют доступ к DOM веб-страницы, на которую они вводятся, но ограниченный доступ к API расширений. Фоновые сценарии имеют полный доступ к API расширений, но не имеют доступа к содержимому веб-страницы. Вы должны прочитать обзор расширения Chrome и связанные с ним страницы, чтобы понять, какая функциональность должна располагаться в том типе сценария.
Обычно необходимо обмениваться информацией между вашими сценариями контента и фоновыми скриптами. Для этого вы можете использовать передачу сообщений . Это позволяет вам передавать информацию между двумя сценариями для выполнения действий, которые невозможны, используя только один тип скрипта. Например, в вашем скрипте содержимого вам может понадобиться информация, доступная только из одного из других API Chrome, или вам нужно что-то, что может быть выполнено (или только) с помощью одного из других API расширения Chrome. В этих случаях вам нужно будет отправить сообщение в фоновый скрипт, используя chrome.runtime.sendMessage()
, чтобы сообщить ему, что нужно сделать, предоставляя достаточно информации, чтобы он мог это сделать. Затем ваш фоновый скрипт может вернуть желаемую информацию, если она есть, в ваш скрипт содержимого. В качестве альтернативы вы будете иметь время, когда обработка будет в основном выполняться в фоновом скрипте. Фоновый сценарий может вводить сценарий содержимого или просто сообщение уже введенного сценария, получать информацию со страницы или вносить изменения в веб-страницу.
- Фоновый скрипт означает любой скрипт, который находится в фоновом контексте. В дополнение к фактическим
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); });