如果在超时回调中修改了“window.location.href”,则 shouldOverrideUrlLoading(...) 不会执行
Posted
技术标签:
【中文标题】如果在超时回调中修改了“window.location.href”,则 shouldOverrideUrlLoading(...) 不会执行【英文标题】:shouldOverrideUrlLoading(...) not executed if "window.location.href" modified in a timeout callback 【发布时间】:2011-07-10 21:05:30 【问题描述】:我有一个 javascript 函数 'gotoMainPage()'
function gotoMainPage( )
window.location.href = "main/main.do";
现在,如果 gotoMainPage( )
作为“直接用户交互”的结果执行,例如用户单击此 div,则会调用 WebViewClient 的 shouldOverrideUrlLoading(..)
:<div.... onclick='gotoMainPage();'/>
但是,如果执行是通过setTimeout( gotoMainPage, 100 );
或XMLHttpRequest
回调完成的,则永远不会调用shouldOverrideUrlLoading(..)
,而是将请求的页面加载到webview 中。
我错过了一个明显的解释还是这是一个错误?
有人吗?
【问题讨论】:
【参考方案1】:就我而言,在我的网页中使用 window.location = "http://xxx" 时,不会触发事件 shouldOverrideUrlLoading()。
但是,如果我使用自定义 url 方案或协议,例如“androidurl://”,就会触发 shouldOverrideUrlLoading()。我的解决方法是使用自定义协议并在 shouldOverrideUrlLoading() 方法中添加以下代码:
if (url.startsWith("androidurl://"))
url = url.replaceAll("androidurl://", "http://");
这会将自定义协议改回“http://”协议,您可以从那里处理正确的 url。
这对我有用。
【讨论】:
干得好。在过去的 4 天里,我遇到了同样的问题。你救了我。非常感谢。【参考方案2】:我自己也看到过这种情况,恕我直言,这显然是一个错误。 也许你可以抓住:
@Override
public void onLoadResource (WebView view, String url)
和/或
@Override
public void onPageFinished(WebView webView, String url)
我自己试过了,发现onLoadResource会被触发,即使shouldOverride没有。
【讨论】:
我也可以确认,这两种方法都会被触发,即使 shouldOverrideUrlLoading 不是以上是关于如果在超时回调中修改了“window.location.href”,则 shouldOverrideUrlLoading(...) 不会执行的主要内容,如果未能解决你的问题,请参考以下文章
超时 - 在 jest.setTimeout 指定的 5000 毫秒超时内未调用异步回调
如果未授予/拒绝访问,则 navigator.geolocation.getCurrentPosition 超时