Попробуйте назвать это наоборот. Предполагая, что вы загружаете свою страницу как
final WebEngine webEngine = webview.getEngine();
webEngine.load("http://localhost/demo/clickHandler/");
Мы собираемся установить прослушиватель для успешного состояния — по сути, мы собираемся внедрить класс Java в JavaScript, и он перезвонит нам. Давайте создадим WebController
, который проверяет, что передается, и распечатывает идентификатор:
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
, и распечатает его идентификатор (или 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());
}
}
}
);
person
Evan Knowles
schedule
22.05.2015