我有一个由两个网站组成的Web应用程序 - 一个在端口8080(Java)上运行,另一个在端口80(IIS)上运行。 Java网页调用IIS网页,偶尔会回调到Java网页以获取其他信息。处理数据通信/交换的JavaScript 可在IE中使用,但不适用于Firefox。
第1页(IIS)> onClick of Button>第2页(Java / Tomcat)>用户关闭弹出窗口>数据传输到第1页
的JavaScript :
if(window.attachEvent){//IE exclusive method for binding an event
alert("AttachEvent");
window.attachEvent("onfocus", Focus_onfocusEvent);
window.objExitPopupWindow.attachEvent("onunload", Focus_onunloadExitEvent);
} else if(window.addEventListener){//DOM method for binding an event. W3C standard
try{
alert("Event Listener");
window.addEventListener("focus", Focus_onfocusEvent, true);
window.objExitPopupWindow.addEventListener("unload", Focus_onunloadExitEvent, true);
} catch(err) {
alert(err);
}
}
我遇到的问题是:
a)在Firefox中,如果我启用了alert("Event Listener");
,那么我会收到错误消息
Error: Permission denied for "http://localhost" to get property Window.addEventListener from "http://localhost:8080"
。
b)在Firefox中,如果我没有启用警报,则表示没有显示错误消息,但它看起来先Focus_onuloadExitEvent
然后Focus_onfocusEvent
,所有这些都在打开弹出。关闭弹出窗口不会触发Focus_onunloadExitEvent
。
如何确保代码在Firefox和IE中正常运行 - 即。我希望onfocusEvent
触发弹出窗口焦点,onunloadEvent
触发弹出窗口卸载。
答案 0 :(得分:5)
这是same origin policy。您无法通过主机A上的文档加载JavaScript来访问或修改从主机B加载的文档中的内容。由于您的一个主机是localhost:80
而另一个是localhost:8080
,这些被认为是不同的浏览器托管主机。
在您的特定情况下,解决方案是将弹出页面放在与打开它的页面相同的服务器上,并将弹出窗口中的iframe指向另一个主机上的内容。这样,您的JavaScript就能将事件监听器附加到弹出窗口。