假设我已将一些HTML加载到WebView
中。并假设此HTML包含一些DIV
元素。渲染后我可以确定这个DIV元素的几何位置吗?这样我就可以跟踪鼠标点是否结束。
更新
是的,问题是外部网页不是我的。我想用Java彻底探索一个页面。
我已阅读WebView
与WebKit
一起实施。是否可以从Java访问任何WebKit
内部?
另外。是否可以下载jquery,除了已经加载的页面并为其调用offset()
函数?
答案 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代码以收集此数据,然后将它们发送到服务器。
无法通过服务器端代码
进行此操作