JSException в веб-представлении Javafx
У меня странное поведение, которого я не понимаю. У меня есть класс 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());
}
});
}
}
это работает как ожидалось. Но когда я пытаюсь перенести в основном тот же код в новый класс 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')
Теперь я предполагаю, что это связано с проблемой здесь, но я не понимаю, почему она работает нормально в одном месте, а не в другом.
1 ответ
Я думаю, почему первый пример работает, потому что сценарии выполняются только при щелчке мышью (к этому времени страница должна быть полностью загружена); В то время как второй пример выполняет сценарии непосредственно после того, как он запросил начать загрузку (что происходит настолько быстро после запуска, что невозможно завершить загрузку).
Что касается решения, вы сами дали ответ в сообщении, которое вы связали. Если вам нужны дальнейшие объяснения, не стесняйтесь спрашивать.