Electron 电子-如何复制浏览器窗口?

Electron 电子-如何复制浏览器窗口?,electron,Electron,我正在尝试在我的应用程序中使用动态窗口系统。当你打开两个浏览器时,你想通过拖放将一个标签移动到另一个Chrome实例上,这与Google Chrome的做法非常相似 我可能可以侦听拖动的事件以获取选项卡的DOM引用,在前端应用程序中复制其状态/路由,将其传递到辅助BrowserWindow,并将选项卡实例重新创建到另一个BrowserWindow。但我将取消第一个选项卡的当前修改。在chrome中,当你移动一个标签时,你不会丢失标签中加载的内容 我真的找不到一种方法来复制BrowserWindo

我正在尝试在我的应用程序中使用动态窗口系统。当你打开两个浏览器时,你想通过拖放将一个标签移动到另一个Chrome实例上,这与Google Chrome的做法非常相似

我可能可以侦听拖动的事件以获取选项卡的DOM引用,在前端应用程序中复制其状态/路由,将其传递到辅助BrowserWindow,并将选项卡实例重新创建到另一个BrowserWindow。但我将取消第一个选项卡的当前修改。在chrome中,当你移动一个标签时,你不会丢失标签中加载的内容

我真的找不到一种方法来复制BrowserWindow的内容,共享/移动DOM的内容而不丢失其状态,或者对我的选项卡实例进行一些繁重的构造逻辑以防止丢失任何内容


如果你对我如何实现这样一件事有一个方向的话,我有点迷茫了。谢谢。

我终于找到了实现这一目标的方法

BrowserWindow可以附加BrowserView

因此,当我创建BrowserWindow时,我会传递一个额外的参数,如下所示:

var-win=新浏览器窗口({
网络首选项:{
其他参数:['mainbrowserwindow']
}
})
//然后我加载这个浏览器窗口的index.html文件
加载文件('/path/to/index.html');
这将告诉我的前端,这个实例是由“主窗口”视图生成的。这样,我就可以为应用程序的每个部分使用一个index.html文件。我只需要一点基于这个附加参数的路由

在那之后,我创建了一个新的BrowserView,我向它传递另一个附加参数,告诉它加载我的应用程序的特定页面(比如说用户信息选项卡)

var视图=新建浏览器视图({
网络首选项:{
其他参数:['page=userinfo']
}
})
//然后为这个视图加载相同的index.html
view.loadFile(“/path/to/index.html”)
我终于将我的BrowserView添加到我的BrowserWindow

win.setBrowserView(视图)
在我的前端,路由“mainbrowserwindow”将只生成我的应用程序的选项卡。“userinfo”路由是选项卡的内容

现在,我可以创建另一个BrowserWindow,并使用相同的命令将其填充到“userinfo”视图中

win2.setBrowserView(视图)
这会将第一个userinfo页面移动到另一个Browser窗口,而不会丢失内存中的数据


理论上,这应该是可行的。但显然还有很多事情要做(IPC通信以在多个浏览器窗口之间同步选项卡,确保不存在空选项卡,彻底销毁选项卡以避免内存泄漏)。当然,应用程序将在内存中呈现并保存大量页面,我认为不可能在文件中序列化BrowserView。

有趣的问题,我不知道是否支持此功能,但可能值得一试。@Joshua这是一个不错的软件包建议,但经过一些研究后,目前还不支持标签的复制(有一个问题已经揭晓,该软件包的创建者在2019年4月表示,他们最终将开发该功能)。我想我会读一下他们的源代码,尝试构建自己的解决方案。谢谢你的帮助:)