Android webview javascript 无法在 API 18 或更高版本上运行
Android webview javascript not working on API 18 or higher
我想通过操作某些 DOM 元素在 WebView
中显示一个网站。我的意思是,我想删除一个特殊的 div 元素或用某些东西替换它。
为此,我做了这样的事情:
为了替换我使用的东西 this model
document.getElementById("demo").innerHTML = "Hello World!";
我这样申请 Android WebView
:
public class WebClient extends WebViewClient {
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
view.loadUrl(url);
return true;
}
@Override
public void onPageFinished(WebView view, final String url) {
view.loadUrl("javascript:document.getElementById(\"jumbotron-company\").innerHTML = \"\";");
}
}
它在我的 API 为 18 的设备上工作,但在 API 大于 18
的模拟器或设备上不工作
从 API 级别 19 你应该使用 evaluateJavascript:
public void evaluateJavascript (String script, ValueCallback resultCallback)
Added in API level 19 Asynchronously evaluates JavaScript in the
context of the currently displayed page. If non-null, |resultCallback|
will be invoked with any result returned from that execution. This
method must be called on the UI thread and the callback will be made
on the UI thread.
请参考Android4.4中WebView的迁移指南:
http://developer.android.com/guide/webapps/migrating.html
@Mattia 说的对。尽可能使用 evaluateJavascript
。它的另一个优点是能够 return 从 JavaScript.
返回结果的值
但是如果您想要一个与 API 无关的解决方法,请确保您使用 loadUrl("javascript:...")
评估的代码不会产生任何 return 值。分配 return 是分配的值。在较新版本的 WebView 中,此值用作替换现有页面的新页面的内容。
您可以通过两种方式确保您正在评估的表达式不会产生 return 值:
在末尾附加 void(0);
语句,例如loadUrl("javascript:elt.innerHTML='Hello World!';void(0);");
运行 您在没有 return 值的函数中的代码,例如loadUrl("(function(){elt.innerHTML='Hello World!';})()");
我想通过操作某些 DOM 元素在 WebView
中显示一个网站。我的意思是,我想删除一个特殊的 div 元素或用某些东西替换它。
为此,我做了这样的事情:
为了替换我使用的东西 this model
document.getElementById("demo").innerHTML = "Hello World!";
我这样申请 Android WebView
:
public class WebClient extends WebViewClient {
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
view.loadUrl(url);
return true;
}
@Override
public void onPageFinished(WebView view, final String url) {
view.loadUrl("javascript:document.getElementById(\"jumbotron-company\").innerHTML = \"\";");
}
}
它在我的 API 为 18 的设备上工作,但在 API 大于 18
的模拟器或设备上不工作从 API 级别 19 你应该使用 evaluateJavascript:
public void evaluateJavascript (String script, ValueCallback resultCallback)
Added in API level 19 Asynchronously evaluates JavaScript in the context of the currently displayed page. If non-null, |resultCallback| will be invoked with any result returned from that execution. This method must be called on the UI thread and the callback will be made on the UI thread.
请参考Android4.4中WebView的迁移指南: http://developer.android.com/guide/webapps/migrating.html
@Mattia 说的对。尽可能使用 evaluateJavascript
。它的另一个优点是能够 return 从 JavaScript.
但是如果您想要一个与 API 无关的解决方法,请确保您使用 loadUrl("javascript:...")
评估的代码不会产生任何 return 值。分配 return 是分配的值。在较新版本的 WebView 中,此值用作替换现有页面的新页面的内容。
您可以通过两种方式确保您正在评估的表达式不会产生 return 值:
在末尾附加
void(0);
语句,例如loadUrl("javascript:elt.innerHTML='Hello World!';void(0);");
运行 您在没有 return 值的函数中的代码,例如
loadUrl("(function(){elt.innerHTML='Hello World!';})()");