解决window.showModalDialog跨域返回值问题

5星 · 超过95%的资源 需积分: 32 134 下载量 8 浏览量 更新于2024-09-16 2 收藏 2KB TXT 举报
"通过window.showModalDialog实现跨域页面交互并获取返回值的解决方案" 在Web开发中,`window.showModalDialog`是一个JavaScript方法,用于在当前窗口上打开一个模态对话框,展示指定的URL内容。然而,当试图用这个方法打开一个不同源(跨域)的页面时,会出现安全限制,导致主页面无法接收到被打开页面设置的`window.returnValue`返回值。这是因为浏览器的同源策略阻止了不同源之间的直接通信。 为了解决这个问题,可以采用以下策略: 1. **利用IFrame嵌套跨域页面:** - 在主页面(如testMain.jsp)中,创建一个IFrame,并设置其src属性为需要打开的跨域页面URL。这样,跨域页面将在IFrame内加载,而不会触发同源策略的限制。 - 跨域页面(如testFrame.jsp)内部,可以通过IFrame内的表单或者JavaScript与目标系统进行通信。例如,在IFrame中动态设置表单的action属性为目标系统的URL,然后提交表单,完成数据传递。 2. **使用POST请求传递数据:** - 在跨域页面的IFrame内,创建一个隐藏的表单,设置表单的method为"post",并将需要传递的数据放入表单字段中。 - 当需要发送数据时,通过JavaScript操作这个表单,设定其action属性为目标系统的URL,并触发表单提交。 3. **在目标系统中接收和处理数据:** - 目标系统(如http://192.168.1.120:8080/test.jsp)接收到POST请求后,可以处理表单中的数据。 - 处理完成后,目标系统可以将结果数据以某种方式(如HTTP响应头、重定向URL等)返回给调用它的页面。 4. **在主页面中获取返回值:** - 虽然`window.showModalDialog`直接无法获取跨域页面的`window.returnValue`,但可以通过监听IFrame的`load`事件来获取目标系统返回的信息。 - 在IFrame的`load`事件处理函数中,可以检查IFrame内容,提取返回值,然后在主页面中进行后续处理,比如弹出警告框显示返回值。 总结来说,要实现在跨域环境下使用`window.showModalDialog`并获取返回值,关键在于巧妙地利用IFrame和POST请求绕过同源策略的限制。通过这种方法,可以实现主页面与跨域页面的交互,并获取到目标系统处理后的数据。需要注意的是,这种方式可能涉及跨域安全问题,需要确保目标系统允许这种通信方式,同时遵循相关的安全规范。