跳转至

<webview> 标签

警告

Electron 的 webview 标签基于 Chromium 的 webview,而它正在经历重大的架构变更。这会影响 webviews 的稳定性,包括渲染、导航和事件路由。我们目前建议不要使用 webview 标签,并考虑替代方案,例如 iframe、WebContentsView,或完全避免嵌入内容的架构。

启用

默认情况下,在 Electron >= 5 中 webview 标签是禁用的。你需要在构造 BrowserWindow 时设置 webviewTag webPreferences 选项来启用该标签。更多信息请参见 BrowserWindow 构造函数文档。

概述

在隔离的框架和进程中显示外部 Web 内容。

进程:渲染进程
此类未从 'electron' 模块导出。它仅可作为 Electron API 中其他方法的返回值使用。

使用 webview 标签可在你的 Electron 应用中嵌入“来宾”内容(例如网页)。来宾内容包含在 webview 容器内。应用中的嵌入页面控制来宾内容的布局和渲染方式。

与 iframe 不同,webview 运行在与你的应用不同的进程中。它没有与你的网页相同的权限,并且你的应用与嵌入内容之间的所有交互都是异步的。这可使你的应用免受嵌入内容的影响。

[!NOTE] 从宿主页面调用 webview 的大多数方法都需要对主进程进行同步调用。

示例

要在应用中嵌入网页,请将 webview 标签添加到应用的嵌入页面(即显示来宾内容的应用页面)。在最简单的形式中,webview 标签包含网页的 src 以及控制 webview 容器外观的 css 样式:

<webview id="foo" src="https://www.github.com/" style="display:inline-flex; width:640px; height:480px"></webview>

如果你想以任何方式控制来宾内容,可以编写 JavaScript 来监听 webview 事件,并使用 webview 方法响应这些事件。下面是带有两个事件监听器的示例代码:一个监听网页开始加载,另一个监听网页停止加载,并在加载期间显示“loading...”消息:

<script>
  onload = () => {
    const webview = document.querySelector('webview')
    const indicator = document.querySelector('.indicator')

    const loadstart = () => {
      indicator.innerText = 'loading...'
    }

    const loadstop = () => {
      indicator.innerText = ''
    }

    webview.addEventListener('did-start-loading', loadstart)
    webview.addEventListener('did-stop-loading', loadstop)
  }
</script>

内部实现

在底层,webview 使用 Out-of-Process iframes (OOPIFs) 实现。 webview 标签本质上是一个自定义元素,使用 shadow DOM 在其内部包装一个 iframe 元素。

因此,webview 的行为与跨域 iframe 非常相似,例如:

  • 当点击 webview 时,页面焦点会从嵌入框架移动到 webview。
  • 你不能为 webview 添加键盘、鼠标和滚动事件监听器。
  • 嵌入框架与 webview 之间的所有交互都是异步的。

CSS 样式说明

请注意,webview 标签的样式内部使用 display:flex;,以确保在使用传统布局和 flexbox 布局时,子 iframe 元素能够填满其 webview 容器的完整高度和宽度。请勿覆盖默认的 display:flex; CSS 属性,除非为内联布局指定 display:inline-flex;。

标签属性

webview 标签具有以下属性:

src

<webview src="https://www.github.com/"></webview>

一个表示可见 URL 的 string。写入此属性会启动顶层导航。

将 src 赋为其自身的值会重新加载当前页面。

src 属性还可以接受 data URL,例如 data:text/plain,Hello, world!。

nodeintegration

<webview src="https://www.google.com/" nodeintegration></webview>

一个 boolean。当此属性存在时,webview 中的来宾页面将具有 Node 集成,并可以使用 require 和 process 等 Node API 访问底层系统资源。来宾页面默认禁用 Node 集成。

nodeintegrationinsubframes

<webview src="https://www.google.com/" nodeintegrationinsubframes></webview>

一个 boolean,用于在 webview 内的子框架(例如 iframe)中启用 NodeJS 支持的实验性选项。你的所有预加载脚本都会为每个 iframe 加载,你可以使用 process.isMainFrame 来确定是否位于主框架中。此选项在来宾页面中默认禁用。

plugins

<webview src="https://www.github.com/" plugins></webview>

一个 boolean。当此属性存在时,webview 中的来宾页面将能够使用浏览器插件。插件默认禁用。

preload

<!-- from a file -->
<webview src="https://www.github.com/" preload="./test.js"></webview>
<!-- or if you want to load from an asar archive -->
<webview src="https://www.github.com/" preload="./app.asar/test.js"></webview>

