ElectronJS:避免跨域问题

问题描述 投票:0回答:1

在正常情况下,具有页面间通信功能的Web应用程序的页面如果使用“ http”协议从同一域提供服务,则无需担心跨域访问。默认情况下,Electron似乎使用基于“文件”协议的网页来构建应用程序。该协议不允许any页面间通信。

[如果我的Electron应用程序需要页面间通信(在这种情况下是通过iframe),我是否认为该应用程序需要与Electron一起运行Web服务器?似乎太过分了,而且我还没有看到太多讨论,但是我看不到任何更好的解决方法。有[[is用于自定义协议的Electron API,但是文档未显示如何使用自定义协议,只是如何设置它们,我还无法在其上找到任何好的教程。

[总体而言,我对ElectronJS作为框架和社区印象深刻,因此,经过一番认真的搜索之后,我仍然找不到解决方案,对此我感到惊讶。我发现这个问题已经问了很多遍了,但是没有可靠的答案。非常感谢您的启发。

更新:

现在,我的情况的详细信息(需要在父窗口和iframe之间进行交谈)使这个问题比将两个单独的窗口(例如主窗口和设置窗口)作为主要流程时要棘手得多。通常可以通过IPC充当联络员。这当然可以解释为什么解决方案如此难以捉摸。
javascript html electron webserver
1个回答
0
投票
我终于找到了解决此特定问题的方法:

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>
最新问题
© www.soinside.com 2019 - 2024. All rights reserved.