android WebView 注入js 几种方式

2020-08-16 16:09:30

参考地址 android WebView 注入js 几种方式

有时我们开发中需要将js 注入到我们本地,有可能你会说,放在Web不就可以了吗,的确,但是需求就是这样的

通过流的形式注入

 @SuppressLint("ObsoleteSdkInt")
    public void onJsLocal() {
        StringBuilder builder = new StringBuilder(getJS(this, "qqq.js"));
        if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.KITKAT) {
            agentWeb.getWebCreator().getWebView() .loadUrl("javascript:" + builder.toString());
        } else {
            agentWeb.getWebCreator().getWebView().evaluateJavascript(builder.toString(), new ValueCallback<String>() {
                @Override
                public void onReceiveValue(String value) {
                    Log.i("onReceiveValue", value);
                }
            });
        } 
    }

第二种 通过文件加载

view.loadUrl("javascript:(function() { "
                                + " " //turns to red the background color
                                + " var script=document.createElement('script'); "
                                + " script.setAttribute('type','text/javascript'); "
                                + " script.setAttribute('src', 'http://192.168.12.2/assets/mathjax/jsBridge.js'); "
                                + " script.onload = function(){ "
                                + "  console.log('aaaaaaaa' ) ; "
                                + " }; "
                                + " document.getElementsByTagName('head')[0].appendChild(script); "
                                + "})()");

第三种,第二种有可能存在加载不成功的情况,我们可以拦截

 Map<String, String> map = new HashMap<>();
                                map.put("Access-Control-Allow-Origin", "*");
                                map.put("Access-Control-Allow-Headers", "Content-Type");
                                WebResourceResponse resourceResponse = new WebResourceResponse("application/javascript",
                                        "UTF-8", 200, "OK", map,
                                        getApplication().getAssets().open(JS_FILENAME));

注意由于注入是一个异步的操作,所以和js交互的过程有可能存在不顺畅的问题

可以采用

view.postDelay ...


  • 2020-01-08 23:49:13

    laravel 存储base64格式图片

    一、总结 一句话总结: 二、laravel存储64位图片实例 三、laravel 存储前端上传base64图片 四、php将base64字符串转换为图片

  • 2020-01-09 01:24:28

    mac安装ImageMagick与PHP扩展Imagick

    mac安装ImageMagick和php7.2扩展Imagick,从网上搜索教程,感觉好少,有的教程看起来也很麻烦,不过安装起来,没想到竟然如此简单。不非纯灰之力。

  • 2020-01-09 18:49:17

    pecl安装卸载模块,如何自动配置php.ini

    利用pecl安装php模块,可能需要手工配置php.ini,以加载或禁止相关模块。那么pecl install是不是可以自动配置php.ini呢?答案是肯定的。在pecl isntall的提示信息中,苏南大叔找到了下面的类似提示信息:configuration option "php_ini" is not set to php.ini location。这个设置点,就是本文的关键所在。设置好"php_ini"之后,pecl就可以自动修改php.ini中的extension=了。

  • 2020-01-10 10:23:08

    父元素设置min-height子元素设置100%问题

    父元素设置min-height子元素高度设置100%取不到值,这是因为子元素 div设置 height:100%;只有当父级元素满足min-height:1000px;设置的条件才触发;浏览器默认是不会触发的,所以子元素的100%的高度继承就失效了。min-height 是在 height 计算之后再套用的.

  • 2020-01-10 15:48:46

    Linux下查看文件精确到秒的修改时间

    今天排查一个BUG遇到一个问题,错误日志中打印的时间精确到秒,但当根据日志中的时间去找对应文件进行验证的时候,发现通过 ls -l 或者 ll 命令,都无法查看到文件精确到秒的修改时间。

  • 2020-01-10 15:55:05

    linux php yum 安装Imagick

    通过pecl安装Imagick扩展,成功到是成功了,很顺利,但是so包并不在我当年用yum安装的php7.2的扩展包内,我把生成的Imagick.so,移动到当前用的php包内,并不能用,提示 undefined symbol: spl_ce_Countable)) in Unknown on line 0。

  • 2020-01-10 15:57:06

    Centos 安装php Imagick 扩展

    yum install ImageMagick ImageMagick-devel ImageMagick-perl 下一步,验证ImageMagick已经安装在你的系统上并验证它的版本