一个 string,指定一个脚本,该脚本将在来宾页面中其他脚本运行之前加载。脚本 URL 的协议必须是 file:(即使使用 asar: 归档也是如此),因为它在底层将由 Node 的 require 加载,而 require 将 asar: 归档视为虚拟目录。

当来宾页面没有 Node 集成时,此脚本仍然可以访问所有 Node API,但 Node 注入的全局对象会在此脚本执行完毕后被删除。

httpreferrer

<webview src="https://www.github.com/" httpreferrer="https://example.com/"></webview>

一个用于设置来宾页面 referrer URL 的 string。

useragent

<webview src="https://www.github.com/" useragent="Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; AS; rv:11.0) like Gecko"></webview>

一个用于在导航到来宾页面之前设置其用户代理的 string。页面加载完成后,使用 setUserAgent 方法更改用户代理。

disablewebsecurity

<webview src="https://www.github.com/" disablewebsecurity></webview>

一个 boolean。当存在此属性时,来宾页面将禁用 Web 安全。默认情况下,Web 安全处于启用状态。

此值只能在首次导航之前修改。

partition

<webview src="https://github.com" partition="persist:github"></webview>
<webview src="https://electronjs.org" partition="electron"></webview>

一个用于设置页面所使用的会话的 string。如果 partition 以 persist: 开头,页面将使用一个持久会话,该会话可供应用中具有相同 partition 的所有页面使用。如果没有 persist: 前缀,页面将使用内存会话。通过分配相同的 partition,多个页面可以共享同一会话。如果未设置 partition,则使用应用的默认会话。

此值只能在首次导航之前修改,因为活动渲染器进程的会话无法更改。后续尝试修改该值将因 DOM 异常而失败。

allowpopups

<webview src="https://www.github.com/" allowpopups></webview>

一个 boolean。当存在此属性时,来宾页面将被允许打开新窗口,无论是通过 window.open(),还是通过在新窗口中打开的链接(例如修饰键点击或 target="_blank" 链接)。默认情况下,弹出窗口处于禁用状态。

webpreferences

<webview src="https://github.com" webpreferences="allowRunningInsecureContent, javascript=no"></webview>

一个 string,为逗号分隔的字符串列表,用于指定要设置在 webview 上的 Web 首选项。支持的完整首选项字符串列表可在 BrowserWindow 中找到。

该字符串遵循与 window.open 中 features 字符串相同的格式。单独的名称会被赋予 true 布尔值。可以通过包含 = 并后跟值,将首选项设置为其他值。特殊值 yes 和 1 被解释为 true,而 no 和 0 被解释为 false。

安全关键首选项不能用于使来宾页面比其嵌入方更不安全。当嵌入方将 contextIsolation、javascript、nodeIntegration、nodeIntegrationInWorker、sandbox、nodeIntegrationInSubFrames 或 enableWebSQL 中的任何一个设置为其更安全的值时,来宾页面将继承该值,并且对应的 webpreferences 条目将被忽略。

enableblinkfeatures

<webview src="https://www.github.com/" enableblinkfeatures="PreciseMemoryInfo, CSSVariables"></webview>

一个 string,为逗号分隔的字符串列表,用于指定要启用的 blink 功能。支持的完整功能字符串列表可在 RuntimeEnabledFeatures.json5 文件中找到。

disableblinkfeatures

<webview src="https://www.github.com/" disableblinkfeatures="PreciseMemoryInfo, CSSVariables"></webview>

一个 string,为逗号分隔的字符串列表,用于指定要禁用的 blink 功能。支持的完整功能字符串列表可在 RuntimeEnabledFeatures.json5 文件中找到。

方法

webview 标签具有以下方法:

[!NOTE] 在使用这些方法之前,必须加载 webview 元素。

示例

```js @ts-expect-error=[3] const webview = document.querySelector('webview') webview.addEventListener('dom-ready', () => { webview.openDevTools() })

### `<webview>.loadURL(url[, options])` {#webview-loadurlurl-options}

* `url` URL
* `options` Object(可选)
  * `httpReferrer` (string | [Referrer](structures/referrer.md))(可选)- HTTP Referrer URL。
  * `userAgent` string(可选)- 发起请求的用户代理。
  * `extraHeaders` string(可选)- 以 "\n" 分隔的额外请求头。
  * `postData` ([UploadRawData](structures/upload-raw-data.md) | [UploadFile](structures/upload-file.md))[](可选)
  * `baseURLForDataURL` string(可选)- 供 data url 加载的文件使用的基础 URL(带尾部路径分隔符)。仅当指定的 `url` 是 data url 且需要加载其他文件时才需要此值。

返回 `Promise<void>` - 当页面完成加载时,该 Promise 将 resolve(参见 [`did-finish-load`](webview-tag.md#event-did-finish-load));如果页面加载失败,则 reject(参见 [`did-fail-load`](webview-tag.md#event-did-fail-load))。

在 webview 中加载 `url`,`url` 必须包含协议前缀,例如 `http://` 或 `file://`。

