2015-08-12 2 views
3

Existe-t-il un moyen d'identifier le type de l'élément cliqué dans webView (comme Textbox/Radio/Button etc) en utilisant le webEngine.getDocument()? Supposons que je clique sur un champ de texte, je peux obtenir les coordonnées x, y de la position cliquée. Est-il possible d'identifier l'élément présent dans cet endroit particulier? Quelque chose comme la méthode document.elementFromPoint() en Javascript.Est-il possible de récupérer l'élément HTML dans le moteur Web sans utiliser Javascript?

Je peux le faire en utilisant Jquery/Javascript. Mais puisque nous avons accès à l'objet Document et à ses éléments, y a-t-il un moyen d'identifier en utilisant JavaFX lui-même?

+0

https://stackoverflow.com/questions/45495758/detect-hyperlink-hover-in-webview-and-print-the-link – Sedrick

Répondre

8

Vous pouvez probablement utiliser le Java Language Binding for Dom Level 2 events sur le document récupéré à partir de WebEngine. Ce sont des liaisons permettant d'accéder aux mêmes fonctionnalités que les JavaScript event bindings que les gens utilisent pour programmer des événements pour les pages Web dans les navigateurs.

Les classes référencées sont shipped with the JDK.

Assurez-vous simplement que le document est entièrement chargé (en surveillant le worker state ou le document property) avant d'y accéder.

Note: La méthode particulière que vous faites référence dans votre question document.elementFromPoint(), ne fait pas partie de la spécification DOM niveau 2, mais au lieu défini comme une extension de l'interface document dans le CSSOM Voir module qui « fournissent aux auteurs une manière d'inspecter et de manipuler la vue visuelle d'un document ". Alors que la spécification DOM niveau 2 est implémentée dans le JDK avec le module org.w3c, les extensions CSSOM View Module ne le sont pas.


OK, donc cette partie suivante est un peu hors réserve qu'il ne soit pas documentée dans le Javadoc standard officiel JDK. Ainsi, des mises en garde, telles que «peuvent ne pas s'appliquer à toutes les implémentations JavaFX» ou «ne peuvent pas toujours être prises en charge par Oracle» ou «peuvent se casser dans les futures versions de Java» s'appliquent. Mais de toute façon, sur les choses intéressantes ...

La propriété de document dans WebView est en réalité une implémentation de l'interface org.w3c.dom.html.HTMLDocument qui est documentée à cet emplacement étrange: https://docs.oracle.com/javase/8/docs/jre/api/plugin. Cette interface et toutes les classes de modélisation de document Java HTML prises en charge sont livrées avec Oracle Java Runtime 8 avec JavaFX. L'interface HTMLDocument et les classes associées forment une API beaucoup plus riche que les interfaces org.w3c.Document simples documentées dans la documentation JDK standard. Par conséquent, vous pouvez convertir le document en HTMLDocument et obtenir davantage de fonctionnalités.

Cependant, même dans ce cas, il existe de nombreuses fonctionnalités dans un navigateur (et un document WebView) qui ne sont pas exposées par une interface HTMLDocument pure. Donc, vous pouvez obtenir cette fonctionnalité "cachée" en convertissant le document en com.sun.webkit.dom.HTMLDocumentImpl. Ensuite, vous exposez une véritable orgie d'API. Alors faisons ça ... ici, je capture un événement de souris sur un élément div HTML.

sample inspection

C'est un inspecteur web simple (vraiment), comme Firebug. Passez la souris sur un élément dans JavaFX WebView et quelques informations minimales sur l'élément seront affichées dans une étiquette JavaFX en haut de l'écran.

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); 
    } 
} 

Vous remarquerez peut-être que même votre méthode souhaitée elementFromPoint est disponible ... bien qu'il ne soit pas strictement nécessaire, comme vous pouvez simplement obtenir le répertoire cible des événements du mouser expert.

L'échantillon traite juste l'élément récupéré comme élément de dom norme w3c, qui a (pour moi) une API particulièrement cryptique. Cependant, vous pouvez convertir l'élément en un com.sun.webkit.dom.HTMLElementImpl subclass approprié pour obtenir des fonctionnalités plus facilement accessibles et une API plus agréable et plus directe reflétant quelque chose auquel vous pourriez être habitué lorsque vous travaillez avec le DOM HTML en utilisant JavaScript.

+0

Si c'est le cas, event.getTarget() me renvoie WebView à chaque fois que je clique. Donc, je ne suis pas capable de cartographier des éléments particuliers. – NaveenBharadwaj

+0

Lorsque j'ai exécuté votre programme, j'obtiens une erreur comme comment je peux corriger l'erreur: impossible d'accéder à XPathEvaluator realMcCoy.setOnmousemove (event -> { fichier de classe pour org.w3c.dom.xpath.XPathEvaluator non trouvé –

+0

@ MaTâm J'ai essayé de courir le programme et il a bien fonctionné sans erreur (jdk1.8.0_72 sur OS X 10.9.5). Je ne sais pas pourquoi vous il ne fonctionne pas pour vous Ma. – jewelsea