为什么JavaScript方法在从JavaFX插入DOM时不会执行?

发布时间:2020-01-14 发布网站:脚本之家
脚本之家收集整理的这篇文章主要介绍了为什么JavaScript方法在从JavaFX插入DOM时不会执行?脚本之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

我有一个大量使用WebView的JavaFX应用程序.我试图将一个对象插入到JavaScript代码可以使用的DOM中,并且我需要在加载新页面时使用这些对象.

但是,当我运行程序时,FirebugLite会在DOM中显示对象,但函数不会执行.

根据some Oracle documentation,这似乎是提供从JavaScript到Java的upcalls的适当方式.我也看到了一些StackOverflow posts解释同样的事情.

我错过了什么?我在Windows 7上使用Java 8,Update 51,64位.

Java的:

public class DemoApplication extends Application {

    Debug debug;

    @Override
    public void start(final Stage stage) throws Exception {
        debug = new Debug();

        WebView browser = new WebView();
        WebEngine webEngine = browser.getEngine();
        webEngine.getLoadWorker().stateProperty().addListener(
                new ChangeListener

HTML / JavaScript的:

Firebug截图:

enter image description here

最佳答案
我相信正在发生的事情是WebEngine加载页面,ChangeListener在各个点调用(SCHEDULED,RUNNING,SUCCEEDED等).一旦发生了Worker.State.SUCCEEDED事件,页面就已经完成了所有内容的加载,并且已经完成了该内容的执行.所以基本上我在JavaScript代码中对Debug.print()的调用很早就发生了并且调用了一个未定义或null的对象.

无论如何,这是我最好的猜测,因为如果我在添加对象后添加由Java部分执行的JavaScript函数,一切都按预期工作.

这就是我修改JavaScript方面的方法:

这就是我修改Java方面的方式:

webEngine.getLoadWorker().stateProperty().addListener(
    new ChangeListener

这里的关键更改是JavaScript中的ready()函数,并在Java端注入对象后调用该函数.这可确保在调用之前这些对象可用.

我在几个不同的页面上尝试了这个,当从一个页面到另一个页面时,当调用ready()函数时,Debug.print()正确执行,即使使用WebEngine.reload()或WebHistory.go()也是如此.

总结

以上是脚本之家为你收集整理的为什么JavaScript方法在从JavaFX插入DOM时不会执行?全部内容,希望文章能够帮你解决为什么JavaScript方法在从JavaFX插入DOM时不会执行?所遇到的程序开发问题。

如果觉得脚本之家网站内容还不错,欢迎将脚本之家网站推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:76874919,请注明来意。

脚本之家官方公众号

微信公众号搜索 “ 程序精选 ” ,选择关注!

微信公众号搜索 “ 程序精选 ” ,选择关注!
精选程序员所需精品干货内容!

标签:javajava