gpt4 book ai didi

webview - javaFX webview window.onload 在 loadworker 成功之前被触发

转载 作者:行者123 更新时间:2023-12-05 01:47:32 25 4
gpt4 key购买 nike

我在我的应用程序中使用 JavaFX webview。使用以下代码,我在页​​面加载后设置了一个成员

webEngine.getLoadWorker().stateProperty().addListener(new ChangeListener<Worker.State>() {
@Override
public void changed(ObservableValue ov, Worker.State oldState, Worker.State newState) {
if (newState == Worker.State.SUCCEEDED) {
JSObject window = (JSObject) webEngine.executeScript("window");
window.setMember("mymember", new JavaScriptBridge(this));
}
}
});

现在在 javascript 中我可以调用 mymember.doSomething() 例如当我按下按钮并成功执行时调用,但是如果我将以下代码添加到 html

<script>
function startup() {
mymember.doSomething();
}
window.onload=startup;
</script>

它不会在页面加载时自动执行。似乎 window.onloadLoadWorker 收到通知之前执行。所以 mymember 还没有设置。但另一方面,我不能在加载 html 之前设置 mymember,对吗?

知道什么时候我需要设置 mymember 以便在执行 window.onload 时准备好它吗?

谢谢!

最佳答案

也许现在回答这个问题已经太晚了,但是在回答了this之后问题,我一直在试图找到为什么必须在网页完全加载后调用 executeScript 的原因。

所以我做了这个测试:

    public class EarlyWebEngineTest extends Application {

@Override
public void start(Stage stage) {
final WebView webView = new WebView();
final WebEngine webEngine = webView.getEngine();

// Early call of executeScript to get a JavaScript object, a proxy for the
// Java object to be accessed on the JavaScript environment
JSObject window = (JSObject) webEngine.executeScript("window");
window.setMember("app", new JavaApplication());

webEngine.getLoadWorker().stateProperty().addListener((ov,oldState,newState)->{
if(newState==State.SCHEDULED){
System.out.println("state: scheduled");
} else if(newState==State.RUNNING){
System.out.println("state: running");
} else if(newState==State.SUCCEEDED){
System.out.println("state: succeeded");
}
});

Button button=new Button("Load Content");
button.setOnAction(e->webEngine.loadContent("<html>"
+ " <script>function initialize() {"
+ " var nameVar = \"This is a JS var\"; "
+ " app.callJavascript(nameVar);"
+ "} </script>"
+ " <body onLoad=\"initialize()\">Hi, this is a test!</body>"
+ "</html>"));

VBox vbox = new VBox(10,button,webView);
Scene scene = new Scene(vbox,400,300);

stage.setScene(scene);
stage.show();

}

public class JavaApplication {

public void callJavascript(String msg){
System.out.println("JS>> "+msg);
}
}

public static void main(String[] args) {
launch(args);
}

}

在单击按钮之前不会加载内容,但我们已经在浏览器上创建了 JavaScript 对象。

在点击按钮之前,输出控制台上没有任何内容。但是如果我们点击按钮...这是输出:

state: scheduled
state: running
JS>> This is a JS var
state: succeeded

正如我们所见,Java 对象在脚本执行之前有效地传递给了脚本,并且在加载内容时成功调用了 app.callJavascript

请注意,对于访问加载的 DOM 的常见目的,在 State.SUCCEEDED 之后调用 executeScript 的常用方法仍然是推荐的方法。

关于webview - javaFX webview window.onload 在 loadworker 成功之前被触发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25404817/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com