代码之家  ›  专栏  ›  技术社区  ›  EAK TEAM

在webview中选择元素

  •  7
  • EAK TEAM  · 技术社区  · 6 年前

    我在android应用程序中实现了一个webview,并试图在用户单击布局时突出显示或标记元素。

    webview初始化如下:

    myWebView.getSettings().setJavaScriptEnabled(true);
    //myWebView.getSettings().setGeolocationEnabled(true);
    //myWebView.getSettings().setJavaScriptCanOpenWindowsAutomatically(true);
    myWebView.getSettings().setBuiltInZoomControls(true);
    myWebView.getSettings().setDomStorageEnabled(true);
    myWebView.setWebViewClient(new WebViewController());
    

    尝试标记用户单击的元素,例如此屏幕截图中的元素:

    Selection with dot

    我通过jsoup获取所有页面div:

    doc = Jsoup.connect(url).get();
    final Elements alldivs = doc.select("div");
    ArrayList<String> list = new ArrayList<String>();
    for (org.jsoup.nodes.Element e : alldivs) {
    if (!e.id().equals(""))
    list.add(e.id());
    }
    

    但是如何将选择标记为上面的照片,然后从div id中选择标记的内容。

    怎么能做出这样的东西?

    1 回复  |  直到 6 年前
        1
  •  11
  •   Arpan Sarkar    6 年前

    扩展 WebViewClient 推翻 这个 onPageFinished() 在这里,您需要添加自己的js,以便在每个 div 要素

    科特林:

    class MyWebViewClient : WebViewClient() {
            override fun onPageFinished(view: WebView, url: String) {
                view.loadUrl("javascript: " +
                        """
                Object.prototype.each = function (fn, bind) {
                    console.log(bind);
                    for (var i = 0; i < this.length; i++) {
                        if (i in this) {
                            fn.call(bind, this[i], i, this);
                        }
                    }
                };
    
                var _addListener = document.addEventListener || document.attachEvent,
                    _eventClick = window.addEventListener ? 'click' : 'onclick';
    
                var elements = document.getElementsByTagName("div");
    
                elements.each(function (el) {
                    _addListener.call(el, _eventClick, function () {
                        // todo process the clicked div element
                        el.style.cssText = "border-color:  black;border-style:  dashed;"
                    }, false);
                })
                        """.trimIndent())
            }
        }
    

    Java:

    public class MyWebViewClient extends WebViewClient {
        @Override
        public void onPageFinished(WebView view, String url) {
            view.loadUrl("javascript: "
                    + "Object.prototype.each = function (fn, bind) {\n" +
                    "                console.log(bind);\n" +
                    "                for (var i = 0; i < this.length; i++) {\n" +
                    "                    if (i in this) {\n" +
                    "                        fn.call(bind, this[i], i, this);\n" +
                    "                    }\n" +
                    "                }\n" +
                    "            };\n" +
                    "\n" +
                    "            var _addListener = document.addEventListener || document.attachEvent,\n" +
                    "                _eventClick = window.addEventListener ? 'click' : 'onclick';\n" +
                    "\n" +
                    "            var elements = document.getElementsByTagName(\"div\");\n" +
                    "\n" +
                    "            elements.each(function (el) {\n" +
                    "                _addListener.call(el, _eventClick, function () {\n" +
                                     // todo process the clicked div element
                    "                    el.style.cssText = \"border-color:  black;border-style:  dashed;\"\n" +
                    "                }, false);\n" +
                    "            })");
        }
    }
    

    现在将webViewClient设置为webView

      webview.webViewClient = MyWebViewClient()
    

    enter image description here