JavaFx的Javascript函数侦听器功能

Mic*_*ael 3 javascript java javafx

我的公司正在寻求将我们的嵌入式浏览器切换到JavaFx.但是,我们当前的浏览器目前具有侦听javascript函数的功能,并在调用时调用java.它看起来像这样:

embeddedBrowser.registerFunction("ajavascriptFunction", new BrowserFunction() {

public JSValue invoke(JSValue... args) {
    //Do callback work
}
});
Run Code Online (Sandbox Code Playgroud)

这不需要修改html端(一个要求),实际上只需要知道javascript函数名称(我可能能够研究更多信息,但这是非常优选的).

无论如何以JavaFx同样的方式使用?

Jam*_*s_D 6

我认为这可以满足您的需求.我从这个问题中借鉴了一个想法来找出javascript:

import javafx.application.Application;
import javafx.concurrent.Worker;
import javafx.geometry.Insets;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.layout.BorderPane;
import javafx.scene.layout.HBox;
import javafx.scene.web.WebEngine;
import javafx.scene.web.WebView;
import javafx.stage.Stage;
import netscape.javascript.JSObject;

public class JavaScriptFunctionListener extends Application {

    @Override
    public void start(Stage primaryStage) {
        WebView webView = new WebView();
        WebEngine engine = webView.getEngine();

        engine.getLoadWorker().stateProperty().addListener((obs, oldState, newState) -> {
            if (newState == Worker.State.SUCCEEDED) {
                addFunctionHandlerToDocument(engine);
            }
        });

        // Just a demo: in real life can load external HTML resource:
        engine.loadContent(
                "<html><head><script>"
                + "var count = 0 ;"
                + "function someFunction(x) {"
                + "    count ++ ;"
                + "    document.getElementById(x).innerHTML = 'Count: '+count ;"
                + "}"
                + "</script></head>"
                + "<body>"
                + "    <input type=\"button\" value=\"Click Me\" onclick=\"someFunction('display');\"/>"
                + "    <div id='display'></div>"
                + "</body>"
                + "</html>"
        );

        Button registerButton = new Button("Register handler for 'someFunction'");
        registerButton.setOnAction(event -> {
            registerFunction("someFunction", engine);
            // registering the same function twice will break everything
            // so don't allow this to happen again:
            registerButton.setDisable(true);
        });

        HBox controls = new HBox(5, registerButton);
        controls.setPadding(new Insets(10));
        controls.setAlignment(Pos.CENTER);

        BorderPane root = new BorderPane(webView, null, null, controls, null);
        Scene scene = new Scene(root, 600, 400);
        primaryStage.setScene(scene);
        primaryStage.show();

    }

    private void registerFunction(String functionName, WebEngine engine) {
        engine.executeScript(
            "var fun = " + functionName + " ;"
            + functionName + " = function() {"
            + "    app.functionCalled('" + functionName + "');"
            + "    fun.apply(this, arguments)"
            + "}"
        );
    }

    private void addFunctionHandlerToDocument(WebEngine engine) {
        JSObject window = (JSObject) engine.executeScript("window");
        window.setMember("app", this);
    }

    public void functionCalled(String name) {
        System.out.println(name + " was called");
    }

    public static void main(String[] args) {
        launch(args);
    }
}
Run Code Online (Sandbox Code Playgroud)