### `<webview>.downloadURL(url[, options])` {#webview-downloadurlurl-options}

* `url` string
* `options` Object(可选)
  * `headers` Record\<string, string\>(可选)- HTTP 请求头。

在 `url` 处发起资源下载,而不进行导航。

### `<webview>.getURL()` {#webview-geturl}

返回 `string` - 来宾页面的 URL。

### `<webview>.getTitle()` {#webview-gettitle}

返回 `string` - 来宾页面的标题。

### `<webview>.isLoading()` {#webview-isloading}

返回 `boolean` - 来宾页面是否仍在加载资源。

### `<webview>.isLoadingMainFrame()` {#webview-isloadingmainframe}

返回 `boolean` - 主框架(而不仅仅是其中的 iframe 或 frame)是否仍在加载。

### `<webview>.isWaitingForResponse()` {#webview-iswaitingforresponse}

返回 `boolean` - 来宾页面是否正在等待页面主资源的首次响应。

### `<webview>.stop()` {#webview-stop}

停止任何待处理的导航。

### `<webview>.reload()` {#webview-reload}

重新加载来宾页面。

### `<webview>.reloadIgnoringCache()` {#webview-reloadignoringcache}

重新加载来宾页面并忽略缓存。



### `<webview>.canGoBack()` {#webview-can-go-back}

返回 `boolean` - 来宾页面是否可以后退。

### `<webview>.canGoForward()` {#webview-can-go-forward}

返回 `boolean` - 来宾页面是否可以前进。

### `<webview>.canGoToOffset(offset)` {#webview-can-go-to-offset-offset}

* `offset` Integer

返回 `boolean` - 来宾页面是否可以前往 `offset`。

### `<webview>.clearHistory()` {#webview-clear-history}

清除导航历史。

### `<webview>.goBack()` {#webview-go-back}

使来宾页面后退。

### `<webview>.goForward()` {#webview-go-forward}

使来宾页面前进。

### `<webview>.goToIndex(index)` {#webview-go-to-index-index}

* `index` Integer

导航到指定的绝对索引。

### `<webview>.goToOffset(offset)` {#webview-go-to-offset-offset}

* `offset` Integer

导航到相对于“当前条目”的指定偏移量。

### `<webview>.isCrashed()` {#webview-is-crashed}

返回 `boolean` - 渲染进程是否已崩溃。

### `<webview>.setUserAgent(userAgent)` {#webview-set-user-agent-user-agent}

* `userAgent` string

覆盖来宾页面的用户代理。

### `<webview>.getUserAgent()` {#webview-get-user-agent}

返回 `string` - 来宾页面的用户代理。

### `<webview>.insertCSS(css)` {#webview-insert-css-css}

* `css` string

返回 `Promise<string>` - 一个 Promise,解析为插入的 CSS 的键,之后可通过
`<webview>.removeInsertedCSS(key)` 移除该 CSS。

将 CSS 注入当前网页,并返回插入样式表的唯一键。

### `<webview>.removeInsertedCSS(key)` {#webview-remove-inserted-css-key}

* `key` string

返回 `Promise<void>` - 如果移除成功则解析。

从当前网页中移除插入的 CSS。样式表由其键标识,该键由 `<webview>.insertCSS(css)` 返回。

### `<webview>.executeJavaScript(code[, userGesture])` {#webview-execute-javascript-code-user-gesture}

* `code` string
* `userGesture` boolean (optional) - 默认 `false`。

返回 `Promise<any>` - 一个 Promise,解析为执行代码的结果;如果代码的结果是一个被拒绝的 Promise,则会被拒绝。

在页面中评估 `code`。如果设置了 `userGesture`,它将在页面中创建用户手势上下文。像 `requestFullScreen` 这类需要用户操作的 HTML API 可以利用此选项进行自动化。

### `<webview>.openDevTools()` {#webview-open-dev-tools}

为来宾页面打开一个 DevTools 窗口。

### `<webview>.closeDevTools()` {#webview-close-dev-tools}

关闭来宾页面的 DevTools 窗口。

### `<webview>.isDevToolsOpened()` {#webview-is-dev-tools-opened}

