JSException в веб-представлении Javafx - PullRequest
0 голосов
/ 02 декабря 2018

У меня странное поведение, которого я не понимаю.У меня есть класс 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 Ответ

0 голосов
/ 03 декабря 2018

Я думаю, почему первый пример работает, потому что сценарии выполняются только после щелчка мышью (к этому времени страница должна быть полностью загружена);В то время как во втором примере сценарии выполняются непосредственно после того, как он запросил начать загрузку (что происходит настолько быстро после запуска, что невозможно завершить загрузку).

Что касается решения, вы сами дали ответ всообщение, которое вы связали.Если вам нужны дальнейшие объяснения, не стесняйтесь спрашивать.

...