Android与JavaScript交互中

564 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第4天,点击查看活动详情

上篇讲到WebView与Js交互的第一种方法:通过设置JavascriptInterface对象,调用loadUrl(String)执行Js语句,调用到JavascriptInterface中的方法,实现与Js的交互。

这篇来讲第二种方法:使用webView. evaluateJavascript(String, ValueCallback<T>)执行Js语句,该方法较loadUrl(String)轻量级,只需要局部刷新,而且还能直接拿到Js语句的返回值。其中第一个参数填入要执行的Js语句,格式以javascript:开头,后面是正常的Js语句,返回结果直接写在最后一行,不需要加return关键字。第二个参数用于处理Js执行结果的返回值,如果没有返回值,可以设为空。限制:1、只能在Android 19以上的版本使用!2、无法获取到回调或者异步执行中的结果

用法一:简单的交互,如在表单中填入数据:
webView.webViewClient=object : WebViewClient() {
    override fun onPageFinished(view: WebView?, url: String?) {
        super.onPageFinished(view, url)
        //通过输入框的class名获取输入框元素
        val input="document.getElementsByClassName("search-input isResourceVisible")[0]"  
        //通过Js在输入框填入内容"testJs"
        webView.evaluateJavascript("javascript:$input.value="testJs"",null)
    }
}
用法二:获取Js语句的执行结果,以获取HTML内容为例:
webView.webViewClient=object : WebViewClient() {
    override fun onPageFinished(view: WebView?, url: String?) {
        super.onPageFinished(view, url)
        val title="document.getElementsByClassName("phone-show-menu isResourceVisible")[0]"
        //通过title元素的innerHTML获取HTML内容,直接返回。$title.innerHTML便是要返回的内容
        webView.evaluateJavascript("javascript:$title.innerHTML",object :ValueCallback<String>{
            override fun onReceiveValue(p0: String?) {
                Log.d("JavaOBjectJsInterface","result:$p0" +
                        "")
            }
        })
用法三:回调和异步执行的结果处理,其实还是得通过添加JavascriptInterface对象进行处理,evaluateJavascript同样可以调用到JavascriptInterface对象的方法。以监听按钮点击事件返回输入框内容为例:

webView部分代码

webView.webViewClient=object : WebViewClient() {
    override fun onPageFinished(view: WebView?, url: String?) {
        super.onPageFinished(view, url)
        //获取输入框
        val input="document.getElementsByClassName("search-input isResourceVisible")[0]"
        //输入框内容
        val inputValue="$input.value"
        //获取按钮
        val btn="document.getElementsByClassName("seach-icon-container")[0]"
        //按钮添加点击事件监听,事件中调用了JavaOBjectJsInterface的clickListener(String)方法,传入参数为输入框的内容
        val js="javascript:$btn.addEventListener("click",function(){" +
                "javascript:window.testJs.clickListener($inputValue);})"
            webView.evaluateJavascript(js,null) //和webView.loadUrl(js)效果一样
    }
} 
webView.addJavascriptInterface(JavaOBjectJsInterface(webView),"testJs")

JavaOBjectJsInterface对象代码:

class JavaOBjectJsInterface(val webView: WebView) {

    private val TAG = JavaOBjectJsInterface::class.java.simpleName

    //千万不要忘了添加这个注解,不然Js找不到这个方法
    @JavascriptInterface
    fun clickListener(value:String){
        Log.d(TAG,"clickListener")
        Log.d(TAG,"value:$value")
    }
}

以上就是webView. evaluateJavascript(String, ValueCallback<T>)的基本使用方法。如果熟悉Js语法,还可以实现更加炫酷的功能!