tabs.executeScript()
Вставляет JavaScript-код на страницу.
Примечание: При использовании Manifest V3 или выше, используйте scripting.executeScript() для выполнения скриптов.
Вы можете вставить код на страницы, чьи URL можно выразить с помощью шаблона соответствия. Для этого схема URL должна быть одной из: http, https, или file.
У вас должны быть разрешения на URL страницы — либо явно, как разрешение на хост, — либо через разрешение activeTab. Обратите внимание, что некоторые специальные страницы не позволяют этого разрешения, включая страницы в режиме чтения, просмотра исходного кода и просмотра PDF.
Вы также можете вставить код на страницы, упакованные с вашей расширением:
browser.tabs.create({url: "/my-page.html"}).then(() => { browser.tabs.executeScript({ code: `console.log('location:', window.location.href);` }); });
Для этого вам не нужны специальные разрешения.
Вы не можете вставлять код на встроенные страницы браузера, такие как: about:debugging, about:addons, или страница, открывающаяся при открытии новой пустой вкладки.
Вставляемые вами скрипты называются скриптами контента.
Это асинхронная функция, которая возвращает Promise.
Синтаксис
let executing = browser.tabs.executeScript( tabId, // optional integer details // object )
Параметры
-
tabIdНеобязательно -
integer. Идентификатор вкладки, в которой необходимо запустить скрипт.По умолчанию активная вкладка текущего окна.
details-
Объект, описывающий скрипт для выполнения.
Он содержит следующие свойства:
-
allFramesНеобязательно -
boolean. Еслиtrue, код будет вставлен во все фреймы текущей страницы.Если
trueиframeIdустановлены, это вызовет ошибку. (frameIdиallFramesвзаимоисключающие.)Если
false, код вставляется только в верхний фрейм.По умолчанию
false. -
codeНеобязательно -
string. Код для вставки, как строка текста.Предупреждение: Не используйте это свойство для интерполяции недоверенных данных в JavaScript, так как это может привести к проблеме безопасности.
-
fileНеобязательно -
string. Путь к файлу, содержащему код для вставки.- В Firefox относительные URL, не начинающиеся с корня расширения, разрешаются относительно текущего URL страницы.
- В Chrome эти URL разрешаются относительно базового URL расширения.
Для кроссбраузерной совместимости вы можете указать путь как относительный URL, начинающийся с корня расширения, например:
"/path/to/script.js". -
frameIdНеобязательно -
integer. Фрейм, в который необходимо вставить код.По умолчанию
0(фрейм верхнего уровня). -
matchAboutBlankНеобязательно -
boolean. Еслиtrue, код будет вставлен в вложенныеabout:blankиabout:srcdocфреймы, если ваше расширение имеет доступ к их родительскому документу. Код не может быть вставлен в верхнеуровневыеabout:фреймы.По умолчанию
false. -
runAtНеобязательно -
extensionTypes.RunAt. Самый ранний момент, когда код будет вставлен во вкладку.По умолчанию
"document_idle".
-
Возвращаемое значение
A Promise, который будет разрешен в массив объектов. Элементы массива представляют результат выполнения скрипта в каждом вставленном фрейме.
Результат выполнения скрипта — это последнее вычисленное выражение, что аналогично тому, что выводилось бы (результаты, а не любые console.log() выводы), если бы вы выполнили скрипт в Консоли разработчика. Например, рассмотрим такой скрипт:
let foo='my result'; foo;
В этом случае массив результатов будет содержать строку "my result" в качестве элемента.
Значения результатов должны быть структурируемо клонируемыми (см. алгоритм клонирования данных).
Примечание: Последнее выражение также может быть Promise, но эта функция не поддерживается библиотекой webextension-polyfill.
Если произойдёт ошибка, промис будет отклонен с сообщением об ошибке.
Примеры
В этом примере выполняется однострочный фрагмент кода в текущей активной вкладке:
function onExecuted(result) { console.log(`We made it green`); } function onError(error) { console.log(`Error: ${error}`); } const makeItGreen = 'document.body.style.border = "5px solid green"'; const executing = browser.tabs.executeScript({ code: makeItGreen }); executing.then(onExecuted, onError);
В этом примере выполняется скрипт из файла (упакованного с расширением) под названием "content-script.js". Скрипт выполняется в текущей активной вкладке. Скрипт выполняется и в подфреймах, и в основном документе:
function onExecuted(result) { console.log(`We executed in all subframes`); } function onError(error) { console.log(`Error: ${error}`); } const executing = browser.tabs.executeScript({ file: "/content-script.js", allFrames: true }); executing.then(onExecuted, onError);
В этом примере выполняется скрипт из файла (упакованного с расширением) под названием "content-script.js". Скрипт выполняется во вкладке с идентификатором 2:
function onExecuted(result) { console.log(`We executed in tab 2`); } function onError(error) { console.log(`Error: ${error}`); } const executing = browser.tabs.executeScript( 2, { file: "/content-script.js" }); executing.then(onExecuted, onError);
Примеры расширений
Совместимость с браузерами
| Рабочий стол | Мобильные устройства | |||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Chrome | Edge | Firefox | Internet Explorer | Opera | Safari | WebView Android | Chrome Android | Firefox for Android | Opera Android | Safari на iOS | Samsung Internet | |
executeScript |
5["Расширения не могут вставлять скрипты на свои собственные страницы с помощью этого API.", "Доступно только в Manifest V2."] |
14Доступно только в Manifest V2. |
43["До версии 50 Firefox передавал единственное значение результата в обратный вызов, а не массив, если не было установлено 'allFrames'.", "Доступно только в Manifest V2."] |
? | 15["Расширения не могут вставлять скрипты на свои собственные страницы с помощью этого API.", "Доступно только в Manifest V2."] |
14Доступно только в Manifest V2. |
? | ? | 54Доступно только в Manifest V2. |
? | 15Доступно только в Manifest V2. |
? |
frameId |
39 | 79 | 43'allFrames' и 'frameId' не могут быть установлены одновременно. |
? | 26 | 14 | ? | ? | 54'allFrames' и 'frameId' не могут быть установлены одновременно. |
? | 15 | ? |
matchAboutBlank |
39 | 14 | 53 | ? | 26 | Нет | ? | ? | 54 | ? | Нет | ? |
runAt |
20 | 79 | 43 | ? | 15 | Нет | ? | ? | 54 | ? | Нет | ? |
Примечание: Этот API основан на API chrome.tabs Chromium. Данная документация взята из tabs.json кода Chromium.
© 2005–2023 MDN contributors.
Licensed under the Creative Commons Attribution-ShareAlike License v2.5 or later.
https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/tabs/executeScript