【问题标题】:GWT: windowClosing handler not properly handled in chromeGWT:windowClosing 处理程序未在 chrome 中正确处理
【发布时间】:2013-05-17 10:20:32
【问题描述】:

窗口关闭处理程序无法处理我在 Chrome 下的代码(我正在使用它的最新版本,26)

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

GWT 2.5.0 和 2.5.1 IExplorer 10 正常 火狐 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);
...
}
}

以上代码在资源管理器、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;
}

这个问题让我抓狂。有什么想法吗?

谢谢各位!

【问题讨论】:

    标签: javascript google-chrome gwt


    【解决方案1】:

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

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

    为 Chrome 提供的方法会抛出“你确定吗?”用户关闭窗口的对话框。它需要这样做才能可靠地获取 onClose 事件。任何关闭处理都需要在此之前完成,因此如果用户单击“否”,页面/应用程序仍然需要运行。

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

        猜你喜欢
        • 2011-03-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-05-26
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多