返回 `boolean` - 来宾页面是否已附加 DevTools 窗口。

### `<webview>.isDevToolsFocused()` {#webview-is-dev-tools-focused}

返回 `boolean` - 来宾页面的 DevTools 窗口是否处于聚焦状态。

### `<webview>.inspectElement(x, y)` {#webview-inspect-element-x-y}

* `x` Integer
* `y` Integer

开始检查来宾页面位置 (`x`, `y`) 处的元素。

### `<webview>.inspectSharedWorker()` {#webview-inspect-shared-worker}

为来宾页面中存在的共享工作线程上下文打开 DevTools。

### `<webview>.inspectServiceWorker()` {#webview-inspect-service-worker}

为来宾页面中存在的服务工作线程上下文打开 DevTools。

### `<webview>.setAudioMuted(muted)` {#webview-set-audio-muted-muted}

* `muted` boolean

设置来宾页面静音。

### `<webview>.isAudioMuted()` {#webview-is-audio-muted}

返回 `boolean` - 来宾页面是否已静音。

### `<webview>.isCurrentlyAudible()` {#webview-is-currently-audible}

返回 `boolean` - 当前是否正在播放音频。

### `<webview>.undo()` {#webview-undo}

在页面中执行编辑命令 `undo`。

### `<webview>.redo()` {#webview-redo}

在页面中执行编辑命令 `redo`。

### `<webview>.cut()` {#webview-cut}

在页面中执行编辑命令 `cut`。

### `<webview>.copy()` {#webview-copy}

在页面中执行编辑命令 `copy`。

#### `<webview>.centerSelection()` {#webview-center-selection}

在页面中将当前文本选择居中。

### `<webview>.paste()` {#webview-paste}

在页面中执行编辑命令 `paste`。

### `<webview>.pasteAndMatchStyle()` {#webview-paste-and-match-style}

在页面中执行编辑命令 `pasteAndMatchStyle`。

### `<webview>.delete()` {#webview-delete}

在页面中执行编辑命令 `delete`。

### `<webview>.selectAll()` {#webview-select-all}

在页面中执行编辑命令 `selectAll`。

### `<webview>.unselect()` {#webview-unselect}

在页面中执行编辑命令 `unselect`。

#### `<webview>.scrollToTop()` {#webview-scroll-to-top}

滚动到当前 `<webview>` 的顶部。

#### `<webview>.scrollToBottom()` {#webview-scroll-to-bottom}

滚动到当前 `<webview>` 的底部。

#### `<webview>.adjustSelection(options)` {#webview-adjust-selection-options}

* `options` Object
  * `start` Number (optional) - 当前选择起始索引的移动量。
  * `end` Number (optional) - 当前选择结束索引的移动量。

按给定数量调整聚焦框架中当前文本选择的起始点和结束点。负值将选择移向文档开头,正值将选择移向文档结尾。

