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!';})()");