JavaFX 8 WebEngine: Comment obtenir la console.log() de javascript pour le Système.dans java?
J'utilise JavaFX et le moteur javascript du WebEngine JavaFX pour développer une application. J'aimerais obtenir des commentaires de javascript pour le débogage. Qu'arrive-t-il à la sortie de la console à l'intérieur du WebEngine? Y a-t-il un moyen d'y accéder, ou de rediriger vers le système?dans java?
3 réponses
le code suivant redirige console.log()
vers JavaBridge.log()
:
import netscape.javascript.JSObject;
public class JavaBridge
{
public void log(String text)
{
System.out.println(text);
}
}
[...]
webEngine.getLoadWorker().stateProperty().addListener((observable, oldValue, newValue) ->
{
JSObject window = (JSObject) webEngine.executeScript("window");
JavaBridge bridge = new JavaBridge();
window.setMember("java", bridge);
webEngine.executeScript("console.log = function(message)\n" +
"{\n" +
" java.log(message);\n" +
"};");
});
j'aime aller dans l'autre direction. Nous utilisons log4j, donc j'ai créé un emballage javascript comme suit:
module.exports = {
levels:[ "ALL", "TRACE", "DEBUG", "INFO", "WARN", "ERROR", "OFF"],
level:"INFO",
error:function(msg){
if(this.isErrorEnabled()){
console.error(msg)
}
},
warn:function(msg){
if(this.isWarnEnabled()){
console.warn(msg)
}
},
info:function(msg){
if(this.isInfoEnabled()){
console.log("INFO: "+msg)
}
},
debug:function(msg){
if(this.isDebugEnabled()){
console.log("DEBUG: "+msg)
}
},
trace:function(msg){
if(this.isTraceEnabled()){
console.log("TRACE: "+msg)
}
},
isErrorEnabled:function(){
return this.isEnabled("ERROR");
},
isWarnEnabled:function(){
return this.isEnabled("WARN");
},
isInfoEnabled:function(){
return this.isEnabled("INFO");
},
isDebugEnabled:function(){
return this.isEnabled("DEBUG");
},
isTraceEnabled:function(){
return this.isEnabled("TRACE");
},
isEnabled:function(statementLevel){
return this.levels.indexOf(this.level)<=this.levels.indexOf(statementLevel);
}
}
puis au début du javascript je vérifie si le log est présent et je le règle:
if(window.log == undefined){
window.log = require("./utils/log4j-wrapper")
window.log.level = "INFO"
}
et de cette façon si vous mettez le logger Log4j directement sur le moteur avant même de charger l'url comme:
WebEngine webEngine = webView.getEngine()
JSObject win = (JSObject) webEngine.executeScript("window")
win.setMember("log", log) //log being the java log4j logger
de cette façon je peux me connecter si j'ouvre directement dans un navigateur ou il est exécuté à partir d'un WebView dans un programme JavaFX. Et a l'avantage supplémentaire d'avoir des niveaux pour la journalisation dans javascript qui correspondent à vos paquets du contrôleur WebView. Juste une alternative pour les vues javascript plus grandes.
vous pouvez juste ajouter un écouteur de message aussi voir ce qui se passe dans votre sortie. Vous n'avez pas à injecter js bridge avec redéfinition de fonctions comme console.log
pour chaque page chargée
WebConsoleListener.setDefaultListener((webView, message, lineNumber, sourceId) -> {
System.out.println(message + "[at " + lineNumber + "]");
});