- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在编写一个 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/
我的问题是关于脚本文件运行的顺序(顺序)。 我调用一个名为“aaa.js”的脚本文件,并作为 executeScript 的回调,我有文件脚本“bbb.js”,如下所示是以下草图代码: chrome.
我正在使用 Ionic 和 ngCordova 创建构建混合应用程序。在应用程序登录工作流程中,我将一个页面从服务器返回到 InAppBrowser 插件。我需要从 Ionic 应用程序的返回页面中读
我正在编写一个Chrome扩展程序,需要根据某些给定参数修改特定域中的页面,这需要XSS才能获取,因此简单地使用内容脚本似乎是不可能的。因此,我决定使用 tabs.executeScript 注入(i
我正在尝试将值放入新选项卡上的元素中,然后单击“提交”登录。我尝试了很多变体,但似乎无法让它发挥作用。 function injectScript(){ var script = ' var e =
如何将参数传递到 browser.executeScript static sortableDragAndDropByClassName(dragElementClassName: string,
目前我正在使用以下代码将警报语句注入(inject)网页,打印出我传入的变量。脚本如下: //Inject statement setting the variable "count" in th
我正在编写一个 JavaFX 应用程序,它使用 WebView 和 WebEngine(.executeScript() 方法)与 JavaScript 交互。 在这里,我有来自 Medow.java
所以我有一个正在编写的扩展程序,我试图在用户单击 pageAction 图标时执行脚本。单击图标时,该方法调用 chrome.tabs.executeScript(...)。问题是 chrome.ta
我正在尝试从后台脚本向选定的选项卡上下文中注入(inject)一些代码,但我遇到了一些权限问题。 list .json { "manifest_version": 2, "name": "pr
是否可以将匿名函数传递给 chrome API executeScript 调用?目前我有以下代码: chrome.tabs.executeScript(tab.id, {code: "documen
我有一个应用程序,它使用 WebView 及其支持的 WebEngine 来显示具有一些 JavaScript 函数的简单网页。我还有另一个线程,有时会从互联网接收消息。我希望它们使用 webengi
我想为我的单元测试加载 SQL 脚本文件。当我使用 Spring 2.5.2 时,我 decided使用 SimpleJdbcTestUtils.executeScript()使用以下代码加载我的脚本
我希望在测试期间使用 browser.executescript 动态设置一些数据。像这样的东西: var x; browser.executeScript(function () { var s
我正在尝试使用 Groovy 登录 ExecuteScript 组件。每当我调用 log.info 时,没有任何内容写入 nifi-app.log,但是当我调用 log.errorit 时。是否有一些
为什么 Chrome 的这个功能不起作用?我正在尝试这个例子: https://developer.chrome.com/docs/extensions/mv3/content_scripts/#pr
我在点击事件中有这个代码 let browser = new InAppBrowser('http://example.com/test', '_self'); browser.executeScri
我正在尝试编写一个 chrome 扩展,它有一个名为“btn3”的按钮。当我在 chrome 扩展 (popup.html) 中点击那个按钮时,它会点击网页上的一个按钮。网页上的按钮具有以下 id:“
我正在尝试学习一些有关 javascript 的知识,并遇到了这个问题。基本上我想做的是获取 url ,重定向到代码中的站点并将其放在文本框中并激活按钮并不是说所有这些都是为了获得答案,而是作为我的目
这个问题已经有答案了: "Cannot read property of undefined" when using chrome.tabs or other chrome API in conten
我一直在尝试从 nifi 的 ExecuteScript 处理器中提取数据并将其作为属性附加到流文件。我尝试了很多来源,尤其是 Matt Burgess 的 funnifi 博客上的一个。 以下是我的
我是一名优秀的程序员,十分优秀!