<webview> 标签是 Electron 中用于嵌入和加载独立 web 内容的标签。与 <iframe> 不同,<webview> 元素是一个完整的、独立的渲染进程,具有自己的上下文,类似于一个额外的窗口。

以下是使用 <webview> 标签的基本示例:
<!-- index.html -->
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Electron WebView Example</title>
</head>
<body>
  <webview id="exampleWebView" src="https://example.com" style="width: 800px; height: 600px;"></webview>
</body>
</html>

在上述示例中,<webview> 元素的 src 属性指定了要加载的网址,而 style 属性指定了 WebView 的大小。

在渲染进程中,你可以使用 JavaScript 代码与 <webview> 进行交互。以下是一些基本的操作:
// renderer.js
const webView = document.getElementById('exampleWebView');

// 监听加载完成事件
webView.addEventListener('did-finish-load', () => {
  console.log('WebView finished loading');
});

// 执行 WebView 中的 JavaScript 代码
webView.executeJavaScript('alert("Hello from WebView!");');

// 在 WebView 中执行打开 DevTools 的操作
webView.openDevTools();

在主进程中,你可以通过 webContents 对象与 <webview> 进行进程间通信。以下是一个简单的例子:
// main.js
const { app, BrowserWindow } = require('electron');

let mainWindow;

function createWindow() {
  mainWindow = new BrowserWindow({
    width: 800,
    height: 600,
    webPreferences: {
      nodeIntegration: true
    }
  });

  mainWindow.loadFile('index.html');
}

app.whenReady().then(createWindow);

app.on('window-all-closed', () => {
  if (process.platform !== 'darwin') {
    app.quit();
  }
});

app.on('activate', () => {
  if (BrowserWindow.getAllWindows().length === 0) {
    createWindow();
  }
});

// 在主进程中监听 WebView 中的 IPC 消息
app.on('web-contents-created', (event, contents) => {
  contents.on('ipc-message', (event, channel, ...args) => {
    console.log(`Received IPC message from WebView: ${channel}`, args);
  });
});

在上述例子中,主进程通过监听 'web-contents-created' 事件,捕获了 WebView 的 IPC 消息。在 WebView 中,你可以使用 ipcRenderer 发送消息到主进程。

请注意,由于 WebView 具有独立的渲染进程,与主进程的通信可能需要使用 IPC。此外,使用 <webview> 时,请确保考虑安全性和跨站脚本攻击的问题。在加载不受信任的内容时,请格外小心。


转载请注明出处:http://www.pingtaimeng.com/article/detail/10913/Electron