在正常情况下,具有页面间通信功能的Web应用程序的页面如果使用“ http”协议从同一域提供服务,则无需担心跨域访问。默认情况下,Electron似乎使用基于“文件”协议的网页来构建应用程序。该协议不允许any页面间通信。
[如果我的Electron应用程序需要页面间通信(在这种情况下是通过iframe),我是否认为该应用程序需要与Electron一起运行Web服务器?似乎太过分了,而且我还没有看到太多讨论,但是我看不到任何更好的解决方法。有[[is用于自定义协议的Electron API,但是文档未显示如何使用自定义协议,只是如何设置它们,我还无法在其上找到任何好的教程。
[总体而言,我对ElectronJS作为框架和社区印象深刻,因此,经过一番认真的搜索之后,我仍然找不到解决方案,对此我感到惊讶。我发现这个问题已经问了很多遍了,但是没有可靠的答案。非常感谢您的启发。更新:
现在,我的情况的详细信息(需要在父窗口和iframe之间进行交谈)使这个问题比将两个单独的窗口(例如主窗口和设置窗口)作为主要流程时要棘手得多。通常可以通过IPC充当联络员。这当然可以解释为什么解决方案如此难以捉摸。Window.postMessage。这是一种HTML5技术,它允许带有交叉起点包括iframe的单独窗口之间传递消息。令人惊讶的是,它可以与“文件”协议(即没有网络服务器)配合使用,因此非常适合Electron中的iframe。
这里是一个有效的例子。我有两个文件:parent.html和child.html。前者的iframe包含后者:parent.html
<html>
<body>
<iframe id='f' src='child.html'></iframe><br/> <!-- First of two differences -->
<button id='b'>send</button><br/>
<div id='o'></div>
</body>
</html>
<script>
function receiveMessage(evt)
{
document.getElementById('o').innerHTML += evt.data + "<br/>";
}
window.addEventListener("message", receiveMessage, false);
document.getElementById('b').onclick = function()
{
// The second of two differences between parent and child is below
document.getElementById('f').contentWindow.postMessage("parent to child", "*");
}
</script>
child.html
<html>
<body>
<!-- The first of two differences between parent and child is here -->
<button id='b'>send</button><br/>
<div id='o'></div>
</body>
</html>
<script>
function receiveMessage(evt)
{
document.getElementById('o').innerHTML += evt.data + "<br/>";
}
window.addEventListener("message", receiveMessage, false);
document.getElementById('b').onclick = function()
{
// The second of two differences between parent and child is below
window.parent.postMessage("child to parent", "*");
}
</script>