我在应用程序中使用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.onload在LoadWorker被通知之前就已执行。因此mymember尚未设置。但是,另一方面,我无法mymember 在加载html之前进行设置,对吗?
我需要设置执行时间mymember时知道什么window.onload吗?
谢谢!
对于这个问题的答案也许为时已晚,但是在回答了这个问题之后,我一直在寻找一个原因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的通用目的,仍然建议使用通常的executeScriptafter调用State.SUCCEEDED
方法。
我对RxJava并不完全陌生,但我被一项看似简单的任务所阻碍。 我有一个数据源,它公开了一个反应式API,我所要做的就是获取一些数据,返回它,并在没有其他消息发出时自动关闭连接。 这是我的代码: conn.query()和conn.close()在不同的调度程序中异步执行。此代码不起作用,因为conn.close()返回一个没有订阅服务器的Completable。此外,如果我手动订阅doOnCom
问题内容: 这是我的情况: 在this.handleFormSubmit()上,我正在执行this.setState() 在this.handleFormSubmit()内部,我正在调用this.findRoutes(); -取决于this.setState()的成功完成 this.setState(); 在this.findRoutes被调用之前没有完成… 在调用this.findRoutes(
问题内容: 我正在研究一个脚本,以使用jQuery异步加载一些图像。 这是加载图像的函数的代码片段- 我已经在Firefox,Webkit(Safari,Chrome)中对此进行了测试,并且可以正常工作。 图像位于服务器上的文件夹中,而我使用的是jQuery 1.3。 有任何想法吗? 问题答案: 解决此问题的简单方法是提供jQuery设置或或或任何其他可用的响应类型。 我遇到了同样的问题,但是在.
也许有人能帮我澄清一下。 我正在尝试编写一个插入前触发器,如果它留空,可以设置关闭。这可能吗? 没有太多代码可显示。我所做的只是创建了一个带有调试语句的简单的插入前触发器,以确保我的触发器在验证规则之前执行。似乎验证规则是第一位的(我显然无法更改它)。触发器永远不会触发。 这是可行的还是不可能的?
我有一个表单,其中有一条错误消息,如下例所示: http://codepen.io/anon/pen/dYWyEM?editors=101 重现问题的步骤如下: 打开coDepen链接后, 1)专注于输入领域 2) 按提交按钮 3) 由于首先触发模糊事件,因此首先隐藏错误消息,从而更改提交按钮的位置。因此,点击事件根本没有注册,我需要再次点击以提交表单。 有没有办法先发送提交事件? 我需要检测触发
我正在尝试获得另一个功能是提交按钮IE。class=“sucessclass”将在成功或完成时执行。下面是我的代码: