[英]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.