Andorid与webView交互,获取webView选中文字,兼容了iframe

js调试效果:

下面主要是拼装js代码 :

     /** 
     * @Description 获取webView选中文字内容 
     * @param webView
     * @param callBack
     */
    public static void webViewGetSelectedData(WebView webView,webViewGetSelectedDataCallBack callBack) {
        String js ="function selectEnable(document) {"
                   + "    document.oncontextmenu = new Function(\"if(event){event.returnValue=true;}\");"
                   + "    document.onselectstart = new Function(\"if(event){event.returnValue=true;}\");"
                   + "    let frames = document.getElementsByTagName(\"iframe\");"
                   + "    if (frames.length > 0) {"
                   + "        for (var i = 0; i < frames.length; i++) {"
                   + "            document = frames[i].contentDocument;"
                   + "            selectEnable(document);"
                   + "        }"
                   + "    }"
                   + "}"
                   + "function selectTxt(document) {"
                   + "    let rtnTxt = \"\";"
                   + "    rtnTxt = document.getSelection ? document.getSelection().toString() : document.selection.createRange().text;"
                   + "    let frames = document.getElementsByTagName(\"iframe\");"
                   + "    if (frames.length > 0) {"
                   + "        for (var i = 0; i < frames.length; i++) {"
                   + "            document = frames[i].contentDocument;"
                   + "            let sltTxt = selectTxt(document);"
                   + "            if (sltTxt != \"\") {"
                   + "                rtnTxt = sltTxt;"
                   + "            }"
                   + "        }"
                   + "    }"
                   + "    return rtnTxt;"
                   + "}"
                   + "(function(){"
                   + "    selectEnable(document);"
                   + "    return selectTxt(document);"
                   + "})()";
        /* android系统4.4以上的时候调用 4.4以下忽略*/
        webView.evaluateJavascript("javascript:" + js, txt -> {
            //todo 这里可以对返回文本进行处理,比如转为中文字符,过滤非法字符
            callBack.onFinished(txt);
        });        
        
    }
    public interface webViewGetSelectedDataCallBack
    {
        /**
         @param value
         */
        void onFinished(String value);
    }

至于如何调用,可以通过 

@Override
public void onActionModeStarted(ActionMode mode) {
       
    ……
    webViewGetSelectedData(webView, value -> {               
                Log.i("getSelection", "getSelectedData: "+value);
            });
    ……

    super.onActionModeStarted(mode);
}
发布了113 篇原创文章 · 获赞 69 · 访问量 30万+

猜你喜欢

转载自blog.csdn.net/admans/article/details/104944323