如何在 javafx 中从 javascript 捕获 return 值?
How to catch return value from javascript in javafx?
我正在 JavaFX 应用程序的 Web 视图中执行 java脚本代码。我需要让它在单击鼠标时重复执行,并将元素详细信息放入 java 变量中。我正在使用以下代码并使用 Firebug Lite。在 Firebug 控制台中,正在打印所需的项目。但我希望它返回到 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());
}
});
它在加载页面时执行,但不是在每次单击鼠标后执行。请建议我如何修改它。
试试反过来说。假设您将页面加载为
final WebEngine webEngine = webview.getEngine();
webEngine.load("http://localhost/demo/clickHandler/");
我们将为成功状态设置一个侦听器 - 基本上我们将向 Java 脚本中注入一个 Java class 并让它给我们回电.让我们创建一个 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());
}
}
}
);
现在我们需要页面上的一些 Java脚本来给我们回电。假设您使用 jQuery,将此代码添加到您的页面:
$(function () {
$('*').click(function (event) {
event.preventDefault();
event.stopPropagation();
clickController.printId(this);
});
});
现在,当点击任何东西时,将回调 webController
,这将检查对象是否为 HTMLElement
并打印出其 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());
}
}
}
);
我正在 JavaFX 应用程序的 Web 视图中执行 java脚本代码。我需要让它在单击鼠标时重复执行,并将元素详细信息放入 java 变量中。我正在使用以下代码并使用 Firebug Lite。在 Firebug 控制台中,正在打印所需的项目。但我希望它返回到 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());
}
});
它在加载页面时执行,但不是在每次单击鼠标后执行。请建议我如何修改它。
试试反过来说。假设您将页面加载为
final WebEngine webEngine = webview.getEngine();
webEngine.load("http://localhost/demo/clickHandler/");
我们将为成功状态设置一个侦听器 - 基本上我们将向 Java 脚本中注入一个 Java class 并让它给我们回电.让我们创建一个 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());
}
}
}
);
现在我们需要页面上的一些 Java脚本来给我们回电。假设您使用 jQuery,将此代码添加到您的页面:
$(function () {
$('*').click(function (event) {
event.preventDefault();
event.stopPropagation();
clickController.printId(this);
});
});
现在,当点击任何东西时,将回调 webController
,这将检查对象是否为 HTMLElement
并打印出其 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());
}
}
}
);