我需要允许用户点击“page-1.htm”中的链接并打开一个弹出窗口。然后,当用户在主浏览器窗口中浏览“page-2.htm”时,我需要能够引用弹出窗口。
“page-1.htm”中的JavaScript
var playerWin = window.open("player.htm", "playerWin", "width=300,height=130");
playerWin.play("song.mp3"); // play() is a function in player.htm
“page-2.htm”中的JavaScript
playerWin.play("tune.mp3");
page-2.htm中的此代码生成错误“playerWin未定义”。这是可以理解的,因为在页面2.htm上没有定义名为 playerWin 的变量。
我的问题是:我能从第2.htm页引用弹出窗口吗?
答案 0 :(得分:5)
即使你离开了开启者页面,我也做了一个快速测试,弹出窗口仍然有'开启者'对象,你可以访问它。因此,要么轮询开启者并重置引用,要么在离开页面等待然后重新链接后添加计时器。
1.htm
<script>
var w = window.open("p.htm", "playerWin", "width=300,height=130");
</script>
<a href="2.htm">2</a>
p.htm
<a href="javascript:opener.w=this;">re-link</a>
2.htm
<script>
var w;
</script>
<a href="javascript:alert(w);">check</a>
答案 1 :(得分:2)
答案是否定的。大多数浏览器会将窗口和文档从一个导航完全隔离到下一个导航。没有地方可以将引用放在弹出窗口中,当你导航到page2时它将继续存在。
答案 2 :(得分:1)
您需要将page-1.htm放在iframe中(占用整个浏览器窗口)...然后通过第1页的父窗口启动并与弹出窗口通信。
即。 (抱歉伪代码)
user clicks on link in page-1
page-1 asks it's parent window to open a popup
popup opens
user navigates away (in the iframe)
user clicks a link in page-2
page-2 asks it's parent window to close it's popup
只要所有内容都在同一个域中,并且导航保留在iframe中,这应该可以正常工作
答案 3 :(得分:0)
以前没见过......我会假设你这样做是因为你必须以不同方式组织你的网页。
由于您使用的是ASP.NET,因此只需将page-2设置为会话值即可。然后让你的播放器页面运行一个AJAX计时器来检查会话变量,然后执行相应的操作,因为它在弹出窗口上有一个句柄。
答案 4 :(得分:0)
在Firefox 12.0中,接受的答案对我不起作用。我目前正在开发一个项目,在该项目中,应用程序必须始终了解在页面之间导航或刷新当前页面时打开/关闭哪些弹出窗口。每次弹出窗口打开或关闭时,我都会使用JavaScript cookie在客户端上存储信息。不完美,但如果您不需要100%万无一失的东西,这是一个不错的选择。在我看来,在重新加载页面时尝试维护JavaScript变量总是不太可靠,并且尝试在服务器上存储弹出窗口的信息根本就没有意义,除了cookie之外还剩下什么呢?