首页 文章

如何在android 7中的html加载之前在webview中注入javascript脚本

提问于
浏览
6

我将提出一个我的问题的修改示例来简化这个问题,但我的完整示例的本质是相同的:

我需要在webview中加载一个html代码,这段代码假定要声明一些javascript函数 . 示例HTML代码:

<html>
<body><h1>JavaScript Math.random()</h1>
<p>A random number:</p>
<p id="demo"></p>
<script>showRandomValue();</script>
</body>
</html>

在此示例中,代码假定一个名为 showRandomValue() 的声明函数 . 所以我需要在执行代码之前注入此函数 . 这是我要注入的功能:

<script>
function showRandomValue() {
           document.getElementById("demo").innerHTML = Math.random();
      }
</script>

直到现在我在加载webview中的代码之前这样做了:

public static final String JAVASCRIPT_FUNCTION = 
        "javascript:function showRandomValue() {\n" +
        "           document.getElementById(\"demo\").innerHTML = Math.random();\n" +
        "      }";
webView.loadUrl(JAVASCRIPT_FUNCTION);
webView.loadData(HTML_CODE, "text/html", "UTF-8");

这对我很有用,直到我想将targetSdkVersion更新为24.如果我设置 targetSdkVersion 24 ,此代码停止工作,因为代码加载时找不到该函数 .

修改android WebView文档我发现了这个:

兼容性说明 . 针对N或更高版本的应用程序,来自空WebView的JavaScript状态不再在loadUrl(String)等导航中保留 . 例如,在加载的页面中不存在调用loadUrl(String)之前定义的全局变量和函数 . 应用程序应使用addJavascriptInterface(Object,String)来跨导航持久化JavaScript对象 .

我的问题是,使用 addJavascriptInterface 你可以声明一个自定义对象,所以我可以声明:

webview.addJavascriptInterface(new MyInterface(),"javaInterface");

并使用例如 javaInterface.getRandomValue() 调用其方法 . 但是我不能用这种方法声明全局函数 .

Important :我无法编辑或修改HTML代码,因为它来自第三方服务器 .

如何让这段代码在android 7中再次运行?

如果要测试它,这是完整的示例代码:

public class MainActivity extends Activity {

    private WebView webView;
    String HTML_CODE = "<html>\n" +
            "<body><h1>Hello World</h1>\n" +
            "<p>A random number:</p>\n" +
            "<p id=\"demo\"></p>\n" +
            "<script>showRandomValue();</script>\n" +
            "</body>\n" +
            "</html>";

    public static final String JAVASCRIPT_FUNCTION = "(function showRandomValue() {document.getElementById(\"demo\").innerHTML = Math.random();})";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        webView = (WebView) findViewById(R.id.webview);
        webView.getSettings().setJavaScriptEnabled(true);
        webView.loadUrl("javascript:" + JAVASCRIPT_FUNCTION);
        webView.loadData(HTML_CODE, "text/html", "UTF-8");
    }    
}

使用targetSdkVersion 23编译此代码将起作用,而targetSdkVersion 24将无法显示随机数

1 回答

  • -1

    我知道你说你不能修改HTML ...但是如果你使用预取内容执行loadData,我没有看到任何反对在script标签中将你想要的函数注入html head的理由 . 总而言之,你做的事情已经有点过时了 .

相关问题