webEngine.executeScript();引发异常
webEngine.executeScript(); Throwing Exception
我正在编写一个JavaFX应用程序,它使用WebView和WebEngine(.executeScript()方法)与JavaScript交互。
在这里,我有Medow.java的这部分代码,它加载map.html(包含JavaScript代码),这个代码运行得很好:
add_button.setOnAction(new EventHandler<ActionEvent>() {
@Override
public void handle(ActionEvent ea5) {
// webEngine.executeScript("document.fun();"); // For Drawing Shapes
if (add == false) {
webEngine.executeScript("document.fun();"); // For Drawing Shapes
add = true;
}
// }
else {
webEngine.executeScript("document.reSet();"); // To remove Drawing Shapes
add = false;
}
}
});
在这里
webEngine.executeScript();
是否调用适当的JavaScript函数的
但是现在,我希望我的Java代码在程序启动时调用一些JS函数,所以我直接写:
webEngine.executeScript("document.draw();");
right在代码下方/之后,加载map.html文件。
所以,现在作为webEngine.execute("document.fun();");
和webEngine.executeScript("document.draw();");
几乎相似,我无法理解Difference的作用,它使位于<button>.setOnAction
块内部和外部,因为WebEngine和webView都被声明为全局变量。
无法使用HTML的onLoad选项调用document.draw()函数,因为我需要从java传递一些ValuesTo函数draw。
生成的异常为:
netscape.javascript.JSException: TypeError: undefined is not a function (evaluating 'document.draw()')
我该怎么做?谢谢
在不断试图找出原因的同时,我发现使用webEngine.load()
创建的HTMLDocument对象由于某种原因只能在handle方法内部可见,而在其他地方看不到,即使它是在外部定义的。
这里发生的情况是,您希望在内容完全加载之前调用JavaScript函数。因此,没有定义函数draw
。因此,唯一的方法是等待页面加载。有两种方法可能被证明是有用的:在状态上添加一个changelistener,并在加载成功后执行JavaScript:字符串htmlURL=。。。webView.getEngine().load(htmlURL);
webView.getEngine().stateProperty().addListener(new ChangeListener<Worker.State>() {
@Override
public void changed(ObservableValue<? extends Worker.State> ov, Worker.State t, Worker.State t1) {
if (t1 == Worker.State.SUCCEEDED) {
// this will be run as soon as WebView is initialized.
webView.getEngine().executeScript("document.draw()");
}
}
});
另一种方式是在JavaScript中提供更多的解决方案。您首先必须注册Java和html页面之间的桥梁(也必须在SUCCEEDED
状态更改中完成,请参阅Javascript中的WebView回调):
JSObject window = (JSObject) webEngine.executeScript("window");
window.setMember("app", this);
现在这个JavaObject在您的JavaScript中被引用。假设您在类上有一个方法,它是上面类型的this
:
public void executeOnPageLoaded() {
...
}
然后您可以从Javascript调用此方法。如果你正在使用jQuery,它可能看起来像这样:
$( document ).ready(function() {
console.log( "ready!" );
app.executeOnPageLoaded();
});
第二种方法更为复杂,但从长远来看,可能会给您带来更大的灵活性。
当你开始在WebView中使用JavaScript时,最好也在那里安装Firebug lite,所以调查一下发生了什么,但主要是为了找到一种方法来播种JavaScript的控制台输出。请参阅Java FX应用程序加载事件
- 在javaservlet doPost方法中启动线程时,无法返回异常消息
- document.applet.method在Mounatin Lion上抛出safari 6+JDK7异常
- 为什么浏览器没有为语法错误抛出异常
- java,javascript签名的小程序(文件选择,ftp上传)安全性/套接字异常
- node.js和express中的异常处理
- 派生进程的stdout在管道传输时工作异常
- NodeJS和pg promise,捕获PostgreSQL异常
- 当显式定义控制器参数时,默认模型绑定器会发生异常
- 显示引导弹出操作异常的逻辑
- 调用谷歌地图路线服务时未捕获的异常
- web配置http到https重定向异常
- 转换异常时间&Datestring到JavaScript日期
- 为什么在python中使用异常比javascript更容易接受
- PHP REST服务抛出异常——希望避免控制台错误
- JS异常:animate不是一个函数
- 在蓝鸟中处理异常
- Meteor:异步函数回调异常:onAfterAction
- 在js中捕获自定义异常
- 测试抛出异常的函数
- webEngine.executeScript();引发异常