【问题标题】:JavaFX WebView HyperLinks Cannot Be Disabled on Mobile Devices无法在移动设备上禁用 JavaFX WebView 超链接
【发布时间】:2018-01-03 14:37:46
【问题描述】:

以下代码用于禁用 JavaFX WebView 对象中的超链接。但是,当我在移动设备上运行它时,它不起作用,而在桌面上运行正常。是否有影响移动设备的替代解决方案?

private void init() {
    webEngine = webView.getEngine();
    webEngine.getLoadWorker().stateProperty().addListener((ov, oldState, newState) -> {
      if(newState == State.SUCCEEDED && webEngine.getDocument() != null)
        disableHyperLinks(webEngine.getDocument());
    });
} // init()

private void disableHyperLinks(Document document) {
    NodeList nodeList = document.getElementsByTagName("a");
    for (int i = 0; i < nodeList.getLength(); i++)
    {
          Node node= nodeList.item(i);
          EventTarget eventTarget = (EventTarget) node;
          eventTarget.addEventListener("click", (evt) -> {
            evt.preventDefault();
          }, false);
    } // for
} // disableHyperLinks()

【问题讨论】:

    标签: ios javafx robovm gluon-mobile javafxports


    【解决方案1】:

    在移动设备上运行时,WebView 不使用 JavaFX 控件实现,而是使用原生控件,Android 和 iOS 均如此。

    您可以看到here 用于Android 的实现,here 用于iOS。

    iOS上没有实现Documentnative方法,只返回加载页面的html内容(前提是内容可以解析,否则为null)。因此,即使您能够读取和修改该内容,它也不会对实际控制产生任何影响。

    好消息是您可以使用executeScript,因为它是用于iOS 的implemented

    这样的事情应该可以工作:

    private void init() {
        webEngine = webView.getEngine();
        webEngine.getLoadWorker().stateProperty().addListener((ov, oldState, newState) -> {
          if(newState == State.SUCCEEDED)
            disableHyperLinks();
        });
    } // init()
    
    private void disableHyperLinks() {
        Object res = webView.getEngine().executeScript("(function() { " +
                        "var links = document.getElementsByTagName(\"a\");\n" +
                        "    for (var i=0; i<links.length; i++) {\n" +
                        "        links[i].addEventListener(\"click\",function(e) {\n" +
                        "            e.preventDefault();\n" +
                        "        })\n" +
                        "    }"
                    + "return ('<html>'+ links.length +'</html>'); })();");
            if (res != null) {
                System.out.println("Hyperlinks disabled: " + res);
            } else {
                System.out.println("ERROR disabling hyperlinks");
            }
    } // disableHyperLinks()
    

    不过,上述代码无法在 Android 上运行。有一种(非常hacky)可能的方法,在运行时访问本机控件(但由于问题是关于iOS的,我不会在这里解释)。

    【讨论】:

    • 似乎有些链接确实有效,但其他链接无效。在桌面上,它在 ios 11 上返回 16 个链接...
    • javascript 部分现在由您决定...我刚刚添加了该脚本并在 iOS 上对其进行了测试,它运行良好,但在桌面上没有检查相同的内容。正如我所说,实现是不同的,但links 应该是相同的,如果 URL 完全相同(确保这一点)。
    • 我会做一些故障排除,看看哪里出错了... url 是完全一样的
    猜你喜欢
    • 1970-01-01
    • 2019-04-16
    • 2020-03-13
    • 2017-07-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多