目的:修改Android中的WebView将网页中的文本进行替换,超过20个文字的长度用"..."表示

 

一、查看要修改的html文件

      在浏览器中输入网页url地址,并F12打开控制台,查看html代码结构Elements

可以看到我们要修改的标签Class为“msg-unit-detail”

二、选择WebView修改位置

    @SuppressLint("SetJavaScriptEnabled")
    private fun initWebView() {
        WebView.setBackgroundColor(0)

        WebView.settings.run {
            cacheMode = WebSettings.LOAD_DEFAULT// 设置缓存
            allowFileAccess = true // 允许访问文件
            setAppCacheEnabled(true)
            useWideViewPort = true
            layoutAlgorithm = WebSettings.LayoutAlgorithm.SINGLE_COLUMN
            loadWithOverviewMode = true
            displayZoomControls = false
            domStorageEnabled = true
            domStorageEnabled = true
            databaseEnabled = true
            javaScriptEnabled = true
            builtInZoomControls = true
        }

        WebView.addJavascriptInterface(this, "Android")

        WebView.webChromeClient = object : WebChromeClient() {
            override fun onProgressChanged(p0: WebView?, progress: Int) {
                handler.sendEmptyMessage(progress)
            }
        }
        WebView.webViewClient = object : WebViewClient() {
            override fun onPageFinished(view: WebView?, url: String?) {
                handler.sendEmptyMessage(100)
            }

            override fun onLoadResource(p0: WebView?, p1: String?) {
                super.onLoadResource(p0, p1)
                //js注入函数
                lengthChange(p0,p1)
            }
        }
    }

一般在onPageFinished中进行修改,WebView在加载完网页资源之后调用onPageFinished。但,此处是先调用onPageFinished,才显示网页内容,因此我们在onLoadResource进行JS注入。

三、在浏览器控制台Console编写JS代码

在Console中编写JS代码,并进行测试验证。

四、JS注入

    //需加入JS注解 @JavascriptInterface
    @JavascriptInterface
    fun lengthChange(view: WebView?, url: String?){

        Log.i("webview", url)

        var jsFuc = "javascript:function test(){ " +
                "var obj = document.getElementsByClassName('msg-unit-detail'); " +
                "for(var i = 0;i < obj.length; i++) { " +
                    "var text = obj[i].innerHTML;"+
                    "if(text.length > 20)" +
                        "obj[i].innerHTML = text.substr(0,20).concat('...'); " +
                    "}" +
                "}"

        //注入JS函数
        view?.loadUrl(jsFuc)
        //执行JS函数
        view?.loadUrl("javascript:test();")
        //刷新网页
        view?.loadUrl(url)
    }

缺点:onLoadResource为加载网页资源,在lengthChange又刷新网页,刷新网页又需要资源调用onLoadResource,如此往复,不停刷新网页,消耗资源。