Android webview javascript无法在API 18或更高版本上运行

时间:2015-05-20 21:40:29

标签: javascript android webview webviewclient

我想在WebView中显示一个网站,并操纵一些DOM元素。我的意思是,我想删除一个特殊的div元素或用某些东西替换它。 为此我做了这样的事情: 为了替换某些内容,我使用this模型

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的模拟器或设备

2 个答案:

答案 0 :(得分:3)

@Mattia所说的是对的。如果可能,请使用evaluateJavascript。它还有另一个优点,就是能够从JavaScript返回结果的值。

但是,如果您需要与API无关的解决方法,请确保使用loadUrl("javascript:...")评估的代码不会产生任何返回值。赋值返回指定的值。在较新版本的WebView中,此值用作替换现有页面的新页面的内容。

您可以确保您评估的表达式不会以两种方式产生返回值:

  • 在最后添加void(0);声明,例如loadUrl("javascript:elt.innerHTML='Hello World!';void(0);");

  • 在不返回值的函数中运行代码,例如: loadUrl("(function(){elt.innerHTML='Hello World!';})()");

答案 1 :(得分:0)

从API级别19开始,您应该使用evaluateJavascript

  

public void evaluateJavascript(String script,ValueCallback resultCallback)

     

在API级别19中添加异步评估中的JavaScript   当前显示页面的上下文。如果非null,| resultCallback |   将使用该执行返回的任何结果调用。这个   必须在UI线程上调用方法并进行回调   在UI线程上。

请参阅Android 4.4中的WebView迁移指南: http://developer.android.com/guide/webapps/migrating.html