我的主要目标是:
转到我的应用程序,在新选项卡中打开一个链接,在新标签页中创建一些内容并将事件发送到父主标签以进行刷新。
我已经学会了两种不能完全满足我需要的技术:
如何使用标签将事件从孩子传递给父母?我很高兴在父母和孩子的javascript代码的具体示例。它应该适用于跨域(例如:www.mydomain.com和bills.mydomain.com)。
我缺少一个jQuery解决方案吗?
答案 0 :(得分:6)
以下适用于我的chrome,firefox,即(没有测试更多浏览器)
假设3个文件
首先将所有3个文档的域属性设置为mydomain.com
<script>
document.domain="mydomain.com";
</script>
parent.html中的创建一个隐藏的iframe,其名称属性为例如“hiddenframe”。还要创建一些可能稍后收到响应的函数。
parent.html现在应该如下所示:
<script>
document.domain="mydomain.com";
function fx(msg)//receives the response
{
alert(msg)
}
</script>
<iframe name="hiddenframe" style="display:none"></iframe>
<a href="http://bills.mydomain.com/child.html" target="_blank">click</a>
在child.html中,您现在可以将文档加载到parent.html
中隐藏的iframe中<script>
document.domain="mydomain.com";
window.open('http://www.mydomain.com/dispatcher.html','hiddenframe');
</script>
(在这里使用window.open()
时不要混淆,不会打开新窗口,页面将被加载到parent.html中的iframe中)
在dispatcher.html中,您现在可以调用parent.html
中的函数<script>
document.domain="mydomain.com";
parent.fx('you just got some response');
</script>
当你只需要重新加载parent.html时,它会更容易一些。
再次在parent.html和child.html中设置document.domain-property(在parent.html和dispatcher.html中不需要iframe)
在parent.html中还设置窗口的name-property,例如
<script>
window.name="parentTab";
</script>
在child.html中,您现在可以访问parentTab
- 窗口(标签)
<script>
document.domain="mydomain.com";
window.open('http://www.mydomain.com/parent.html','parentTab');
</script>
...或者只是使用“parentTarget”作为child.html
中链接或表单的target-property答案 1 :(得分:0)
我为自己做了什么,我实现了一些ajax来从window2向数据库提交更改。 IS实现了JSON以将数据从数据库拉回到window1
答案 2 :(得分:0)
通过了解similar questions仅讨论window.open
(您不想使用的)和afaik,get all windows on the same domain没有简单的方法,因为您想要的是什么,可能需要使用window.sessionStorage
编写自己的框架来执行此操作
我不认为您可以使用它来访问子域,但绝对不会访问其他域。
使用sessionStorage
进行特定于窗口的消息传递的实用想法。
您可以在URL(GET)中传递内容,因此传递消息的方法可以是让父亲为自己parentID
生成一个唯一的ID,这是其子childID
的唯一ID(插入到其中)如果您使用parentID
,则会在点击时显示网址<a>
;如果您不介意<form method="GET">
,则会显示隐藏字段,然后使用sessionStorage
保存使用parentID.childID.timeStamp
等密钥向父级发送的消息,在父级和子级中都有一个区间,从窗口的ID开始查找sessionStorage
键,然后是.
,(即父母在匹配副本上查找parentID.
)密钥&amp;值为新的var,删除(因此不会再次找到它),然后根据需要进行解析。
我知道这有点罗嗦,但我认为作为一个概念解释比编写工作示例代码要容易得多。