【问题标题】:webEngine.executeScript(); Throwing ExceptionwebEngine.executeScript();抛出异常
【发布时间】:2015-11-08 01:02:10
【问题描述】:

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

在这里,我有这部分来自 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();");

在代码下方/之后,加载 map.html 文件。

所以,现在作为两者 webEngine.execute("document.fun();");webEngine.executeScript("document.draw();"); 几乎相似,我无法理解差异是做什么的,它使得在 &lt;button&gt;.setOnAction 块内和在块外,因为 WebEngine 和 webView 都被声明为全局变量。

无法使用 HTML 的 onLoad 选项调用 document.draw() 函数,因为我需要将一些值传递给从 java 中绘制的函数。

产生的异常是:

   netscape.javascript.JSException: TypeError: undefined is not a function (evaluating 'document.draw()')

我怎样才能使这项工作?谢谢

在不断尝试找出原因时,我发现使用 webEngine.load() 创建的 HTMLDocument 对象由于某种原因仅在句柄方法内部可见,而在其他任何地方都看不到,即使它是在外部定义的。

【问题讨论】:

    标签: javascript exception javafx


    【解决方案1】:

    这里发生的情况是您想在内容完全加载之前调用 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 状态更改中完成,请参阅 WebView callback from Javascript):

    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 application onload event

    【讨论】:

      猜你喜欢
      • 2013-05-24
      • 2011-05-30
      • 1970-01-01
      • 2011-02-25
      • 2012-01-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多