GWT:windowClosing处理程序在chrome中没有正确处理

时间:2013-05-17 10:20:33

标签: javascript google-chrome gwt

窗口关闭处理程序无法处理Chrome下的代码(我在上一个版本,26)

我有一个听Window.ClosingEvent的课程。如果在用户上传文件时关闭窗口(关闭窗口,用户键入另一个URL ...),应用程序会提示用户“你确定吗?”。

GWT 2.5.0和2.5.1 IExplorer 10好的 Firefox 21好的 Opera尚不支持该活动。 Chrome 26无法使用。

这是GWT代码:

public abstract class ActiveUploadTransitionController extends TransitionController implements ClosingHandler {

...

@Override
    public void onWindowClosing(Window.ClosingEvent event){
        if(showMessage()){
            if(folder != null && folder.hasActiveFileUploads()){
                event.setMessage(getUploadActiveLeavingMessage());
            }
        }
    }

...
protected ActiveUploadTransitionController()
    {
...
Window.addWindowClosingHandler(this);
...
}
}

以上代码符合并在Explorer,Firefox中正常运行,所以我觉得代码还可以。

有趣的是,如果我在JavaScript中实现一个独立的测试,它可以在Explorer,Firefox和Chrome浏览器中正常工作。

//JavaScript

var handler = function(e){
        var show = true;
        if(show){
            var msg = "messageTest";
            (e || window.event).returnValue = msg;
            return msg;
        }
        return;
    }

    if(window.addEventListener){
        window.addEventListener("beforeunload", handler);
    }

因为孤立的JavaScript工作,我也尝试以本机方式实现它。一样的问题。适用于IExplorer,FireFox,但不适用于Chrome。

var handler = function (e) {
    var showMessage = that.@com.skydox.client.home.ActiveUploadTransitionController::showMessage()();
    if(showMessage){
        var confirmationMessage = that.@com.skydox.client.home.ActiveUploadTransitionController::getUploadActiveLeavingMessage()();
        (e || window.event).returnValue = confirmationMessage;
        return confirmationMessage;
    }
    tmpBeforeUnload(e);
    return;
}
if($wnd.addEventListener){
     $wnd.onbeforeunload = handler;
}

这个问题让我发疯。任何想法的人?

谢谢大家!

2 个答案:

答案 0 :(得分:0)

我发现了同样的问题。非常令人沮丧。

此网站为大多数浏览器提供了良好的workarounds

为Chrome提供的方法会引发“你确定吗?”关闭窗口的用户对话框。它需要这样做才能可靠地获取onClose事件。在此之前需要进行任何密切处理,但如果用户点击“否”,页面/应用仍然需要运行。

答案 1 :(得分:0)

我怀疑问题与您的其他逻辑有关,而不是Chrome的onbeforeunload行为。要验证这一点,请对onbeforeunload处理程序进行硬编码以返回字符串:

 $wnd.onbeforeunload = function() { return "Are you sure?" };

确保实际调用了您的JSNI方法(在浏览器控制台中检查window.onbeforeunload以验证是否实际添加了处理程序。)