Html 如何在帧之间进行通信?

Html 如何在帧之间进行通信?,html,frames,html-frames,Html,Frames,Html Frames,我正在维护一个类似这样的应用程序: 有一个页面a带有一个显示页面B的框架。现在,页面B是一个独立域中完全不同的产品的一部分 现在,他们希望当点击B中的一个选项时,整个页面被重定向到A中的另一个页面。问题是A的url类似于www.client.A.com/Order/Details/123,当我们点击be时,它应该重定向到www.client.A.com/Order/Edit/123,但B不知道A的任何信息。它不知道当前选择了哪个订单或A的任何信息。具有框架B的页面A确实知道它 目前,我的解决方案

我正在维护一个类似这样的应用程序:

有一个页面a带有一个显示页面B的框架。现在,页面B是一个独立域中完全不同的产品的一部分

现在,他们希望当点击B中的一个选项时,整个页面被重定向到A中的另一个页面。问题是A的url类似于
www.client.A.com/Order/Details/123
,当我们点击be时,它应该重定向到
www.client.A.com/Order/Edit/123
,但B不知道A的任何信息。它不知道当前选择了哪个订单或A的任何信息。具有框架B的页面A确实知道它

目前,我的解决方案是重定向到AllOrders,比如client.MyCompany/Orders

但是由于B不知道哪个
客户端正在调用它(它是一个多租户应用程序),我将把它添加到webconfig中。(因此,每个客户端都有自己的具有不同值的webconfig)

我不认为这个解决方案是最优的,但我想不出任何其他办法!我已经尝试将A页中所需的url放在一个隐藏的Div中(因为A确实知道所有信息),然后尝试从B页读取整个DOM以找到它。。。。不幸的是,我只能访问帧B的DOM。。。(我尝试使用jquery)

我知道框架是邪恶的,但它是这样写的。。。有什么想法吗


谢谢

如果要在javascript中的帧之间进行通信,可以使用“父级”:

如果帧A具有可变值,例如:

var orderNo = 2;
对于要读取它的帧B,它将参考

var frameA_orderNo = parent.frames[0].orderNo;
(假设帧A是声明的第一帧)

因此,您可以在每个帧内设置全局变量,另一个帧可以读取这些变量,因此您可以在老式javascript中获得顺序(从未在jquery中尝试过)


Wow frames-从没想过我会再考虑它们。

如果页面和框架不在同一个域中,出于安全考虑,您必须使用同一个域策略禁止不同域的页面/框架之间的正常javascript通信

postmessage是html5和HTML的一部分。如果您需要对旧浏览器(特别是IE6/7)的支持,您可以使用(这显然是旧浏览器的一些不错的哈希标记技巧)


作为旁注:不确定框架是否邪恶,有一些问题(可用性,SEO,…)与之相关,但我做了一些研究,我认为。

如果父页面a和iframe页面B位于不同的域中,您将无法通过B的父属性访问方法或字段,A中的脚本也无法访问B的内容,您也无法在A和B之间共享全局变量。页面A和页面B之间的边界是浏览器安全模型的关键部分。它可以防止evil.com仅仅通过读取银行网页javascript的内部变量就包装您的在线银行网页并窃取您的帐户信息

如果你需要最新一代的浏览器,你可以使用其他答案中提到的postmessage技术。如果需要支持较旧的浏览器,则可以使用浏览器中的跨域客户端脚本技术传递少量信息。其中一个例子是使用iFrame在外部页面A和内部页面B之间传递信息。这并不容易,涉及到很多步骤,但可以做到。我不久前写了一篇关于这个的文章

您将无法从父页面A监视B的iframe中的单击。这在多个级别上违反了浏览器安全策略。(例如,单击劫持)您将无法看到B的URL何时更改-A可以写入iframe.src属性以更改URL,但一旦iframe.src指向与A的域不同的域,A就无法再读取iframe.src属性

如果A和B位于同一根域的不同子域中,您可能有机会将该域“降低”到一个公共根。例如,如果外部页面A位于子域A.foo.bar.com中,而B位于子域foo.bar.com中,则可以将页面A中的域降低到foo.bar.com(通过在A的脚本中指定window.domain=“foo.bar.com”)。然后,页面A将作为页面B的对等方,两个页面可以根据需要访问彼此的数据,即使从技术上讲,A是从不同于B的域提供服务的。我也写了一篇文章

域降低只能剥离最里面的子域,以便在根域的上下文中操作。您不能将A.foo.bar.com更改为abc.com

将域降低为公共根域也有轻微的风险。当您在自己的子域中操作页面时,您的html和脚本将与公共根域之外的其他子域隔离。如果其他子域中的某个服务器被破坏,它实际上不会影响您的html页面


如果将页面的域降低到公共根域,则将内部构件暴露给在公共根域上运行的脚本,以及来自其他子域的脚本,这些子域也将其域降低到公共根域。如果其他子域中的某个服务器被破坏,它将有权访问脚本的内部,因此它可能也破坏了您的子域。

页面a和页面B是否在不同的域中?www.foo.com vs www.bar.com?+1,感谢你不抱怨不得不使用别人的相框@是的,他们在不同的领域!我知道我也这么想!关于设置变量。。。我还没有真正使用javascript。。如何设置全局变量?谢谢只要不把变量放在函数中,它们就有页面作用域——所以只要在javascript顶部声明它们,它们就可以使用。同样的技术应该允许您在另一个框架中运行方法,例如parent.frames