我正在开发一个混合应用程序,并尝试根据在 webview 中执行的 javascript 函数的返回值在 webview 的 onOverrideUrlLoading 中返回 true 或 false
我目前的示例代码。
//Have a boolean variable isExternalDomain;
//Added JavascriptInterface webView.addJavascriptInterface(this, "android");
public boolean onOverrideUrlLoading(final String url) {
WebView.loadUrl("javascript:android.onData('true')");
//I Tried inserting sleep, delay EG: Thread.sleep(200);
//I see the delay but still javascript executes last.
if(isExternalDomain) {
return true;
} else {
return false;
}
}
@JavascriptInterface public void onData(String value)
{
isExternalDomain = true;
}
所以我遇到的问题是 javascript 执行发生在 onOverrideUrlLoading 完成执行所有 isExternalDomain 为 false 的行之后。我想让 onOverrideUrlLoading 根据 javascript 返回值返回 true 或 false。
最佳答案
不幸的是,无法从 onOverrideUrlLoading()
内部运行 JavaScript 代码。在 WebView 可以执行任何其他操作之前,您必须从 onOverrideUrlLoading()
返回。当您从 onOverrideUrlLoading()
内部调用 WebView.loadUrl()
时,真正发生的是一个异步任务被发布到 WebView 的消息循环中。它只会在您离开 onOverrideUrlLoading()
后得到处理。因此,当您的代码在 onOverrideUrlLoading()
中时,WebView 不会有任何延迟来处理您的请求。
如果您想根据 JavaScript 代码做出的决定阻止导航发生,则更自然的做法是在 JavaScript 端使用 window.onbeforeunload
事件处理程序。如果您从中返回非 null
值,将取消通过单击链接导航离开的尝试。
下面是一段 JavaScript 代码示例:
window.onbeforeunload = function() {
if (navigationDisallowed()) {
return true; // Prevent navigating away from the page.
} else {
return null; // Allow navigating away.
}
}
关于Android onOverrideUrlLoading 基于javascript返回值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31144038/