首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >webEngine.executeScript();引发异常

webEngine.executeScript();引发异常
EN

Stack Overflow用户
提问于 2015-11-08 01:02:10
回答 1查看 2.6K关注 0票数 1

我正在编写一个JavaFX应用程序,它使用WebView和WebEngine (.executeScript()方法)与JavaScript交互。

在这里,我从Medow.java获得了这部分代码,它加载了map.html(包含JavaScript代码),这个代码运行得很好:

代码语言: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函数,所以我直接编写:

代码语言:javascript
复制
webEngine.executeScript("document.draw();");

就在代码下面/之后,这将加载map.html文件。

所以,由于webEngine.execute("document.fun();");webEngine.executeScript("document.draw();");几乎是相似的,我不知道有什么区别,它在<button>.setOnAction块中和在它之外有什么区别,因为WebEngine和webView都被声明为全局变量。

无法使用document.draw的onLoad选项调用onLoad()函数,因为我需要传递函数从onLoad提取的一些值。

产生的例外情况是:

代码语言:javascript
复制
   netscape.javascript.JSException: TypeError: undefined is not a function (evaluating 'document.draw()')

我怎么才能把这事做好?谢谢

在不断地试图找出原因时,我发现使用webEngine.load()创建的webEngine.load()对象由于某种原因只能在句柄方法中可见,而且在其他地方也是可见的,即使它是在外部定义的。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-11-08 08:49:18

这里发生的事情是,您希望在内容完全加载之前调用一个JavaScript函数。因此,没有定义函数draw。因此,唯一的方法是等待页面加载。有两种方法可能被证明是有用的:在状态上添加一个changelistener并在加载成功后执行JavaScript : String htmlURL =.webView.getEngine().load(htmlURL);

代码语言:javascript
复制
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状态更改中完成,参见WebView callback from Javascript):

代码语言:javascript
复制
JSObject window = (JSObject) webEngine.executeScript("window");
window.setMember("app", this);

现在,这个JavaObject在您的JavaScript中引用。假设在类上有一个属于上述类型的this的方法

代码语言:javascript
复制
public void executeOnPageLoaded() {
  ...
}

然后,您可以从Javascript调用此方法。如果您使用的是jQuery,它可能如下所示:

代码语言:javascript
复制
$( document ).ready(function() {
    console.log( "ready!" );
    app.executeOnPageLoaded();
});

第二种方法比较复杂,但从长远来看,可能会给您带来更大的灵活性。

当您开始在JavaScript中工作时,在WebView中使用Firebug也是个好主意,所以研究一下正在发生的事情,但是主要是有一种方法来为JavaScript的控制台输出添加种子。请参阅Java FX application onload event

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33589604

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档