Spec-Zone.ru › Web Extensions

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);

Примеры расширений

  • beastify
  • context-menu-copy-link-with-types
  • devtools-panels
  • imagify
  • menu-demo
  • menu-remove-element

Совместимость с браузерами

Рабочий стол Мобильные устройства
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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API