2012-11-24 19 views
2

我在同一个文件夹中有两个本地.html文件。一页打开另一页的窗口,并尝试在新打开的窗口中调用一个函数。但是,函数调用失败,我得到这个在控制台:我可以使用javascript在两个本地html文件之间进行通信吗?

不安全的JavaScript尝试访问框架的URL文件:///***/A.html从框架与URL文件:/// ***/B.html。域,协议和端口必须匹配。

这发生在Chrome和Webkit(Mac)上。有什么办法可以:禁用文件://协议的跨域检查,或者在不同的本地文件中调用javascript函数?

+0

你可以运行一个小的静态网络服务器吗?这在Go或Node.js中是件小事。 – tjameson

+0

我可以,但我真的只想双击.html文件。我目前正在主服务器上使用VirtualHost。 – Soumya

回答

2

您可以使用window.postMessage做这样的事情:

初始窗口的HTML文件:

<!DOCTYPE html> 
<html> 
    <head> 
     <script> 
      var otherWindow; 
      function openOther() { 
       otherWindow = window.open("other.html", "otherWindow"); 

      } 

      function otherFunc() { 
       otherWindow.postMessage("otherFunc", "*"); 
      } 
     </script> 
    </head> 
    <body> 
     <div onclick="openOther()">Open the other window</div> 
     <div onclick="otherFunc()">Call the other window's function</div> 
    </body> 
</html> 

的HTML第二个窗口:

<!DOCTYPE html> 
<html> 
    <head> 
     <script> 
      window.addEventListener("message", function(event) { 
       alert("The other window's function executed."); 
      }, false); 
     </script> 
    </head> 
    <body> 
     <div>This is the other window.</div> 
    </body> 
</html> 

这里有一个很好的参考为window.postMessage

+0

还应该注意的是,跨域呼叫的保护有充分的理由。这个解决方案是通过在window.postMessage()中传递“*”作为第二个参数来禁止源代码检查,但是你真的应该利用这种机制,在你的监听器函数中进行某种检查。 – jtrick

+0

我完全忘记了postMessage!这非常有帮助。 – Soumya

+0

太棒了,很高兴它很有用。 – jtrick

相关问题