【问题标题】:Android webview javascript not working on API 18 or higherAndroid webview javascript 不适用于 API 18 或更高版本
【发布时间】:2015-05-20 21:40:29
【问题描述】:

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

【问题讨论】:

    标签: javascript android webview webviewclient


    【解决方案1】:

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

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

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

    • 在末尾附加 void(0); 语句,例如loadUrl("javascript:elt.innerHTML='Hello World!';void(0);");

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

    【讨论】:

      【解决方案2】:

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

      public void evaluateJavascript(字符串脚本,ValueCallback resultCallback)

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-04-08
        • 1970-01-01
        • 2020-02-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-10-06
        相关资源
        最近更新 更多