我在使用集成了共享点、SQL 报告服务和一堆使用 ASP.NET MVC 构建的自定义表单的应用程序时遇到了一些问题。
假设我的服务器如下;
- 苔藓
- SSRS
- 自定义表单
在 MOSS 中,我的门户有时需要弹出一个自定义表单来捕获用户输入。我通过使用 jQuery 对话框(使用 Boxy)完成了此操作,该对话框将自定义表单嵌入其中并将门户的 url 传递到其中。自定义表单完成后,它将父窗口(MOSS 门户)导航到传入的 URL,这有效地刷新了页面。
在我们加入 SSRS 的复杂性之前,这一切都很好。
现在在 MOSS 中,我有一份列出一些数据的报告,但 SSRS 报告查看器 Web 部件似乎将它的报告内容放在 iframe 中,这意味着来自报告的超链接不能要求父级覆盖相同的对话框(因为它是跨域的),如果它自己执行覆盖,它只会覆盖 iframe。
抱歉发了这么长的帖子,切入正题 - 这只是一个内部 Intranet 应用程序。是否有可能以某种方式允许跨域脚本编写,以便可以从共享点门户和 SSRS 中的 javascript 控制弹出对话框,而我的自定义表单只能调用父级上的 javascript 方法?
最好我不想在客户端浏览器中进行配置以允许这种情况发生,因为我必须将更改推广到 Assets 中的所有机器 - 这是一个很大的数字。
提前致谢,任何能解决我问题的人都可以喝啤酒 ;)
干杯, 托尼
最佳答案
IE8、Firefox 3、最近的 Opera 和 Safari/Chrome 支持 postMessage,它允许不同域上的合作页面相互交谈:
http://ajaxian.com/archives/cross-window-messaging-with-html-5-postmessage
如果您受困于旧版浏览器,您的选择很少。最干净的方法是通过同一个代理发送需要相互通信的所有内容,尽管在 OP 的情况下这似乎是不可能的。
下一个最干净的方法是使用 Flash 的跨域工具。
另一个选项是 xssinterface ,它在可用的地方包装 postMessage,并在不可用的地方使用一些涉及 cookie 和轮询的巫术。
唯一的其他选择是使用隐藏的 iframe - 向页面发送消息,将 iframe 的位置更改为目标页面域中的位置并在目标页面中轮询 - 但我再次认为 OP 案例中的代理使得这行不通。
关于javascript - 在 Intranet 中启用跨域脚本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1593344/