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

GWT: windowClosing handler not properly handled in chrome

本文关键字:windowClosing 处理 程序 正确处理 chrome      更新时间:2023-09-26

Window closing handler is not working on my code under Chrome (I'm on it's last version, 26)

我有一个听Window.ClosingEvent的类。如果在用户上传文件时窗口被关闭(关闭窗口,用户输入另一个url…),应用程序会提示用户"are you sure?"

GWT 2.5.0和2.5.1IExplorer 10 okFirefox 21 okOpera还不支持这个事件。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);
...
}
}

以上代码符合并在浏览器,Firefox中正常工作,所以我认为代码是ok的。

有趣的是,如果我在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可以工作,所以我也尝试以本机方式实现它。同样的问题。可以在ie, 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;
}
这个问题快把我逼疯了。有什么想法吗?

谢谢大家!

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

这个站点为大多数浏览器提供了很好的解决方案。

Chrome提供的方法在用户关闭窗口时弹出"are you sure?"对话框。它需要这样做来可靠地获取onClose事件。任何关闭处理都需要在此之前完成,所以如果用户单击"否",页面/应用程序仍然需要运行。

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

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

确保你的JSNI方法实际上正在被调用(inspect window。在浏览器控制台中Onbeforeunload以验证处理程序是否已实际添加)。