如何从javafx中的javascript中获取返回值? [英] How to catch return value from javascript in javafx?

查看:471
本文介绍了如何从javafx中的javascript中获取返回值?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在我的JavaFX应用程序的webview中执行javascript代码。每当鼠标单击并将元素详细信息转换为java变量时,我需要重复执行它。我正在使用以下代码并使用Firebug Lite。在Firebug控制台中,所需的项目正在打印。但我希望它返回到java应用程序。

I am executing a javascript code in my webview of JavaFX application. I need to make it execute repeatedly whenever there is a mouse click and get the element details into a java variable. I'm using the below code and using Firebug Lite. In Firebug console, required items are printing. But I want it returned to java application.

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());
            }
        });

加载页面时会执行,但每次点击鼠标后都不会执行。请建议我如何修改它。

It is getting executed when the page is loaded, but not after every mouse click. Please suggest me how to modify it.

推荐答案

尝试反过来调用它。假设您正在将页面加载为

Try calling this the other way around. Assuming you're loading your page as

final WebEngine webEngine = webview.getEngine();
webEngine.load("http://localhost/demo/clickHandler/");

我们要为成功的州设置一个监听器 - 基本上我们要注入一个Java类进入JavaScript并让它回调。让我们创建一个 WebController 来检查传入的内容并输出ID:

We're going to set a listener for the successful state - basically we're going to inject a Java class into the JavaScript and have it call us back. Let's create a WebController that checks what is passed in and prints out the 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

Now on successful load, we inject this into the app as 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,请将此代码添加到您的页面:

Now we need some JavaScript on the page to call us back. Assuming you're using jQuery, add this code to your page:

$(function () {
    $('*').click(function (event) {
        event.preventDefault();
        event.stopPropagation();
        clickController.printId(this);
    });
});

现在点击任何内容时,将回拨 webController ,它将检查该对象是否为 HTMLElement 并打印出其ID(如果没有ID,则为null)。

Now when anything is clicked on, a call back will be made to webController, which will check that the object is an HTMLElement and print out its ID (or null if there is no ID).

不使用jQuery会让它变得更难,但你可以将它添加到文档的末尾:

Not using jQuery makes it a bit harder but you can add this to the end of your document:

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);
}

如果无法向文档添加内容,可以执行脚本在成功的函数中添加单击处理程序。更新成功的函数如下所示:

If adding content to the document is not possible, you can execute the script to add the click handler in the succeeded function. Update the succeeded function to look as follows:

    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:

Finally, if you want to prevent page navigation eg. from links, you can add return false; to the 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中的javascript中获取返回值?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