javascript - Javafx webEngine executescript()无法发送多行字符串
问题描述
问题:如果我使用多行的 java String 对象,我似乎无法找到 javafx webengine 触发 javascript 函数的方法。
如果我在 html 中输入以下示例:“asd”在输入中输入“qwe”,textArea
然后单击发送按钮。以下 java 代码不会运行:
webEngine.executeScript("onRecieveMsg('" + msg + "')");
.
但如果我不在 input 中使用 ENTER ,它将起作用textArea
。
请帮我
<!DOCTYPE html>
<html>
<head>
<meta charset="ISO-8859-1">
<title>Chat</title>
</head>
<script type="text/javascript">
function onSendMsg(){
var msg = document.getElementById("inputTextArea").value;
document.getElementById("inputTextArea").value = "";
java.onSendMsg(msg);
}
function onRecieveMsg(msg){
var msg = msg;
msg = document.getElementById("outputTextArea").value + msg;
document.getElementById("outputTextArea").value = msg + "\n";
}
</script>
<body>
<h1>Output</h1>
<textarea id="outputTextArea" rows="10" cols="50" readonly></textarea>
<h1>Input</h1>
<textarea id="inputTextArea" rows="4" cols="50"></textarea>
<button id="sendBtn" onclick="onSendMsg()">Send</button>
</body>
</html>
import javafx.application.Application;
import javafx.beans.value.ChangeListener;
import javafx.beans.value.ObservableValue;
import javafx.concurrent.Worker.State;
import javafx.scene.Scene;
import javafx.scene.web.WebEngine;
import javafx.scene.web.WebView;
import javafx.stage.Stage;
import netscape.javascript.JSObject;
public class ViewFx extends Application {
//VARIABLES
private WebView webView;
private WebEngine webEngine;
private WebEngineListener webEngineListener;
private JsBridge jsBridge;
//CONTRUCTOR
//METHODS
@Override
public void start(Stage stage) {
webView = new WebView();
webEngine = webView.getEngine();
webEngine.load(getClass().getResource("view.html").toExternalForm());
jsBridge = new JsBridge();
webEngineListener = new WebEngineListener(jsBridge);
webEngine.getLoadWorker().stateProperty().addListener(webEngineListener);
stage.setScene(new Scene(webView));
stage.setWidth(600);
stage.setHeight(700);
stage.show();
}
//INNER CLASS
private class WebEngineListener implements ChangeListener<State> {
//VARIABLES
private JsBridge jsBridge;
private JSObject jsobj;
//CONSTRUCTOR
private WebEngineListener(JsBridge jsBridge) {
this.jsBridge = jsBridge;
}
//METHODS
@Override
public void changed(ObservableValue<? extends State> observable, State oldState, State newState) {
if(newState == State.SUCCEEDED) {
jsobj = (JSObject) webEngine.executeScript("window");
jsobj.setMember("java", jsBridge);
}
}
}
public class JsBridge {
//VARIABLES
//CONTRUCTOR
//METHODS
public void onSendMsg(String msg) {
webEngine.executeScript("onRecieveMsg('" + msg + "')");
}
}
public static void main(String[] args) {
launch(args);
}
}
解决方案
多行字符串文字在 JavaScript 和 java 中都不起作用。如果收到多行消息,您只需执行无效的 JavaScript 代码:
收到消息
asd
qwe
执行的 javascript
onRecieveMsg('asd
qwe')
您需要转义换行符而不是将它们包含在脚本中。还有一些字符需要引用。您可以使用这样的方法来获取正确引用的字符串:
public static String toJavaScriptString(String value) {
value = value.replace("\u0000", "\\0")
.replace("'", "\\'")
.replace("\\", "\\\\")
.replace("\"", "\\\"")
.replace("\n", "\\n")
.replace("\r", "\\r")
.replace("\t", "\\t");
return "\""+ value+"\"";
}
推荐阅读
- javascript - 如何在此 JS 代码中添加默认图像?
- vb.net - 是否有与 C# 的“使用静态”等效的 VB.NET?
- python - 如何将 SequenceExample 对象的读取从 tf.python_io.tf_record_iterator 转换为 tf.data.TFRecordDataset
- angular - 如何确保 curl 请求获取通过 Angular 附加的用户名和密码?
- node.js - AWS Lambda 中的 Express 应用程序每次都有 base64 编码的正文
- python - 如何用scrapy做水平爬行
- python - Python中的单行嵌套for循环
- javascript - 如何手动设置 Splunk 日志的时间戳?
- sql - 如何将表中的col1,col2转置为row1和row2?col1 是 col2 的父级
- push-notification - this.fcm.onNotification().subscribe() 未在 Android 设备上调用