2014-01-03 2 views
1

Предположим, что я загрузил некоторый HTML в WebView. И предположим, что этот HTML-код содержит элемент DIV. Могу ли я определить геометрическое расположение этого элемента DIV после рендеринга? Чтобы я мог отслеживать, находится ли точка мыши или нет.Возможно ли определить местоположение элемента в WebView в JavaFX?

UPDATE

Да, речь идет о внешних веб-страниц не мое. Я хочу подробно изучить страницу с Java.

Я читал, что WebView выполнен с использованием WebKit. Возможно ли получить доступ к любым внутренним компонентам WebKit из Java?

Также. Можно ли загрузить, скажем, jquery, в дополнение к уже загруженной странице и вызвать функцию offset()?

+1

[Это обсуждение] (http://stackoverflow.com/questions/19446510/how-do-i-include-jquery-in- javafx-webview) имеет некоторые решения для выполнения jquery на произвольной странице в webview. –

ответ

-1

Рендеринг происходит на стороне клиента. Единственный способ получить эту информацию на сервере - написать JS-код для сбора этих данных, а затем отправить их на сервер.

Нет способа сделать это только с помощью сервера коды на стороне

+0

Это вопрос JavaFX: все клиентское. –

+0

Возможно, не существует физического веб-сервера, но архитектура клиент-сервер все еще существует. –

+0

Не обязательно. Это может быть обычное настольное приложение, HTML, загруженный в WebView, может быть статическим ресурсом в файле jar приложения, например. Во всяком случае, я думаю, что OP хочет отслеживать наведение мыши на элемент DIV в коде JavaFX, который определенно не находится на сервере. –

4

Там нет никакого способа (что я знаю), чтобы получить координаты экрана в DIV.

Однако вы можете перезвонить на Java-код с Javascript. Таким образом, вы можете написать небольшое количество Javascript, которое обнаруживает, когда мышь входит и выходит из div, и вызывать некоторый код Java, который обновляет BooleanProperty, например. См. «Обращение к Java из Javascript» в WebEngine API docs.

ОБНОВЛЕНИЕ: Пример

ОБНОВЛЕНИЕ: упрощенный код

import org.w3c.dom.Document; 
import org.w3c.dom.Element; 

import netscape.javascript.JSObject; 
import javafx.application.Application; 
import javafx.beans.binding.Bindings; 
import javafx.beans.property.BooleanProperty; 
import javafx.beans.property.SimpleBooleanProperty; 
import javafx.beans.value.ChangeListener; 
import javafx.beans.value.ObservableValue; 
import javafx.concurrent.Worker.State; 
import javafx.scene.Scene; 
import javafx.scene.control.Label; 
import javafx.scene.layout.BorderPane; 
import javafx.scene.web.WebEngine; 
import javafx.scene.web.WebView; 
import javafx.stage.Stage; 

public class HTMLMouseOverTest extends Application { 

    @Override 
    public void start(Stage primaryStage) { 
     final BorderPane root = new BorderPane(); 
     final WebView webView = new WebView(); 
     final WebEngine engine = webView.getEngine(); 
     final BooleanProperty mouseOver = new SimpleBooleanProperty(); 
     engine.getLoadWorker().stateProperty().addListener(new ChangeListener<State>() { 

      @Override 
      public void changed(ObservableValue<? extends State> observable, 
        State oldValue, State newValue) { 
       if (newValue == State.SUCCEEDED) { 
        // Here's how to add the Javascript if you don't have 
        // direct access to the HTML: 
//     final Document doc = engine.getDocument(); 
//     Element div = doc.getElementById("important-div"); 
//     div.setAttribute("onmouseover", "mouseOverProperty.set(true)"); 
//     div.setAttribute("onmouseout", "mouseOverProperty.set(false)"); 
        final JSObject window = (JSObject) engine.executeScript("window"); 
        window.setMember("mouseOverProperty", mouseOver);      
       } 
      } 
     }); 
     engine.loadContent("<html><body style='font-family:sans-serif';><h2>Hello World</h2>"+ 
      "<div id='important-div' onmouseover='mouseOverProperty.set(true)'"+ 
       "onmouseout='mouseOverProperty.set(false)' style='background: #ffd; padding:40px;'>"+ 
      "Move mouse here</div>"+ 
      "<h3>Thanks and good night</h3></body></html>"); 

     root.setCenter(webView); 
     final Label label = new Label(); 
     label.textProperty().bind(Bindings.when(mouseOver).then("Mouse in position").otherwise("Mouse out of area")); 
     root.setBottom(label); 
     final Scene scene = new Scene(root, 400, 250); 
     primaryStage.setScene(scene); 
     primaryStage.show(); 
    } 

    public static void main(String[] args) { 
     launch(args); 
    } 

} 
+1

Если у вас нет контроля над загружаемым HTML (например, с внешнего сайта), вы можете манипулировать DOM и вставлять необходимый Javascript при загрузке страницы. Это начинает немного запутываться, но это сработает. Те же документы для WebEngine показывают, как получить доступ к DOM. –

Смежные вопросы