【问题标题】:JSException in Javafx webviewJavafx webview中的JSException
【发布时间】:2019-05-04 04:28:13
【问题描述】:

我遇到了一些我不明白的奇怪行为。我有一堂课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')

现在,我假设这与问题 here 有关,但我不明白为什么它在一个地方运行良好,但在另一个地方却不行。

【问题讨论】:

    标签: java javafx javafx-webengine


    【解决方案1】:

    我认为为什么第一个示例有效是因为脚本仅在鼠标单击时执行(此时页面应该完全加载);而第二个示例在请求开始加载后直接执行脚本(启动后速度非常快,不可能完成加载)。

    至于解决方案,您在链接的帖子中自己提供了答案。如果您需要任何进一步的解释,请随时询问。

    【讨论】:

    • 啊。这就说得通了。是的,你说得对,我知道答案(事实上它确实有效)。只是很困惑为什么以前没有。谢谢你,我现在可以睡个好觉了。
    猜你喜欢
    • 2012-04-18
    • 2015-08-14
    • 2012-08-11
    • 2012-06-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-20
    • 2020-04-27
    • 1970-01-01
    相关资源
    最近更新 更多