gpt4 book ai didi

javascript - webEngine.executeScript();抛出异常

转载 作者:行者123 更新时间:2023-11-30 09:56:47 28 4
gpt4 key购买 nike

我正在编写一个 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();");

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

所以,现在作为两者 webEngine.execute("document.fun();");webEngine.executeScript("document.draw();");几乎相似,我不明白有什么不同,它位于 <button>.setOnAction 中阻止并在它之外,因为 WebEngine 和 webView 都被声明为全局变量。

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

生成的异常是:

   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 状态更改时完成,请参阅 WebView callback from Javascript):

JSObject window = (JSObject) webEngine.executeScript("window");
window.setMember("app", this);

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

public void executeOnPageLoaded() {
...
}

然后您可以从 Javascript 调用此方法。如果您使用的是 jQuery,它可能看起来像这样:

$( document ).ready(function() {
console.log( "ready!" );
app.executeOnPageLoaded();
});

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

当您开始在 WebView 中使用 JavaScript 时,在其中也安装 Firebug lite 是一个好主意,因此请调查正在发生的事情,但主要是要有一种方法来为 JavaScript 的控制台输出提供种子。参见 Java FX application onload event

关于javascript - webEngine.executeScript();抛出异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33589604/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com