Javafx web 视图中的 JSException
JSException in Javafx webview
我遇到了一些我不明白的奇怪行为。我有一个 class MonologueTab
:
public final class MonologueTab extends VBox{
private MonologueNode node;
WebView webView;
WebEngine webEngine;
public MonologueTab(){
this.node = Game.getInstance().getMonologueDatabase().getMonologueNode();
webView = new WebView();
webEngine = webView.getEngine();
createGui();
}
public void createGui(){
Label textLabel = new Label ();
textLabel.setGraphic(webView);
textLabel.setContentDisplay(ContentDisplay.GRAPHIC_ONLY);
webEngine.loadContent(node.getNextLine());
this.getChildren().add(textLabel);
textLabel.setOnMouseClicked((MouseEvent event) -> {
String nextLine = node.getNextLine();
if (nextLine!=null){
webEngine.executeScript("document.getElementById('content').insertAdjacentHTML( 'beforeend'," + nextLine + ");");
webEngine.executeScript("window.scrollTo(0, document.body.scrollHeight);");
}
else{
EventManager.getInstance().notifyObserver("end" + node.getStartTrigger());
}
});
}
}
按预期工作。但是当我尝试将基本相同的代码移植到新的 class DialogueTab
:
public final class DialogueTab extends VBox implements EventObserver{
WebView webView;
WebEngine webEngine;
public DialogueTab(){
webView = new WebView();
webEngine = webView.getEngine();
EventManager.getInstance().addObserver(this);
createGui();
}
public void createGui(){
this.getChildren().removeAll(this.getChildren());
Label conversation = new Label();
conversation.setGraphic(webView);
conversation.setContentDisplay(ContentDisplay.GRAPHIC_ONLY);
webEngine.loadContent("<body><b>Available Conversations</b><br><div id='content'></div></body>");
this.getChildren().add(conversation);
for (Person p: Game.getInstance().getPeopleAt()){
webEngine.executeScript("document.getElementById('content').insertAdjacentHTML('beforeend', " + p.getShortDesc() + ");");
//some irrelevance removed
}
}
它正在抛出一个:
netscape.javascript.JSException: TypeError: null is not an object (evaluating 'document.getElementById('content').insertAdjacentHTML')
现在,我假设这与问题 here 有关,但我不明白为什么它在一个地方工作正常,但在另一个地方却不行。
我认为第一个示例之所以有效,是因为脚本仅在鼠标单击时执行(此时页面应该已完全加载);而第二个例子在请求开始加载后直接执行脚本(启动后速度太快,不可能完成加载)。
至于解决方案,您在链接的 post 中自己提供了答案。如果您需要任何进一步的解释,请随时询问。
我遇到了一些我不明白的奇怪行为。我有一个 class MonologueTab
:
public final class MonologueTab extends VBox{
private MonologueNode node;
WebView webView;
WebEngine webEngine;
public MonologueTab(){
this.node = Game.getInstance().getMonologueDatabase().getMonologueNode();
webView = new WebView();
webEngine = webView.getEngine();
createGui();
}
public void createGui(){
Label textLabel = new Label ();
textLabel.setGraphic(webView);
textLabel.setContentDisplay(ContentDisplay.GRAPHIC_ONLY);
webEngine.loadContent(node.getNextLine());
this.getChildren().add(textLabel);
textLabel.setOnMouseClicked((MouseEvent event) -> {
String nextLine = node.getNextLine();
if (nextLine!=null){
webEngine.executeScript("document.getElementById('content').insertAdjacentHTML( 'beforeend'," + nextLine + ");");
webEngine.executeScript("window.scrollTo(0, document.body.scrollHeight);");
}
else{
EventManager.getInstance().notifyObserver("end" + node.getStartTrigger());
}
});
}
}
按预期工作。但是当我尝试将基本相同的代码移植到新的 class DialogueTab
:
public final class DialogueTab extends VBox implements EventObserver{
WebView webView;
WebEngine webEngine;
public DialogueTab(){
webView = new WebView();
webEngine = webView.getEngine();
EventManager.getInstance().addObserver(this);
createGui();
}
public void createGui(){
this.getChildren().removeAll(this.getChildren());
Label conversation = new Label();
conversation.setGraphic(webView);
conversation.setContentDisplay(ContentDisplay.GRAPHIC_ONLY);
webEngine.loadContent("<body><b>Available Conversations</b><br><div id='content'></div></body>");
this.getChildren().add(conversation);
for (Person p: Game.getInstance().getPeopleAt()){
webEngine.executeScript("document.getElementById('content').insertAdjacentHTML('beforeend', " + p.getShortDesc() + ");");
//some irrelevance removed
}
}
它正在抛出一个:
netscape.javascript.JSException: TypeError: null is not an object (evaluating 'document.getElementById('content').insertAdjacentHTML')
现在,我假设这与问题 here 有关,但我不明白为什么它在一个地方工作正常,但在另一个地方却不行。
我认为第一个示例之所以有效,是因为脚本仅在鼠标单击时执行(此时页面应该已完全加载);而第二个例子在请求开始加载后直接执行脚本(启动后速度太快,不可能完成加载)。
至于解决方案,您在链接的 post 中自己提供了答案。如果您需要任何进一步的解释,请随时询问。