JavaFx的Javascript函数侦听器function

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

embeddedBrowser.registerFunction("ajavascriptFunction", new BrowserFunction() { public JSValue invoke(JSValue... args) { //Do callback work } }); 

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

反正以相同的方式使用JavaFx吗?

我认为这可以满足您的需求。 我从这个问题中借鉴了一个想法来找出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( "" + "" + " " + " 
" + "" + "" ); 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); } }