Chrome.tabs возвращает undefined в контенте script
chrome.tabs возвращает undefined, несмотря на то, что я устанавливаю вкладки в блоке разрешений.
"permissions": [
"tabs",
"http://*/*",
"https://*/*"
],
"content_scripts": [
{
"matches": [
"http://*/*",
"https://*/*"
],
"js": [
"js/myScript.js"
],
"all_frames": true
}
],
Но в myScript.js возвращается undefined.
chrome.tabs
Ответы
Ответ 1
Поскольку содержимое script имеет свои собственные ограничения,
chrome.tabs
доступен только в фоновых сценариях и всплывающих сценариях.
Если вы хотите использовать chrome.tabs
, тогда передайте сообщение из content_script в background script и играйте с chrome.tabs
.
Ответ 2
Скрипты содержимого имеют ограниченный доступ к API Chrome. Этот доступ не включает API, который вы пытаетесь использовать (например, chrome.tabs
). Если вам нужно использовать этот API, вам нужно будет сделать это в background script 1.
Как указано в Chrome документации по сценариям контента, API-интерфейсы, доступные для содержимого script, - это [Я разместил устаревшие методы в strikethrough]:
- extension (getURL, inIncognitoContext, lastError,
onRequest, sendRequest) - i18n
- runtime (connect, getManifest, getURL, id, onConnect, onMessage, sendMessage)
- storage
Пара перечисленных API устарела и была на некоторое время. Те, которые устарели, переместились в разные места (также перечисленные выше):
Пока он официально не устарел, extension.lastError
также доступен как runtime.lastError
. На этом этапе он обычно упоминается в этом месте:
Разделите расширение на фоновый скрипт и скрипты содержимого
Вам нужно будет отделить свой код от того, что должно быть в фоновом режиме script и что должно быть в сценариях контента, на основе возможностей, доступных для каждого типа script. Скрипты содержимого имеют доступ к DOM веб-страницы, на которую они вводятся, но ограниченный доступ к API расширений. Фоновые сценарии имеют полный доступ к API расширений, но не имеют доступа к содержимому веб-страницы. Вы должны прочитать обзор расширений Chrome и страницы, связанные с ним, чтобы понять, какая функциональность должна быть расположена, в каком типе script.
Общедоступно общение между вашими скриптами контента и фоновыми скриптами. Для этого вы можете использовать сообщение. Это позволяет вам передавать информацию между двумя сценариями для выполнения действий, которые невозможны, используя только один тип script.
Например, в вашем контенте script вам может понадобиться информация, доступная только из одного из других API-интерфейсов Chrome, или вам нужно что-то, что может быть выполнено (или только) с помощью одного из других API расширения Chrome, В этих случаях вам нужно отправить сообщение на ваш фон script, используя chrome.runtime.sendMessage()
, чтобы сказать, что нужно сделать, предоставляя достаточно информации, чтобы он мог это сделать. Затем ваш фон script может вернуть желаемую информацию, если таковой имеется, в ваш контент script. В качестве альтернативы вы будете иметь время, когда обработка будет в основном выполняться в фоновом режиме script. Фон script может вставлять содержимое script или просто сообщение, уже введенное script, для получения информации со страницы или внесения изменений на веб-страницу.
- Фон script означает любой script, который находится в фоновом контексте. В дополнение к фактическим
background
скриптам, это включает всплывающие окна и страницы опций и т.д. Однако, единственная страница, на которой вы можете быть уверены последовательно доступные для приема сообщений из контента script являются вашими фактическими background
скриптамиопределенный в manifest.json. Другие страницы могут быть доступны в некоторых случаях в результате взаимодействия пользователя с браузером, но они не доступны последовательно.
Этот ответ был перенесен из повторяющегося вопроса, а затем изменен.
Ответ 3
Отметьте также этот ответ fooobar.com/info/224376/...
Это работало для меня
chrome.tabs.getSelected(null, function(tab){
console.log(tab);
});