如果在超时回调中修改了“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 超时

超时 - 在 jest.setTimeout 指定的 5000 毫秒超时内未调用异步回调

是否会以严格的时间顺序调用 GTK+ 超时回调?

使用Jasmine测试带有超时的JS回调