不使用Javascript就可以在web引擎中检索HTML元素吗?

不使用Javascript就可以在web引擎中检索HTML元素吗?,html,dom,webview,javafx,javafx-webengine,Html,Dom,Webview,Javafx,Javafx Webengine,是否有方法使用webEngine.getDocument()在webView中标识单击元素的类型(如文本框/单选框/按钮等) 假设我点击一个文本字段,我可以得到点击位置的x,y坐标。是否可以识别该特定位置的元素?类似于Javascript中的document.elementFromPoint()方法 我可以使用Jquery/Javascript来完成。但是,既然我们可以访问文档对象及其元素,那么有没有一种方法可以使用JavaFX本身进行识别?您可能可以在从WebEngine检索的文档上使用。这些

是否有方法使用
webEngine.getDocument()
webView
中标识单击元素的类型(如文本框/单选框/按钮等)

假设我点击一个文本字段,我可以得到点击位置的x,y坐标。是否可以识别该特定位置的元素?类似于Javascript中的
document.elementFromPoint()
方法

我可以使用Jquery/Javascript来完成。但是,既然我们可以访问
文档
对象及其元素,那么有没有一种方法可以使用JavaFX本身进行识别?

您可能可以在从WebEngine检索的文档上使用。这些绑定访问的功能与人们在浏览器中为网页编程事件时使用的功能相同

引用的类是

在访问文档之前,只需确保文档已完全加载(通过监视或)

注意:您在问题中引用的特定方法不是DOM level 2规范的一部分,而是定义为CSSOM视图模块中文档接口的扩展,它“为作者提供了检查和操作文档可视视图的方法”。虽然DOM level 2规范是通过org.w3c模块在JDK中实现的,但CSSOM视图模块扩展不是


好的,下一部分是有点保留的,因为官方标准JDKJavadoc中没有记录它。因此,诸如“可能不适用于所有JavaFX实现”或“可能不总是受Oracle或Oracle支持”或“可能在未来的Java版本中中断”之类的警告也适用。但无论如何,关于有趣的事情

WebView中的document属性实际上是接口的一个实现,该接口记录在以下位置:。此接口和所有支持的Java HTML文档建模类都随Oracle Java Runtime 8和JavaFX一起提供。HTMLDocument接口和相关类形成了比标准JDK文档中记录的普通org.w3c.Document接口丰富得多的API

因此,您可以将文档转换为HTMLDocument,从而获得更多功能

然而,即使如此,浏览器(和WebView文档)中仍有许多功能不是由纯HTMLDocument界面公开的

因此,您可以通过将文档强制转换为
com.sun.webkit.dom.HTMLDocumentImpl
来获得此“隐藏”功能。然后,您将公开一个名副其实的API狂欢

那么让我们这样做吧。。。这里我捕获了一个HTML div元素上的鼠标事件

这是一个(真的)简单的web检查器,就像Firebug一样。将鼠标移到JavaFXWebView中的某个元素上,该元素的一些最小信息将显示在屏幕顶部的JavaFX标签中

import com.sun.webkit.dom.HTMLDocumentImpl;
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.scene.layout.VBox;
import javafx.scene.web.WebView;
import javafx.stage.Stage;
import org.w3c.dom.events.MouseEvent;

public class WebViewClicker extends Application {

    public static final String LOC =
            "http://stackoverflow.com/questions/31957218/is-it-possible-to-retrieve-html-element-in-web-engine-without-using-javascript";

    @Override
    public void start(Stage stage) throws Exception {
        Label elementInfo = new Label();
        WebView webview = new WebView();

        webview.getEngine().documentProperty().addListener((observable, oldDoc, newDoc) -> {
            HTMLDocumentImpl realMcCoy = (HTMLDocumentImpl) newDoc;
            realMcCoy.setOnmousemove(event -> {
                MouseEvent expertMouser = (MouseEvent) event;

                elementInfo.setText(
                        realMcCoy.elementFromPoint(
                                expertMouser.getClientX(),
                                expertMouser.getClientY()
                        ).toString()
                );
            });
        });

        webview.getEngine().load(LOC);
        stage.setScene(new Scene(
                new VBox(
                        elementInfo,
                        webview
                )
        ));
        stage.show();
    }

    public static void main(String[] args) {
        launch(args);
    }
}
您可能会注意到,甚至您想要的
elementFromPoint
方法也可用。。。尽管这里并不严格需要它,因为您可以从专家鼠标器中获取事件目标目录


该示例只是将检索到的元素视为标准的W3CDOM元素,它(对我来说)有一个特别神秘的API。但是,您可以将元素强制转换为适当的类型,以获得更易于访问的功能和更好、更直接的API,该API反映了您在使用JavaScript处理HTML DOM时可能会用到的内容。

如果这样做,event.getTarget()会在每次单击时返回我的WebView。所以,我无法映射特定的元素。当我运行您的程序时,我遇到了一个错误,如如何修复错误:无法访问xpatheevaluator realmcoy.setOnmousemove(event->{class file for org.w3c.dom.xpath.xpatheevaluator notfound@MaT–我试着运行这个程序,它运行得很好,没有错误(OSX10.9.5上的jdk1.8.0_72)。我不知道您为什么认为它不适合您,妈妈。我在Windows 7下使用最新的NetBean和jdk1.8.091。似乎出现了以下错误=>无法访问XPathEvaluator realMcCoy.setOnmousemove(未找到事件->{classfile for org.w3c.dom.xpath.XPathEvaluator