devtools.inspectedWindow.eval()
Выполняет JavaScript в окне, к которому прикреплены инструменты разработчика.
Это немного похоже на использование tabs.executeScript() для прикрепления скрипта содержимого, но с двумя основными отличиями:
Во-первых, JavaScript может использовать набор специальных команд, которые браузеры обычно предоставляют в консоли инструментов разработчика: например, использовать "$0" для ссылки на элемент, который в данный момент выбран в инспекторе.
Во-вторых, JavaScript, который вы выполняете, может видеть любые изменения, внесённые в страницу скриптами, загруженными на странице. Это в отличие от скриптов содержимого, которые видят страницу такой, какой она была бы, если бы скрипты страницы не были загружены. Однако обратите внимание, что изоляция, обеспечиваемая скриптами содержимого, — это умышленная функция безопасности, призванная затруднить злонамеренным или несотрудничающим веб-страницам вводить в заблуждение или подменять API WebExtensions путём переопределения функций и свойств DOM. Это означает, что вам нужно быть очень внимательными, если вы отказываетесь от этой защиты, используя eval(), и следует использовать скрипты содержимого, если вам не нужно использовать eval().
Скрипт по умолчанию оценивается в основном фрейме страницы. Скрипт должен оцениваться в значение, которое может быть представлено в формате JSON (что означает, что, например, он не может оцениваться в функцию или объект, содержащий какие-либо функции). По умолчанию скрипт не видит какие-либо скрипты содержимого, прикреплённые к странице.
Вы не можете вызвать eval() на привилегированных окнах браузера, таких как "about:addons".
Вы можете необязательно предоставить параметр options, который включает параметры для оценки скрипта в другом фрейме или в контексте прикреплённых скриптов содержимого. Обратите внимание, что Firefox пока не поддерживает параметр options.
Функция eval() возвращает Promise, которая завершается результатом оценки скрипта или ошибкой.
Справочные объекты
Скрипт получает доступ к ряду объектов, которые помогают инжектированному скрипту взаимодействовать с инструментами разработчика. В настоящее время поддерживаются следующие вспомогательные объекты:
$0-
Содержит ссылку на элемент, который в данный момент выбран в инспекторе инструментов разработчика.
inspect()-
Если переданный объект является элементом DOM на странице, он выбирает его в инспекторе инструментов разработчика; в противном случае он создаёт предварительный просмотр объекта в веб-консоли.
Синтаксис
let evaluating = browser.devtools.inspectedWindow.eval( expression, // string options // object )
Параметры
expression-
string. JavaScript-выражение для оценки. Строка должна быть оценена в объект, который может быть представлен в формате JSON, в противном случае будет выброшено исключение. Например,expressionне должно быть оценено в функцию. -
optionsНеобязательно -
object. Параметры для функции (обратите внимание, что Firefox пока не поддерживает эти параметры), как указано ниже:-
frameURLНеобязательно -
string. URL фрейма, в котором нужно оценить выражение. Если это опущено, выражение оценивается в основном фрейме окна. -
useContentScriptContextНеобязательно -
boolean. Еслиtrue, оценить выражение в контексте любых скриптов содержимого, которые эта надстройка прикрепила к странице. Если вы установили этот параметр, вы должны были прикрепить какие-либо скрипты содержимого к странице, в противном случае будет выброшена ошибка DevTools. -
contextSecurityOriginНеобязательно -
string. Оценить выражение в контексте скрипта содержимого, прикреплённого другой надстройкой, чьё происхождение соответствует указанному значению. Это переопределяетuseContentScriptContext.
-
Возвращаемое значение
A Promise, который будет выполнен с array, содержащим два элемента.
Если ошибка не произошла, элемент 0 будет содержать результат оценки выражения, а элемент 1 будет undefined.
Если произошла ошибка, элемент 0 будет undefined, а элемент 1 будет содержать объект, дающий подробности об ошибке. Различаются два типа ошибок:
- ошибки, возникшие при оценке JavaScript (например, синтаксические ошибки в выражении). В этом случае элемент 1 будет содержать:
- логическое свойство
isException, установленное вtrue - строковое свойство
value, дающее более подробные сведения.
- логическое свойство
- другие ошибки (например, выражение, которое оценивается в объект, который не может быть представлен в формате JSON). В этом случае элемент 1 будет содержать:
- логическое свойство
isError, установленное вtrue - строковое свойство
codeсодержащее код ошибки.
- логическое свойство
Совместимость с браузерами
| Рабочие столы | Мобильные устройства | |||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Chrome | Edge | Firefox | Internet Explorer | Opera | Safari | WebView Android | Chrome Android | Firefox для Android | Opera Android | Safari на iOS | Samsung Internet | |
$0 |
Да | 79 | 55 | ? | Да | 16 | ? | ? | Нет | ? | Нет | ? |
eval |
Да | 79 | 54 | ? | Да | 16 | ? | ? | Нет | ? | Нет | ? |
inspect |
Да | 79 | 55 | ? | Да | 16 | ? | ? | Нет | ? | Нет | ? |
options |
Да | 79 | Нет | ? | Да | 16 | ? | ? | Нет | ? | Нет | ? |
Примеры
Этот пример проверяет, определена ли jQuery в проверяемом окне, и выводит результат. Обратите внимание, что это не сработает в скрипте содержимого, поскольку даже если jQuery будет определена, скрипт содержимого её не увидит.
function handleError(error) { if (error.isError) { console.log(`Devtools error: ${error.code}`); } else { console.log(`JavaScript error: ${error.value}`); } } function handleResult(result) { console.log(result); if (result[0] !== undefined) { console.log(`jQuery: ${result[0]}`); } else if (result[1]) { handleError(result[1]); } } const checkjQuery = "typeof jQuery !== 'undefined'"; evalButton.addEventListener("click", () => { browser.devtools.inspectedWindow.eval(checkjQuery) .then(handleResult); });
Примеры использования вспомогательных объектов
Этот пример использует вспомогательный объект $0 для изменения цвета фона элемента, который в данный момент выбран в инспекторе:
const evalButton = document.querySelector("#reddinate"); const evalString = "$0.style.backgroundColor = 'red'"; function handleError(error) { if (error.isError) { console.log(`Devtools error: ${error.code}`); } else { console.log(`JavaScript error: ${error.value}`); } } function handleResult(result) { if (result[1]) { handleError(result[1]); } } evalButton.addEventListener("click", () => { browser.devtools.inspectedWindow.eval(evalString) .then(handleResult); });
Этот пример использует вспомогательный объект inspect() для выбора первого элемента <h1> на странице:
const inspectButton = document.querySelector("#inspect"); const inspectString = "inspect(document.querySelector('h1'))"; function handleError(error) { if (error.isError) { console.log(`Devtools error: ${error.code}`); } else { console.log(`JavaScript error: ${error.value}`); } } function handleResult(result) { if (result[1]) { handleError(result[1]); } } inspectButton.addEventListener("click", () => { browser.devtools.inspectedWindow.eval(inspectString) .then(handleResult); });
Примечание: Этот API основан на API chrome.devtools от 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/devtools/inspectedWindow/eval