javascript - JSNI - $wnd.location.assign() 未立即触发

标签 javascript java gwt xmlhttprequest jsni

我的 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不相同,则认为 session 超时;我想显示一个警告框,让用户知道 session 已超时,并在单击“确定”时启动重定向。

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

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

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

最佳答案

根据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);

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

关于javascript - JSNI - $wnd.location.assign() 未立即触发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48251918/

相关文章:

javascript - 响应式选择菜单 - 仅支持 onChange 的 Javascript

javascript - 如何生成持续多彩艺术柏林流场

html - 文件上传控制和 GWT 外观

javascript - 用 html 实体替换我预览中的部分 div

javascript - 存储完整的谷歌地图路线

java - csvReader 跳过了 while 循环

java - 禁止使用 Spring Security 和 @Secured

java - 重新启动应用程序时权限拒绝 : opening provider com. android.providers.media.MediaDocumentsProvider

java - 如何使用 appspot.com 在谷歌应用引擎上配置 SSL

css - 在 GWT 中,是否可以将图像小部件缩放到小于其原始大小?