Android onOverrideUrlLoading 基于 javascript return 值
Android onOverrideUrlLoading based on javascript return value
我正在开发混合应用程序,并尝试根据在 webview 中执行的 javascript 函数的 returned 值 return 在 webview 的 onOverrideUrlLoading 中 return 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 returning true 或 false 基于 javascript returned 值。
不幸的是,运行 JavaScript 代码来自 onOverrideUrlLoading()
是不可能的。在 WebView 可以执行任何其他操作之前,您必须从 onOverrideUrlLoading()
return。当您从 onOverrideUrlLoading()
内部调用 WebView.loadUrl()
时,真正发生的是一个异步任务被发布到 WebView 的消息循环中。它只会在您离开 onOverrideUrlLoading()
后得到处理。因此,当您的代码在 onOverrideUrlLoading()
.
中时,再多的延迟也不会使 WebView 处理您的请求
如果您想根据 JavaScript 代码做出的决定阻止导航发生,在 JavaScript 端使用 window.onbeforeunload
事件处理程序更自然。如果您 return 来自它的非 null
值,将取消通过单击 link 导航离开的尝试。
下面是 JavaScript 代码的示例:
window.onbeforeunload = function() {
if (navigationDisallowed()) {
return true; // Prevent navigating away from the page.
} else {
return null; // Allow navigating away.
}
}
我正在开发混合应用程序,并尝试根据在 webview 中执行的 javascript 函数的 returned 值 return 在 webview 的 onOverrideUrlLoading 中 return 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 returning true 或 false 基于 javascript returned 值。
不幸的是,运行 JavaScript 代码来自 onOverrideUrlLoading()
是不可能的。在 WebView 可以执行任何其他操作之前,您必须从 onOverrideUrlLoading()
return。当您从 onOverrideUrlLoading()
内部调用 WebView.loadUrl()
时,真正发生的是一个异步任务被发布到 WebView 的消息循环中。它只会在您离开 onOverrideUrlLoading()
后得到处理。因此,当您的代码在 onOverrideUrlLoading()
.
如果您想根据 JavaScript 代码做出的决定阻止导航发生,在 JavaScript 端使用 window.onbeforeunload
事件处理程序更自然。如果您 return 来自它的非 null
值,将取消通过单击 link 导航离开的尝试。
下面是 JavaScript 代码的示例:
window.onbeforeunload = function() {
if (navigationDisallowed()) {
return true; // Prevent navigating away from the page.
} else {
return null; // Allow navigating away.
}
}