示例请参见 [`webContents.adjustSelection`](web-contents.md#contentsadjustselectionoptions)。

### `<webview>.replace(text)` {#webview-replace-text}

* `text` string

在页面中执行编辑命令 `replace`。

### `<webview>.replaceMisspelling(text)` {#webview-replace-misspelling-text}

* `text` string

在页面中执行编辑命令 `replaceMisspelling`。

### `<webview>.insertText(text)` {#webview-insert-text-text}

* `text` string

返回 `Promise<void>`

将 `text` 插入到聚焦的元素中。

### `<webview>.findInPage(text[, options])` {#webview-find-in-page-text-options}

* `text` string - 要搜索的内容,不能为空。
* `options` Object (optional)
  * `forward` boolean (optional) - 是否向前或向后搜索,默认为 `true`。
  * `findNext` boolean (optional) - 是否使用此请求开始新的文本查找会话。初始请求应为 `true`,后续请求应为 `false`。默认为 `false`。
  * `matchCase` boolean (optional) - 搜索是否区分大小写,
    默认为 `false`。

返回 `Integer` - 用于该请求的请求 ID。

启动一个请求,以查找网页中 `text` 的所有匹配项。可通过订阅 [`found-in-page`](webview-tag.md#event-found-in-page) 事件获取请求结果。

### `<webview>.stopFindInPage(action)` {#webview-stop-find-in-page-action}

* `action` string - 指定结束
  [`<webview>.findInPage`](#webviewfindinpagetext-options) 请求时要执行的操作。
  * `clearSelection` - 清除选择。
  * `keepSelection` - 将选择转换为普通选择。
  * `activateSelection` - 聚焦并单击选择节点。

使用提供的 `action` 停止 `webview` 的任何 `findInPage` 请求。



### `<webview>.print([options])` {#webview-print-options}

* `options` Object(可选)
  * `silent` boolean(可选)- 不要询问用户打印设置。默认值为 `false`。
  * `printBackground` boolean(可选)- 打印网页的背景颜色和图像。默认值为 `false`。
  * `deviceName` string(可选)- 设置要使用的打印机设备名称。必须是系统定义的名称,而不是“友好”名称,例如 `Brother_QL_820NWB`,而不是 `Brother QL-820NWB`。
  * `color` boolean(可选)- 设置打印的网页是彩色还是灰度。默认值为 `true`。
  * `margins` Object(可选)
    * `marginType` string(可选)- 可以是 `default`、`none`、`printableArea` 或 `custom`。如果选择 `custom`,还需要指定 `top`、`bottom`、`left` 和 `right`。
    * `top` number(可选)- 打印网页的上边距,以像素为单位。
    * `bottom` number(可选)- 打印网页的下边距,以像素为单位。
    * `left` number(可选)- 打印网页的左边距,以像素为单位。
    * `right` number(可选)- 打印网页的右边距,以像素为单位。
  * `landscape` boolean(可选)- 是否以横向模式打印网页。默认值为 `false`。
  * `scaleFactor` number(可选)- 网页的缩放因子。
  * `pagesPerSheet` number(可选)- 每张纸打印的页数。
  * `collate` boolean(可选)- 是否对打印的网页进行整理。
  * `copies` number(可选)- 要打印的网页副本数。
  * `pageRanges` Object[](可选)- 要打印的页码范围。
    * `from` number - 要打印的第一页的索引(从 0 开始)。
    * `to` number - 要打印的最后一页的索引(包含该页)(从 0 开始)。
  * `duplexMode` string(可选)- 设置打印网页的双面模式。可以是 `simplex`、`shortEdge` 或 `longEdge`。
  * `dpi` Record\<string, number\>(可选)
    * `horizontal` number(可选)- 水平 dpi。
    * `vertical` number(可选)- 垂直 dpi。
  * `header` string(可选)- 作为页眉打印的字符串。
  * `footer` string(可选)- 作为页脚打印的字符串。
  * `pageSize` string | Size(可选)- 指定打印文档的页面大小。可以是 `A3`、
  `A4`、`A5`、`Legal`、`Letter`、`Tabloid`,或一个包含以微米为单位的 `height` 的对象。
  * `usePrinterDefaultPageSize` boolean(可选)- 是否使用系统的默认页面大小。默认值为 `false`。不能与 `pageSize` 一起使用。当提供 `deviceName` 时,使用该特定打印机的默认页面大小。当未提供 `deviceName` 时,使用系统默认打印机的默认页面大小。如果无法获取打印机的默认页面大小,则回退到 A4(210mm x 297mm)。

返回 `Promise<void>`

打印 `webview` 的网页。与 `webContents.print([options])` 相同。

### `<webview>.printToPDF(options)` {#webview-printtopdf-options}

* `options` [PrintToPDFOptions](structures/print-to-pdf-options.md?inline)

返回 `Promise<Uint8Array>` - 以生成的 PDF 数据解析。

将 `webview` 的网页打印为 PDF,与 `webContents.printToPDF(options)` 相同。

### `<webview>.capturePage([rect])` {#webview-capturepage-rect}

<!--
```YAML history
changes:
  - pr-url: https://github.com/electron/electron/pull/53813
    description: "The image now has the page's device scale factor, so `image.getSize()` is in DIPs."
    breaking-changes-header: behavior-changed-captured-page-images-have-the-pages-scale-factor
-->

  • rect Rectangle(可选)- 要捕获的页面区域。

返回 Promise<NativeImage> - 以一个 NativeImage 解析

捕获 rect 内页面的快照。省略 rect 将捕获整个可见页面。 该图像具有页面的设备缩放因子(对于离屏渲染,为 webPreferences.offscreen.deviceScaleFactor),因此 image.getSize() 以 DIP 为单位,而 image.toBitmap() 包含全分辨率像素。

<webview>.send(channel, ...args)

  • channel string
  • ...args any[]

返回 Promise<void>

通过 channel 向渲染进程发送异步消息,你还可以发送任意参数。渲染进程可以通过使用 ipcRenderer 模块监听 channel 事件来处理该消息。

示例请参见 webContents.send。

<webview>.sendToFrame(frameId, channel, ...args)

  • frameId [number, number] - [processId, frameId]
  • channel string
  • ...args any[]

返回 Promise<void>

通过 channel 向渲染进程发送异步消息,你还可以发送任意参数。渲染进程可以通过使用 ipcRenderer 模块监听 channel 事件来处理该消息。

示例请参见 webContents.sendToFrame。

<webview>.sendInputEvent(event)

返回 Promise<void>

向页面发送输入 event。

有关 event 对象的详细说明,请参见 webContents.sendInputEvent。

<webview>.setZoomFactor(factor)

  • factor number - 缩放因子。

将缩放因子更改为指定因子。缩放因子是缩放百分比除以 100,因此 300% = 3.0。

<webview>.setZoomLevel(level)

  • level number - 缩放级别。

将缩放级别更改为指定级别。原始大小为 0,每增加或减少一级分别表示放大或缩小 20%,默认限制分别为原始大小的 300% 和 50%。其公式为 scale := 1.2 ^ level。

[!NOTE] Chromium 级别的缩放策略是同源策略,这意味着特定域名的缩放级别会传播到所有具有相同域名的窗口实例。区分窗口 URL 可使缩放按窗口生效。

<webview>.getZoomFactor()

返回 number - 当前缩放因子。

<webview>.getZoomLevel()

返回 number - 当前缩放级别。

<webview>.setVisualZoomLevelLimits(minimumLevel, maximumLevel)

  • minimumLevel number
  • maximumLevel number

返回 Promise<void>

设置捏合缩放的最大和最小级别。

<webview>.showDefinitionForSelection() macOS

显示弹出式词典,用于搜索页面上选中的单词。

<webview>.getWebContentsId()

返回 number - 此 webview 的 WebContents ID。

DOM Events

以下 DOM 事件可用于 webview 标签:

事件:'load-commit'

返回:

  • url string
  • isMainFrame boolean

当加载已提交时触发。这包括当前文档内的导航以及子框架的文档级加载,但不包括异步资源加载。

事件:'did-finish-load'

当导航完成时触发,即选项卡中的加载指示器停止旋转,并且 onload 事件被派发。

事件:'did-fail-load'

返回:

  • errorCode Integer
  • errorDescription string
  • validatedURL string
  • isMainFrame boolean

此事件类似于 did-finish-load,但在加载失败或被取消时触发,例如调用了 window.stop()。

事件:'did-frame-finish-load'

返回:

  • isMainFrame boolean

当某个框架完成导航时触发。

事件:'did-start-loading'

对应选项卡中的加载指示器开始旋转的时间点。

事件:'did-stop-loading'

对应选项卡中的加载指示器停止旋转的时间点。

事件:'did-attach'

当附加到嵌入方的 WebContents 时触发。

事件:'dom-ready'

当给定框架中的文档加载完成时触发。

事件:'page-title-updated'

返回:

  • title string
  • explicitSet boolean

当导航期间设置页面标题时触发。当标题由文件 URL 合成时,explicitSet 为 false。

事件:'page-favicon-updated'

返回:

  • favicons string[] - URL 数组。

当页面接收到 favicon URL 时触发。

事件:'enter-html-full-screen'

当页面通过 HTML API 进入全屏时触发。

事件:'leave-html-full-screen'

当页面通过 HTML API 退出全屏时触发。

事件:'console-message'

返回:

  • level Integer - 日志级别,从 0 到 3。依次对应 verbose、info、warning 和 error。
  • message string - 实际的 console 消息
  • line Integer - 触发此 console 消息的源代码行号
  • sourceId string

当访客窗口记录 console 消息时触发。

以下示例代码将所有日志消息转发到嵌入方的 console,而不考虑日志级别或其他属性。

```js @ts-expect-error=[3] const webview = document.querySelector('webview') webview.addEventListener('console-message', (e) => { console.log('Guest page logged a message:', e.message) })

### 事件:'found-in-page' {#event-found-in-page}

返回:

* `result` Object
  * `requestId` Integer
  * `activeMatchOrdinal` Integer - 活动匹配的位置。
  * `matches` Integer - 匹配数量。
  * `selectionArea` Rectangle - 第一个匹配区域的坐标。
  * `finalUpdate` boolean

当 [`webview.findInPage`](#webviewfindinpagetext-options) 请求的结果可用时触发。

```js @ts-expect-error=[3,6]
const webview = document.querySelector('webview')
webview.addEventListener('found-in-page', (e) => {
  webview.stopFindInPage('keepSelection')
})

const requestId = webview.findInPage('test')
console.log(requestId)

事件:'will-navigate'

返回:

  • url string

当用户或页面想要开始导航时发出。当 window.location 对象发生变化或用户点击页面中的链接时,可能会发生这种情况。

当通过 <webview>.loadURL 和 <webview>.back 等 API 以编程方式启动导航时,不会发出此事件。

在页面内导航期间也不会发出此事件,例如点击锚点链接或更新 window.location.hash。请为此目的使用 did-navigate-in-page 事件。

调用 event.preventDefault() 不会产生任何效果。

事件:'will-frame-navigate'

返回:

  • url string
  • isMainFrame boolean
  • frameProcessId Integer
  • frameRoutingId Integer

当用户或页面想要在 <webview> 或其中嵌入的任何框架中任意位置开始导航时发出。当 window.location 对象发生变化或用户点击页面中的链接时,可能会发生这种情况。

当通过 <webview>.loadURL 和 <webview>.back 等 API 以编程方式启动导航时,不会发出此事件。

在页面内导航期间也不会发出此事件,例如点击锚点链接或更新 window.location.hash。请为此目的使用 did-navigate-in-page 事件。

调用 event.preventDefault() 不会产生任何效果。

事件:'did-start-navigation'

返回:

  • url string
  • isInPlace boolean
  • isMainFrame boolean
  • frameProcessId Integer
  • frameRoutingId Integer

当任何框架(包括主框架)开始导航时发出。对于页面内导航,isInPlace 将为 true。

事件:'did-redirect-navigation'

返回:

  • url string
  • isInPlace boolean
  • isMainFrame boolean
  • frameProcessId Integer
  • frameRoutingId Integer

在导航期间发生服务器端重定向后发出。例如 302 重定向。

事件:'did-navigate'

返回:

  • url string

当导航完成时发出。

对于页面内导航,例如点击锚点链接或更新 window.location.hash,不会发出此事件。请为此目的使用 did-navigate-in-page 事件。

事件:'did-frame-navigate'

返回:

  • url string
  • httpResponseCode Integer - 非 HTTP 导航为 -1
  • httpStatusText string - 非 HTTP 导航为空,
  • isMainFrame boolean
  • frameProcessId Integer
  • frameRoutingId Integer

当任何框架导航完成时发出。

This event is not emitted for in-page navigations, such as clicking anchor links or updating the window.location.hash. Use did-navigate-in-page event for this purpose.

事件:'did-navigate-in-page'

返回:

  • isMainFrame boolean
  • url string

当发生页内导航时发出。

当发生页内导航时,页面 URL 会发生变化,但不会导致页面外导航。发生这种情况的示例包括点击锚点链接,或触发 DOM hashchange 事件。

事件:'close'

当客页尝试关闭自身时触发。

以下示例代码在客页尝试关闭自身时,将 webview 导航到 about:blank。

```js @ts-expect-error=[3] const webview = document.querySelector('webview') webview.addEventListener('close', () => { webview.src = 'about:blank' })

### 事件:'ipc-message' {#event-ipc-message}

返回:

* `frameId` [number, number] - `[processId, frameId]` 对。
* `channel` string
* `args` any[]

当客页向宿主页面发送异步消息时触发。
`frameId` 不会告诉宿主页面哪个文档发送了消息;当这很重要时,让客页使用 `ipcRenderer.send()`,并在主进程中处理客页 `webContents` 的 [`ipc-message`](web-contents.md#event-ipc-message) 事件,其中 `event.senderFrame` 标识发送者。

使用 `sendToHost` 方法和 `ipc-message` 事件,可以在客页和宿主页面之间进行通信:

```js @ts-expect-error=[4,7]
// In embedder page.
const webview = document.querySelector('webview')
webview.addEventListener('ipc-message', (event) => {
  console.log(event.channel)
  // Prints "pong"
})
webview.send('ping')

// In guest page.
const { ipcRenderer } = require('electron')

ipcRenderer.on('ping', () => {
  ipcRenderer.sendToHost('pong')
})

事件:'render-process-gone'

返回:

当渲染进程意外消失时触发。这通常是因为它崩溃或被终止。

事件:'destroyed'

当 WebContents 被销毁时触发。

事件:'media-started-playing'

当媒体开始播放时发出。

事件:'media-paused'

当媒体暂停或播放完成时发出。

事件:'did-change-theme-color'

返回:

  • themeColor string

当页面的主题颜色发生变化时发出。这通常是由于遇到 meta 标签:

<meta name='theme-color' content='#ff0000'>

事件:'update-target-url'

返回:

  • url string

当鼠标移动到链接上,或键盘将焦点移动到链接上时发出。

事件:'devtools-open-url'

返回:

  • url string - 被点击或选中的链接的 URL。

当在 DevTools 中点击链接,或在链接的上下文菜单中选择“在新标签页中打开”时发出。

事件:'devtools-search-query'

返回:

  • event Event
  • query string - 要查询的文本。

当在文本的上下文菜单中选择“搜索”时发出。

事件:'devtools-opened'

当 DevTools 打开时发出。

事件:'devtools-closed'

当 DevTools 关闭时发出。

事件:'devtools-focused'

当 DevTools 获得焦点 / 打开时发出。

事件:'context-menu'

返回:

  • params Object
  • x Integer - x 坐标。
  • y Integer - y 坐标。
  • linkURL string - 包含触发上下文菜单的节点的链接的 URL。
  • linkText string - 与链接关联的文本。如果链接的内容是图像,则可能为空字符串。
  • pageURL string - 触发上下文菜单的顶层页面的 URL。
  • frameURL string - 触发上下文菜单的子框架的 URL。
  • srcURL string - 触发上下文菜单的元素的源 URL。具有源 URL 的元素是图像、音频和视频。
  • mediaType string - 触发上下文菜单的节点的类型。可以是 none、image、audio、video、canvas、file 或 plugin。
  • hasImageContents boolean - 上下文菜单是否在一个具有非空内容的图像上触发。
  • isEditable boolean - 上下文是否可编辑。
  • selectionText string - 触发上下文菜单的选区的文本。
  • titleText string - 触发上下文菜单的选区的标题文本。
  • altText string - 触发上下文菜单的选区的替代文本。
  • suggestedFilename string - 通过上下文菜单的“另存链接为”选项保存文件时使用的建议文件名。
  • selectionRect Rectangle - 表示选区在文档空间中的坐标的矩形。
  • selectionStartOffset number - 选中文本的起始位置。
  • referrerPolicy Referrer - 触发菜单的框架的 referrer 策略。
  • misspelledWord string - 光标下的拼写错误单词(如果存在)。
  • dictionarySuggestions string[] - 建议单词数组,用于向用户显示以替换 misspelledWord。仅当存在拼写错误单词且启用拼写检查器时可用。
  • frameCharset string - 触发菜单的框架的字符编码。
  • formControlType string - 触发上下文菜单的源。 可能的值包括 none、button-button、field-set、 input-button、input-checkbox、input-color、input-date、 input-datetime-local、input-email、input-file、input-hidden、 input-image、input-month、input-number、input-password、input-radio、 input-range、input-reset、input-search、input-submit、input-telephone、 input-text、input-time、input-url、input-week、output、reset-button、 select-list、select-list、select-multiple、select-one、submit-button、 以及 text-area,
  • spellcheckEnabled boolean - 如果上下文可编辑,是否启用拼写检查。
  • menuSourceType string - 触发上下文菜单的输入源。 可以是 none、mouse、keyboard、touch、touchMenu、longPress、longTap、touchHandle、stylus、adjustSelection 或 adjustSelectionReset。
  • mediaFlags Object - 触发上下文菜单的媒体元素的标志。
    • inError boolean - 媒体元素是否已崩溃。
    • isPaused boolean - 媒体元素是否已暂停。
    • isMuted boolean - 媒体元素是否已静音。
    • hasAudio boolean - 媒体元素是否有音频。
    • isLooping boolean - 媒体元素是否正在循环播放。
    • isControlsVisible boolean - 媒体元素的控件是否可见。
    • canToggleControls boolean - 媒体元素的控件是否可切换。
    • canPrint boolean - 媒体元素是否可打印。
    • canSave boolean - 媒体元素是否可下载。
    • canShowPictureInPicture boolean - 媒体元素是否可显示画中画。
    • isShowingPictureInPicture boolean - 媒体元素当前是否正在显示画中画。
    • canRotate boolean - 媒体元素是否可旋转。
    • canLoop boolean - 媒体元素是否可循环播放。
  • editFlags Object - 这些标志指示渲染器认为它是否能够执行相应操作。
    • canUndo boolean - 渲染器是否认为它可以撤销。
    • canRedo boolean - 渲染器是否认为它可以重做。
    • canCut boolean - 渲染器是否认为它可以剪切。
    • canCopy boolean - 渲染器是否认为它可以复制。
    • canPaste boolean - 渲染器是否认为它可以粘贴。
    • canDelete boolean - 渲染器是否认为它可以删除。
    • canSelectAll boolean - 渲染器是否认为它可以全选。
    • canEditRichly boolean - 渲染器是否认为它可以富文本编辑。

当出现需要处理的新上下文菜单时发出。

本页原文 Markdown:在 AtomGit 查看·内容源自开源项目 el/electron