如何将整个javascript函数注入webview并从android调用它

时间:2018-09-06 11:01:29

标签: javascript android

我做了什么:

我的资产文件夹中有一个js文件和一个html文件,我正在将该HTML文件加载到webview中。

然后我手动编辑了html文件并将此代码添加到其中

<script src="file:///android_asset/myjs.js" type="text/javascript"></script>

并再次加载Webview,然后在Webview的onPageFinished中注入了这样的javascript函数调用

webviewMine.loadUrl("javascript:changeColor('" + currentLine + "');");

这很好。然后,我从html页面中删除了脚本标签,并尝试通过将代码插入onPageFinished中,以这种方式将js加载到资产中

webviewTTS.loadUrl("javascript:<script src=\"file:///android_asset/js/makeBold.js\" type=\"text/javascript\"></script>");

但是当从android端执行js调用时,它说html页面中不存在function changeColor,这意味着我的js脚本标记注入不起作用。

有没有像这样注入js函数的标准方法?

如果没有,请纠正我。

1 个答案:

答案 0 :(得分:1)

使用下面提到的方法从资产文件夹中插入js文件

public void injectScriptFile(WebView view, String scriptFile) {
    InputStream input;
    try {
        input = getAssets().open(scriptFile);
        byte[] buffer = new byte[input.available()];
        input.read(buffer);
        input.close();

        // String-ify the script byte-array using BASE64 encoding !!!
        String encoded = Base64.encodeToString(buffer, Base64.NO_WRAP);
        view.loadUrl("javascript:(function() {" +
                "var parent = document.getElementsByTagName('head').item(0);" +
                "var script = document.createElement('script');" +
                "script.type = 'text/javascript';" +
                // Tell the browser to BASE64-decode the string into your script !!!
                "script.innerHTML = window.atob('" + encoded + "');" +
                "parent.appendChild(script)" +
                "})()");
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}