0

我遇到了 javascript 属性window.opener(它保留对打开弹出窗口的窗口的引用)以及来自小程序内的重定向的问题。每当从小程序内发生重定向时,都会window.opener更改为当前弹出窗口。更奇怪的是,最近的 Java 更新引入了这种变化:这并没有发生java 1.7.0_03-b05java 1.7.0_04-b20. 现在这可能是一些异国情调的用例,但我仍然想知道这种变化是否是故意的。

为了深入了解这一点,我编写了一个小测试来演示有问题的行为。可以在此处找到 HTML 站点。它只在 Firefox 中有效(这对我的用例来说没问题)

  1. 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>
    
  2. 单击链接后,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);
            }
        }
    }
    
  3. 单击小程序中的按钮后,将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以下情况:

  1. 单击 中的链接后index.htmlapplet.html将在弹出窗口中打开。警报显示index.html为开瓶器名称。然后开瓶器的背景颜色变为红色
  2. 单击小程序中的按钮后,将redirect.html在同一窗口中打开。警报显示index.html为开瓶器名称。然后开瓶器的背景颜色变为绿色

到目前为止一切顺利......但java 1.7.0_04-b20发生了以下情况:

  1. 单击 中的链接后index.htmlapplet.html将在弹出窗口中打开。警报显示index.html为开瓶器名称。然后开瓶器的背景颜色变为红色
  2. 单击小程序中的按钮后,将redirect.html在同一窗口中打开。警报将“redirect.html”显示为 openersname。然后开瓶器的背景色(现在是弹出窗口!)变为绿色。

因此,Applet 发出的重定向似乎是通过this.getAppletContext().showDocument(new URL(this.getDocumentBase(), "redirect.html"), "_self");将 window.opener 属性更改为它更改 URL 的窗口...

如果您能想出解决此问题的方法,我将不胜感激。

非常感谢您的时间

4

1 回答 1

1

你的帖子让我明白我不是唯一一个在这里发疯的人。我相信这是新 java 版本中的一个错误。

我只是在弹出页面中添加了以下 javascript:

var parentWin = window.opener;

然后,当我需要调用父级时,我使用 parentWin。这解决了我的问题。

于 2012-09-14T02:54:51.100 回答