Javafx webEngine executescript () не может отправить многострочную строку

Проблема: я не могу найти способ для веб-движка javafx запускать функцию javascript, если я использую объект java String с несколькими строками.

Если я введу следующий пример в html: "asd" ВВОД "qwe" в поле ввода textArea, затем НАЖМИТЕ кнопку отправки. Следующий код Java не будет работать:

webEngine.executeScript("onRecieveMsg('" + msg + "')");.

Но это сработает, если я не использую 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);
}

}

person Dutsadi Bunliang    schedule 06.05.2018    source источник


Ответы (1)


Многострочные строковые литералы не работают ни в 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+"\"";
}
person fabian    schedule 06.05.2018