是否可以在JavaFX中确定WebView中的元素位置?

时间:2014-01-03 16:56:12

标签: java dom webview webkit javafx

假设我已将一些HTML加载到WebView中。并假设此HTML包含一些DIV元素。渲染后我可以确定这个DIV元素的几何位置吗?这样我就可以跟踪鼠标点是否结束。

更新

是的,问题是外部网页不是我的。我想用Java彻底探索一个页面。

我已阅读WebViewWebKit一起实施。是否可以从Java访问任何WebKit内部?

另外。是否可以下载jquery,除了已经加载的页面并为其调用offset()函数?

2 个答案:

答案 0 :(得分:4)

没有办法(我知道)获取div的屏幕坐标。

但是,您可以从Javascript回调Java代码。因此,您可以编写少量的Javascript来检测鼠标何时进入和退出div,并调用一些更新BooleanProperty的Java代码。请参阅WebEngine API docs中的“从Javascript回调Java”。

更新:示例

更新:简化代码

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 :(得分:-1)

渲染发生在客户端。在服务器上获取此信息的唯一方法是编写JS代码以收集此数据,然后将它们发送到服务器。

无法通过服务器端代码

进行此操作