- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
嘿,我已经从事这个工作有一段时间了。从迄今为止我看到的所有例子中,我似乎无法得到正确的结果。看起来很容易,但我不知所措。
我的 HTML:
WebView webView = new WebView();
webView.getEngine().setJavaScriptEnabled(true);
webView.setContextMenuEnabled(false);
webView.getEngine().loadContent(""+
"<!DOCTYPE html>\r\n" +
"<html>\r\n" +
"<head>\r\n" +
"</head>\r\n" +
"<body>" +
"<div class=\"chatbox\" style=\"document.body.style.overflow = 'hidden';\">\r\n" +
" <div class=\"chatlogs\">\r\n" +
" <div class=\"animated animatedFadeInUp fadeInUp\">" +
" <div class=\"chat friend\">\r\n" +
" <div class=\"user-photo\"><img src=\"" + pic1 + "\"></div>\r\n" +
" <p class=\"chat-message\">Whats up!</p>\r\n" +
" <span class=\"timefriend\">11:01pm Oct 25 2019</span>\r\n" +
" </div>\r\n" +
" </div>" +
" <div class=\"animated animatedFadeInUp fadeInUp\">" +
" <div class=\"chat self\">\r\n" +
" <div class=\"user-photo\"><img src=\"" + pic2 + "\"></div>" +
" <p class=\"chat-message\">Not much yo!</p>\r\n" +
" <span class=\"timeself\">11:01 PM | Oct 11 2019</span>\r\n" +
" </div>\r\n" +
" </div>\r\n" +
" <div class=\"animated animatedFadeInUp fadeInUp\">" +
" <div class=\"chat friend\">\r\n" +
" <div class=\"user-photo\"><img src=\"" + pic1 + "\"></div>" +
" <p class=\"chat-message\">Whats up!</p>\r\n" +
" <span class=\"timefriend\">11:01 PM | Oct 11 2019</span>\r\n" +
" </div>\r\n" +
" </div>\r\n" +
" <div class=\"animated animatedFadeInUp fadeInUp\">" +
" <div class=\"chat friend\">\r\n" +
" <div class=\"user-photo\"><img src=\"" + pic1 + "\"></div>" +
" <p class=\"chat-message\">Whats up!</p>\r\n" +
" <span class=\"timefriend\">11:01 PM | Oct 11 2019</span>\r\n" +
" </div>\r\n" +
" </div>\r\n" +
" <div id=\"nextChatHolder\"></div>" +
" </div>\r\n" +
" </div>\r\n" +
" <div class=\"footer\"></div>" +
" <script language=\"javascript\">\r\n" +
" function app.test() {\r\n" +
" window.scrollBy(0, 20); \r\n" +
" alert('done');\r\n" +
" }\r\n" +
" </script>" +
"</body>\r\n" +
"</html>");
这是我正在使用的java(并试图开始工作):
webView.getEngine().getLoadWorker().stateProperty().addListener(new ChangeListener<State>()
{
public void changed(ObservableValue<? extends State> o, State old, final State state)
{
if (state == State.SUCCEEDED)
{
JSObject win = (JSObject) webView.getEngine().executeScript("window");
win.setMember("app", new JavaApp());
//webView.getEngine().executeScript("javaObj.start()");
}
}
});
private class JavaApp {
public void test() {
Platform.exit();
}
}
我认为这样做:
function app.test() {\r\n" +
window.scrollBy(0, 20); \r\n" +
alert('done');\r\n" +
}
并通过以下方式调用它:
webView.getEngine().executeScript("test()");
连这个都不起作用....../
webView.getEngine().executeScript("alert('testing')");
最佳答案
对于从 JavaScript 调用 Java 方法 JavaApp#test()
,实现的最重要部分已包含在您的第二代码片段中。只有调用本身仍然丢失,例如
<button onclick='app.test();'>Call JavaApp#test-method</button>
但是,必须考虑两件重要的事情:首先,嵌套类 JavaApp
必须是public
。其次,应用程序必须持有对 JavaApp
实例的引用,这是 JavaScript 回调执行方法所必需的(请参阅 here,调用从 JavaScript 返回 Java
)。
因此您必须按如下方式修改代码:
JavaApp javaApp = new JavaApp(); // Hold a reference...
webView.getEngine().getLoadWorker().stateProperty().addListener(new ChangeListener<State>() {
public void changed(ObservableValue<? extends State> o, State old, final State state) {
if (state == State.SUCCEEDED) {
JSObject win = (JSObject) webView.getEngine().executeScript("window");
win.setMember("app", javaApp); // Use the reference...
}
}
});
和
public class JavaApp { // Change the access modifier from private to public...
public void test() {
Platform.exit();
}
}
<小时/>
如果您想从 Java 调用 JavaScript 方法,例如test()
,这是通过
webView.getEngine().executeScript("test()");
作为示例,我使用第三个代码段中给出的test()
方法,但是名称必须从app.test()
到test()
。如果调用 webView.getEngine().executeScript("test()");
,则执行 test()
,异常(exception) alert()
-方法。这是因为对于某些 JavaScript 方法(例如 window.alert()
),WebEngine
将请求转发给回调(在本例中为 onAlert
) window.alert()
)。如果未定义回调,则该请求将被忽略(请参阅 here,用户界面回调部分)。例如,alert()
的回调可以定义如下:
webView.getEngine().setOnAlert(event -> showAlert(event.getData()));
其中 showAlert(String msg)
是自定义方法,msg
包含原始消息(在 的情况下为
-方法),例如:done
test()
private void showAlert(String msg){
Alert alert = new Alert(AlertType.INFORMATION);
alert.setTitle("Custom Alert");
alert.setHeaderText("");
alert.setContentText(msg);
alert.showAndWait();
}
您可以在 How can I make JavaFX web browser displays alert and confirm message 中找到更多示例.
编辑:
从 JavaScript 调用 Java 方法的示例代码:按下按钮时,从 JavaScript 调用 Java 方法 JavaApp#test()
,该方法输出文本 在文本区域中完成
。
import javafx.application.Application;
import javafx.concurrent.Worker.State;
import javafx.geometry.Insets;
import javafx.scene.Scene;
import javafx.scene.control.TextArea;
import javafx.scene.layout.VBox;
import javafx.scene.web.WebEngine;
import javafx.scene.web.WebView;
import javafx.stage.Stage;
import netscape.javascript.JSObject;
public class WebViewExecuteJavaFromJavaScript extends Application {
private TextArea textArea;
private static String HTML_STRING = "" +
"<!DOCTYPE html>\r\n" +
"<html>\r\n" +
" <head>\r\n" +
" </head>\r\n" +
" <body>" +
" <button onclick='app.test();'>Call Java-method JavaApp#test()...</button>" + // Call Java-method JavaApp#test()...
" </body>\r\n" +
"</html>";
@Override
public void start(final Stage stage) {
WebView webView = new WebView();
WebEngine webEngine = webView.getEngine();
webEngine.setJavaScriptEnabled(true);
webEngine.loadContent(HTML_STRING);
JavaApp javaApp = new JavaApp();
webEngine.getLoadWorker().stateProperty().addListener((o, oldState, newState) -> {
if (newState == State.SUCCEEDED) {
JSObject win = (JSObject) webView.getEngine().executeScript("window");
win.setMember("app", javaApp); // Enable call of Java-method from JavaScript...
}
});
textArea = new TextArea();
textArea.setWrapText(true);
VBox root = new VBox();
root.setPadding(new Insets(5));
root.setSpacing(5);
root.getChildren().addAll(webView, textArea);
Scene scene = new Scene(root);
stage.setTitle("Demo: Execute Java from JavaScript");
stage.setScene(scene);
stage.setWidth(450);
stage.setHeight(300);
stage.show();
}
public static void main(String[] args) {
launch(args);
}
public class JavaApp {
public void test() {
textArea.setText(textArea.getText() + "done ");
}
}
}
从 Java 调用 JavaScript 方法的示例代码:按下按钮时,从 Java 调用 JavaScript 方法 test()
,输出文本 done
在文本区域和对话框中。
import javafx.application.Application;
import javafx.geometry.Insets;
import javafx.scene.Scene;
import javafx.scene.control.Alert;
import javafx.scene.control.Alert.AlertType;
import javafx.scene.control.Button;
import javafx.scene.layout.VBox;
import javafx.scene.web.WebEngine;
import javafx.scene.web.WebView;
import javafx.stage.Stage;
public class WebViewExecuteJavaScriptFromJava extends Application {
private static String HTML_STRING = "" +
"<!DOCTYPE html>\r\n" +
"<html>\r\n" +
" <head>\r\n" +
" </head>\r\n" +
" <body>" +
" <textarea id=\"textarea\" name=\"textarea\" cols=55 rows=3 wrap=\"virtual\"></textarea>" +
" <script language=\"javascript\">\r\n" +
" function test() {\r\n" +
" textarea.value+='done '; \r\n" +
" alert('done');\r\n" + // Is ignored as long as no callback is defined...
" }\r\n" +
" </script>" +
" </body>\r\n" +
"</html>";
@Override
public void start(final Stage stage) {
WebView webView = new WebView();
WebEngine webEngine = webView.getEngine();
webEngine.setJavaScriptEnabled(true);
webEngine.loadContent(HTML_STRING);
webEngine.setOnAlert(event -> showAlert(event.getData())); // Define callback for JavaScript-alert...
Button button = new Button("Call JavaScript-method test()...");
button.setOnAction(event -> webView.getEngine().executeScript("test()")); // Call JavaScript-method test()...
VBox root = new VBox();
root.setPadding(new Insets(5));
root.setSpacing(5);
root.getChildren().addAll(button, webView);
Scene scene = new Scene(root);
stage.setTitle("Demo: Execute JavaScript from Java");
stage.setScene(scene);
stage.setWidth(450);
stage.setHeight(300);
stage.show();
}
public static void main(String[] args) {
launch(args);
}
private void showAlert(String msg){
Alert alert = new Alert(AlertType.INFORMATION);
alert.setTitle("Custom Alert");
alert.setHeaderText("");
alert.setContentText(msg);
alert.showAndWait();
}
}
关于Java Swing webEngine.executeScript 未在 HTML Javafx web View 中触发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55541775/
我的问题是关于脚本文件运行的顺序(顺序)。 我调用一个名为“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 博客上的一个。 以下是我的
我是一名优秀的程序员,十分优秀!