Cómo capturar el valor de retorno de javascript en javafx?
javafx-webengine (1)
Intenta llamar esto al revés. Asumiendo que estás cargando tu página como
final WebEngine webEngine = webview.getEngine();
webEngine.load("http://localhost/demo/clickHandler/");
Vamos a configurar un oyente para el estado exitoso, básicamente vamos a inyectar una clase Java en JavaScript y hacer que nos devuelva la llamada. Vamos a crear un WebController
que verifique lo que se pasa e imprime la 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());
}
}
}
Ahora con carga exitosa, clickController
esto en la aplicación como 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());
}
}
}
);
Ahora necesitamos un poco de JavaScript en la página para devolvernos la llamada. Suponiendo que está utilizando jQuery, agregue este código a su página:
$(function () {
$(''*'').click(function (event) {
event.preventDefault();
event.stopPropagation();
clickController.printId(this);
});
});
Ahora, cuando se hace clic en cualquier cosa, se realiza una devolución de llamada a webController
, que verificará que el objeto sea un elemento HTMLElement
e imprima su ID (o null si no hay una ID).
No usar jQuery hace que sea un poco más difícil, pero puede agregar esto al final de su documento:
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);
}
Si no es posible agregar contenido al documento, puede ejecutar el script para agregar el controlador de clic en la función correcta. Actualice la función correcta para que se vea de la siguiente manera:
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());
}
}
}
);
Finalmente, si desea evitar la navegación de la página, por ejemplo. de enlaces, puede agregar return false;
al 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());
}
}
}
);
Estoy ejecutando un código de JavaScript en mi vista web de la aplicación JavaFX. Necesito hacer que se ejecute repetidamente cada vez que hay un clic del mouse y obtener los detalles del elemento en una variable java. Estoy usando el siguiente código y estoy usando Firebug Lite. En la consola de Firebug, los artículos requeridos están imprimiendo. Pero quiero que vuelva a la aplicación Java.
engine.documentProperty().addListener(new ChangeListener<Document>() {
@Override public void changed(ObservableValue<? extends Document> prop, Document oldDoc, Document newDoc) {
enableFirebug(engine);
Object obj=engine.executeScript("var lastElement = null; "
+ "document.addEventListener(''click'', function(e) {"
+ "if (e.target != lastElement) {"
+ "lastElement = e.target;"
+ "console.log(lastElement.name);"
+ "return lastElement.name;"
+ "}}, false);");
System.out.println(obj.toString());
}
});
Se ejecuta cuando se carga la página, pero no después de cada clic del mouse. Por favor sugiereme cómo modificarlo.