Подтвердить что ты не робот

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   
4b9b3361

Ответ 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]:

Пара перечисленных 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);
});