JSNI - $wnd.location.assign() 没有立即触发
JSNI - $wnd.location.assign() not triggering immediately
我的 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
的自定义 class。使用 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);
这样,在启动重定向之前我只能显示一次警报。
我的 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
的自定义 class。使用 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);
这样,在启动重定向之前我只能显示一次警报。