我正在构建的应用程序基本上将在其中托管其他网页作为子视图(BrowserViews),类似于chrome如何在一个窗口(BrowserWindow)中渲染不同的选项卡。
我面临一个问题,当一个 BrowserView 卡住(故意)时,我无法使用
removeBrowserView
将其从主 BrowserWindow 中删除,似乎只有当卡住的视图滥用许多 console.log 的内存时才应用它。
我的代码如下: 主流程索引.ts:
const createWindow = (): void => {
// Create the browser window.
const mainWindow = new BrowserWindow({
height: 600,
width: 800,
webPreferences: {
preload: MAIN_WINDOW_PRELOAD_WEBPACK_ENTRY,
},
});
// and load the index.html of the app.
mainWindow.loadURL(MAIN_WINDOW_WEBPACK_ENTRY);
const stuckme1 = new BrowserView();
stuckme1.webContents.loadURL(STUCKME_WEBPACK_ENTRY);
stuckme1.setBounds({ x: 0, y: 0, height: 200, width: 200 });
const stuckme2 = new BrowserView();
stuckme2.webContents.loadURL(STUCKME2_WEBPACK_ENTRY);
stuckme2.setBounds({ x: 0, y: 0, height: 200, width: 200 });
let toggle = true;
setInterval(() => {
if (toggle) {
mainWindow.removeBrowserView(stuckme1);
mainWindow.addBrowserView(stuckme2);
} else {
mainWindow.removeBrowserView(stuckme2);
mainWindow.addBrowserView(stuckme1);
}
toggle = !toggle;
}, 1000);
};
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8" />
<title>Hello World!</title>
<style>
body {
border: 1px soild green;
}
</style>
<script type="text/javascript">
setInterval(() => {
document.querySelector(".counter").innerHTML = Number(document.querySelector(".counter").innerHTML) + 1
}, 1000);
setTimeout(() => {
while (true) { console.log("stuck"); }
}, 5000);
</script>
</head>
<body>
<p>Stuck me</p>
<span class="counter"></span>
</body>
</html>
和Stickme2.html:
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8" />
<title>Hello World!</title>
<style>
body {
border: 1px soild red;
}
</style>
<script type="text/javascript">
setInterval(() => {
document.querySelector(".counter").innerHTML = Number(document.querySelector(".counter").innerHTML) + 1
}, 1000);
</script>
</head>
<body>
<p>Stuck me2</p>
<span class="counter"></span>
</body>
</html>
5秒后, 仅显示第一个stuckme.html,主流程似乎无法删除视图并显示第二个视图。 没有抛出错误,但是内存使用量不断变大。
我需要一种方法来保持视图响应,即使其中编写了错误的代码。
感谢对此的任何帮助。
谢谢!
以下解决方案对我有用:
stuckme1.webContents.close()