我遇到了 javascript 属性window.opener
(它保留对打开弹出窗口的窗口的引用)以及来自小程序内的重定向的问题。每当从小程序内发生重定向时,都会window.opener
更改为当前弹出窗口。更奇怪的是,最近的 Java 更新引入了这种变化:这并没有发生java 1.7.0_03-b05
在java 1.7.0_04-b20
. 现在这可能是一些异国情调的用例,但我仍然想知道这种变化是否是故意的。
为了深入了解这一点,我编写了一个小测试来演示有问题的行为。可以在此处找到 HTML 站点。它只在 Firefox 中有效(这对我的用例来说没问题)
该
index.html
页面包含以下 javascript:window.name = "index.html"; function open_new_window() { window.open('applet.html', 'applet.html', 'width=1050,height=680,scrollbars=yes,status=yes').focus(); return false; }
我将窗口名称设置为“index.html”(出于识别目的),并提供了一个在弹出窗口中打开 applet.html 的函数。它还包含一个调用此函数的链接:
<a href="#" onclick="open_new_window(); return false;">open applet.html in new window</a>
单击链接后,
applet.html
将在弹出窗口中打开。这包含以下 javascript:window.name = "HelloWorldApplet.html"; alert("opener is now: "+window.opener.name); function on_load() { alert("changing bgcolor of opener to red"); window.opener.document.body.style.background='red'; }
我将此弹出窗口的 window.name 设置为“applet.html”(用于识别目的)并提醒当前的
window.opener.name
. 当主体触发 onload 事件时,我将开瓶器的背景颜色更改为红色。此外,此页面包含一个小程序,其中有一个按钮可以触发重定向到
redirect.html
import java.applet.Applet; import java.awt.Button; import java.awt.FlowLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.net.MalformedURLException; import java.net.URL; import java.util.logging.Level; import java.util.logging.Logger; public class HelloWorldApplet extends Applet implements ActionListener { Button redirectButton; @Override public void init() { super.init(); setLayout(new FlowLayout()); redirectButton = new Button("Redirect now!"); add(redirectButton); redirectButton.addActionListener(this); } @Override public void actionPerformed(ActionEvent ae) { try { this.getAppletContext().showDocument(new URL(this.getDocumentBase(), "redirect.html"), "_self"); } catch (MalformedURLException ex) { Logger.getLogger(HelloWorldApplet.class.getName()).log(Level.SEVERE, null, ex); } } }
单击小程序中的按钮后,将
redirect.html
在同一弹出窗口中打开。此页面包含以下 javascript:window.name = "redirect.html"; alert("opener is now: "+window.opener.name); function on_load() { alert("changing bgcolor of opener to green"); window.opener.document.body.style.background='green'; }
我将此弹出窗口的 window.name 设置为“redirect.html”(用于识别目的)并提醒当前的
window.opener.name
. 当主体触发 onload 事件时,我将开瓶器的背景颜色更改为绿色。
发生java 1.7.0_03-b5
以下情况:
- 单击 中的链接后
index.html
,applet.html
将在弹出窗口中打开。警报显示index.html
为开瓶器名称。然后开瓶器的背景颜色变为红色 - 单击小程序中的按钮后,将
redirect.html
在同一窗口中打开。警报显示index.html
为开瓶器名称。然后开瓶器的背景颜色变为绿色
到目前为止一切顺利......但java 1.7.0_04-b20
发生了以下情况:
- 单击 中的链接后
index.html
,applet.html
将在弹出窗口中打开。警报显示index.html
为开瓶器名称。然后开瓶器的背景颜色变为红色 - 单击小程序中的按钮后,将
redirect.html
在同一窗口中打开。警报将“redirect.html”显示为 openersname。然后开瓶器的背景色(现在是弹出窗口!)变为绿色。
因此,Applet 发出的重定向似乎是通过this.getAppletContext().showDocument(new URL(this.getDocumentBase(), "redirect.html"), "_self");
将 window.opener 属性更改为它更改 URL 的窗口...
如果您能想出解决此问题的方法,我将不胜感激。
非常感谢您的时间