如何访问加载到BrowserView
中的内容的DOM?
我有一个这样定义的BrowserWindow
和BrowserView
(仅在我开始工作之前定义):
let win = null
let view = null
// Create the window
win = new BrowserWindow({
height: 600,
width: 800
})
// HTML file to load into window
win.loadFile('main.html')
// Create main browserView
view = new BrowserView()
// Set BrowserView bounds (usually in a function to handle window resize)
wb = win.getBounds()
view.setBounds({ x: 0, y: 0, width: wb.width, height: wb.height })
// Set BrowserView in window
win.setBrowserView(view)
// Load url in BrowserView
view.webContents.loadURL(url)
main.html是样板:<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Testing</title>
</head>
<body>
<script type="text/javascript" src="./renderer.js"></script>
</body>
</html>
renderer.js也是如此:const { ipcRenderer } = require('electron')
const $ = require('jquery')
我可以将输入发送到这样的 View (main.js):view.webContents.sendInputEvent({type: 'keyDown', keyCode: 'space'})
我可以在这样的 View 中监听一般事件(main.js):view.webContents.on('media-started-playing', () => {
console.log('Playing')
})
但是,如何在BrowserView
中访问已加载URL的DOM?我可以在
<webview>
上找到章节和经文,但这是另一种动物。我发现有关
BrowserView
和<webview>
之间的渲染器过程差异的问题,提到BrowserView
使用与BrowserWindow
相同的渲染器过程,但对我来说没有任何意义,因为BrowserView
内容如何知道是否没有引用?对于踢球,当BrowserView
内容完成加载并且什么都没发生时,我尝试使用IPC channel 从main到渲染器更改已知div ID上的背景颜色。甚至将其绑在按钮和nada上,这同样也就不足为奇了。我觉得这对于树木情况必定是一个难题。
我正在使用Electron 11。
最佳答案
您必须通过view.webContents.executeJavaScript("document.getElementById(...)")
获得此信息。
该页面是在单独的渲染器进程中加载的,因此,除了通过executeJavaScript` API之外,您不能真正从主进程访问该信息。
如果您可以控制页面,则可以通过IPC发送适当的信息,尽管由于无法按照here正确地序列化整个DOM元素,因此您将无法发送整个DOM元素:
Cloning DOM nodes likewise throws a
DATA_CLONE_ERR
exception.
关于javascript - 在Electron BrowserView中访问DOM,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65511624/