【问题标题】:JSNI - $wnd.location.assign() not triggering immediatelyJSNI - $wnd.location.assign() 不会立即触发
【发布时间】:2018-06-23 10:19:50
【问题描述】:

我的 GWT 应用程序中有以下 JSNI 代码,它发出 HTTP 请求以检测 URL 重定向 -

private native void checkSession(String url)
    /*-{
            var xhr = new XMLHttpRequest();
            xhr.onreadystatechange = function(e) {
                if (xhr.readyState == 4) {
                    if (url != xhr.responseURL) {
                        $wnd.alert("Your session has timed out.");
                        $wnd.location.assign(url);
                    }
                }
            }
            xhr.open("GET", url, true);
            xhr.send();
    }-*/;

如果请求的URL与响应的URL不同,则认为会话超时;我想在其上显示一个警告框,让用户知道会话已超时,并在他们单击“确定”时启动重定向。

我有一个实现AsyncCallback 的自定义类。使用this technique,我能够在全球范围内强制onFailure()StatusCodeException 发生时调用checkSession()

问题是在$wnd.location.assign(url) 可以启动重定向之前多次弹出警告框。我意识到这里正在执行几个onFailure() 方法导致警报弹出多次,但我的问题是,为什么$wnd.location.assign(url) 直到最后一个onFailure() 方法被执行才被执行,而$wnd.alert() 是就在它上面,每次都被执行?

在这种情况下如何强制重定向?理想情况下,我希望警报弹出一次,并在单击“确定”后立即重定向。

【问题讨论】:

    标签: javascript java gwt xmlhttprequest jsni


    【解决方案1】:

    根据this answer,浏览器会尝试执行剩余的JavaScript代码,直到页面被重定向;这解释了在页面重定向之前出现多个警报。

    为了解决这个问题,我声明了private static boolean redirect = false;。 当在 JSNI 代码中检测到 URL 重定向时,我检查 redirect 是否为 false,如果是,我显示警报并设置 redirect = true -

    if (@fully.qualified.name::redirect == false) {
           @fully.qualified.name::redirect = true;
           $wnd.alert("Your session has timed out.");
    }
    $wnd.location.assign(url);
    

    这样,我只能在启动重定向之前显示一次警报。

    【讨论】:

      猜你喜欢
      • 2013-09-09
      • 1970-01-01
      • 2018-08-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-18
      • 1970-01-01
      • 2021-03-31
      相关资源
      最近更新 更多