如何动态更改预加载脚本中公开的内容?
How to dynamically change what's exposed in a preload script?
我有一个带有预加载脚本的 BrowserWindow
。
我想根据加载的页面在预加载脚本中显示不同的内容。
在我的应用程序中,要么加载页面 A 并导航到页面 B,要么从头加载页面 B。
我正在考虑通过以下方式向我的预加载传递额外的参数:
{
preload: "path_to_preload.js",
additionalArguments: ["onPageB"]
}
然后我的preload可以做:
const onPageB = process.argv.find(arg => arg === "onPageB");
然后我根据页面 B 的需要设置我的预加载脚本。
但是,我的预加载脚本最初可以加载页面 A,所以 onPageB
将是 false
,然后即使我导航到页面 B,它也停留在 false。
我真正需要的是动态响应导航。 (理想情况下,我将能够动态切换预加载脚本,但我认为这不受支持,或者从架构的角度来看是不可能的)。
为了检测导航,通常我会这样做:
getMyWebContents().on("did-navigate", (e, url) => ...);
但是我无法从渲染器进程中使用 WebContents
。
我显然可以通过 ipcRenderer.invoke
查询我所在的页面,但我不能只在加载时这样做。当页面导航时我也需要这样做,这似乎表明我必须从主进程中检测到它,然后让我的预加载脚本知道这一点。
但是我该怎么做。 executeJavaScript
是我在预加载中调用一个函数来触发更改的解决方案吗?不确定这是否会正常工作,或者甚至是一个好的解决方案。
Electron 开发人员提到每次导航都会重新执行预加载脚本(回想起来很明显)。
因此,我们可以在预加载中访问 location.href
并找出我们所在的页面。
我有一个带有预加载脚本的 BrowserWindow
。
我想根据加载的页面在预加载脚本中显示不同的内容。
在我的应用程序中,要么加载页面 A 并导航到页面 B,要么从头加载页面 B。
我正在考虑通过以下方式向我的预加载传递额外的参数:
{
preload: "path_to_preload.js",
additionalArguments: ["onPageB"]
}
然后我的preload可以做:
const onPageB = process.argv.find(arg => arg === "onPageB");
然后我根据页面 B 的需要设置我的预加载脚本。
但是,我的预加载脚本最初可以加载页面 A,所以 onPageB
将是 false
,然后即使我导航到页面 B,它也停留在 false。
我真正需要的是动态响应导航。 (理想情况下,我将能够动态切换预加载脚本,但我认为这不受支持,或者从架构的角度来看是不可能的)。
为了检测导航,通常我会这样做:
getMyWebContents().on("did-navigate", (e, url) => ...);
但是我无法从渲染器进程中使用 WebContents
。
我显然可以通过 ipcRenderer.invoke
查询我所在的页面,但我不能只在加载时这样做。当页面导航时我也需要这样做,这似乎表明我必须从主进程中检测到它,然后让我的预加载脚本知道这一点。
但是我该怎么做。 executeJavaScript
是我在预加载中调用一个函数来触发更改的解决方案吗?不确定这是否会正常工作,或者甚至是一个好的解决方案。
Electron 开发人员提到每次导航都会重新执行预加载脚本(回想起来很明显)。
因此,我们可以在预加载中访问 location.href
并找出我们所在的页面。