簡體   English   中英

是否可以在不使用Javascript的情況下檢索Web引擎中的HTML元素?

[英]Is it possible to retrieve HTML element in web engine without using Javascript?

有沒有辦法使用webEngine.getDocument()webView識別單擊元素的類型(如文本框/單選按鈕等webEngine.getDocument()

假設我點擊文本字段,我可以得到點擊位置的x,y坐標。 是否有可能識別該特定位置的元素? 像Javascript中的document.elementFromPoint()方法。

我可以使用Jquery / Javascript來做到這一點。 但是既然我們可以訪問Document對象及其元素,那么有沒有辦法識別使用JavaFX本身?

您可以對從WebEngine檢索到的文檔使用Java語言綁定for Dom Level 2事件 這些綁定是為了訪問與人們在瀏覽器中編寫網頁事件時使用的JavaScript事件綁定相同的功能。

引用的類隨JDK一起提供

在訪問文檔之前,只需確保文檔已完全加載(通過監視工作者狀態文檔屬性 )。

注意:您在問題document.elementFromPoint()引用的特定方法不是DOM級別2規范的一部分,而是定義為CSSOM視圖模塊中文檔接口的擴展,“為作者提供了一種方法檢查和操縱文件的視覺視圖“。 雖然DOM級別2規范是在帶有org.w3c模塊的JDK中實現的,但CSSOM視圖模塊擴展卻不是。


好的,所以下一部分有點不在預留狀態,因為它沒有在官方標准JDK Javadoc中記錄。 因此,諸如“可能不適用於所有JavaFX實現”或“可能並不總是由Oracle支持”或“未來Java版本可能會中斷”的警告適用。 但無論如何,對有趣的東西......

WebView中的document屬性實際上是org.w3c.dom.html.HTMLDocument接口的一個實現,該接口記錄在這個奇怪的位置: https//docs.oracle.com/javase/8/docs/jre/api/plugin 此接口和所有支持的Java HTML文檔建模類隨Oracle Java Runtime 8以及JavaFX一起提供。 與標准JDK文檔中記錄的普通org.w3c.Document接口相比,HTMLDocument接口和關聯類構成了更豐富的API。

因此,您可以將文檔轉換為HTMLDocument,您將獲得更多功能。

但是,即使這樣,瀏覽器(和WebView文檔)中的許多功能也不會被純HTMLDocument接口公開。

因此,您可以通過將文檔轉換為com.sun.webkit.dom.HTMLDocumentImpl來獲得此“隱藏”功能。 然后,您將公開一個名副其實的API。

所以,讓我們這樣做......在這里,我在HTML div元素上捕獲一個鼠標事件。

樣品檢驗

這是一個(非常)簡單的Web檢查器,就​​像Firebug一樣。 將鼠標懸停在JavaFX WebView中的元素上,該元素的一些最小信息將顯示在屏幕頂部的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方法也可用...雖然這里並不嚴格需要,因為您可以從專家鼠標中獲取事件目標目錄。

該示例僅將檢索到的元素視為標准的w3c dom元素,它具有(對我來說)特別神秘的API。 但是,您可以將元素轉換為適當的com.sun.webkit.dom.HTMLElementImpl子類,以獲得更容易訪問的功能和更好,更直接的API,以反映使用JavaScript時使用HTML DOM時可能習慣的內容。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM