尝试反过来调用它。假设您将页面加载为
final WebEngine webEngine = webview.getEngine();
webEngine.load("http://localhost/demo/clickHandler/");
我们将为成功状态设置一个监听器 - 基本上我们将向 JavaScript 中注入一个 Java 类并让它回调我们。让我们创建一个 WebController 来检查传入的内容并打印出 ID:
public class WebController {
public void printId(Object object) {
if (org.w3c.dom.html.HTMLElement.class.isAssignableFrom(object.getClass())) {
org.w3c.dom.html.HTMLElement it = (org.w3c.dom.html.HTMLElement) object;
System.out.println("Id is " + it.getId());
}
}
}
现在加载成功后,我们将其作为clickController 注入到应用程序中。
webEngine.getLoadWorker().stateProperty().addListener(new ChangeListener<State>() {
@Override
public void changed(ObservableValue<? extends State> ov, State oldState, State newState) {
if (newState == State.SUCCEEDED) {
JSObject window = (JSObject) webEngine.executeScript("window");
window.setMember("clickController", new WebController());
}
}
}
);
现在我们需要页面上的一些 JavaScript 来回调我们。假设您使用的是 jQuery,请将此代码添加到您的页面:
$(function () {
$('*').click(function (event) {
event.preventDefault();
event.stopPropagation();
clickController.printId(this);
});
});
现在,当单击任何内容时,将回调webController,它将检查对象是否为HTMLElement 并打印出其 ID(如果没有 ID,则为 null)。
不使用 jQuery 会有点困难,但您可以将其添加到文档的末尾:
var nonJQuery = function (event) {
clickController.printId(this);
event.preventDefault();
event.stopPropagation();
};
var elements = document.querySelectorAll("*");
for (var i = 0; i < elements.length; i++) {
elements[i].addEventListener("click", nonJQuery, false);
}
如果无法向文档添加内容,您可以执行脚本以在成功的函数中添加点击处理程序。更新成功的函数如下所示:
webEngine.getLoadWorker().stateProperty().addListener(new ChangeListener<State>() {
@Override
public void changed(ObservableValue<? extends State> ov, State oldState, State newState) {
if (newState == State.SUCCEEDED) {
JSObject window = (JSObject) webEngine.executeScript("window");
webEngine.executeScript("var nonJQuery = function (event) {\n" +
" clickController.printId(this);\n" +
" event.preventDefault();\n" +
" event.stopPropagation();\n" +
"};\n" +
"var elements = document.querySelectorAll(\"*\");\n" +
"for (var i = 0; i < elements.length; i++) {\n" +
" elements[i].addEventListener(\"click\", nonJQuery, false);\n" +
"}");
window.setMember("clickController", new WebController());
}
}
}
);
最后,如果您想阻止页面导航,例如。从链接中,您可以将 return false; 添加到 JavaScript:
webEngine.getLoadWorker().stateProperty().addListener(new ChangeListener<State>() {
@Override
public void changed(ObservableValue<? extends State> ov, State oldState, State newState) {
if (newState == State.SUCCEEDED) {
JSObject window = (JSObject) webEngine.executeScript("window");
webEngine.executeScript("var nonJQuery = function (event) {\n" +
" clickController.printId(this);\n" +
" event.preventDefault();\n" +
" event.stopPropagation();\n" +
" return false;\n" +
"};\n" +
"var elements = document.querySelectorAll(\"*\");\n" +
"for (var i = 0; i < elements.length; i++) {\n" +
" elements[i].addEventListener(\"click\", nonJQuery, false);\n" +
"}");
window.setMember("clickController", new WebController());
}
}
}
);