javafx - 获取 JavaFX WebEngine 解释文档

标签 javafx domdocument javafx-webengine

为我调用 WebEngine 对象上的 getDocument() 方法只返回从服务器检索的源,而没有执行 JavaScript(仍然有元素)。如果您在 Chrome 中使用“查看源代码”,就会看到这种源代码。如何使用已运行的 JavaScript 检索已解释的源代码?

public Browser() {
    WebView browser = new WebView();
    final WebEngine webEngine = browser.getEngine();
    webEngine.load("*******************************");

    webEngine.getLoadWorker().stateProperty().addListener(new ChangeListener<State>() {
        @Override
        public void changed(ObservableValue<? extends State> ov, State oldState, State newState) {
            if (newState == State.SUCCEEDED) {
                Document doc = webEngine.getDocument();
                printDocument(doc);
            }
        }
    });
}

最佳答案

这符合我的预期。在此示例中,div 包含一个文本节点,其中包含由 Javascript 函数设置的文本:

import javafx.application.Application;
import javafx.concurrent.Worker;
import javafx.scene.Scene;
import javafx.scene.layout.BorderPane;
import javafx.scene.web.WebView;
import javafx.stage.Stage;

import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;

public class WebViewOnLoadExample extends Application {

    @Override
    public void start(Stage primaryStage) {
        WebView webView = new WebView();
        webView.getEngine()
            .getLoadWorker()
            .stateProperty()
            .addListener((obs, oldState, newState) -> {
                if (newState == Worker.State.SUCCEEDED) {
                    Document doc = webView.getEngine().getDocument();
                    showNodeContent(doc, 0);
                }
            });
        BorderPane root = new BorderPane(webView);
        primaryStage.setScene(new Scene(root, 600, 400));
        primaryStage.show();

        webView.getEngine().loadContent("<html>"
                +"<head><script>"
                +"function setText() {"
                +"  document.getElementById(\"target\").appendChild(document.createTextNode(\"Hello World\"));"
                +"}"
                +"</script></head>"
                +"<body onload='setText()'>"
                +"<div id='target'></div></body></html>");
    }

    private void showNodeContent(Node n, int depth) {
        for (int i=0; i<depth; i++) {
            System.out.print(" ");
        }
        System.out.println(n.getNodeName()+":"+n.getNodeValue());
        NodeList children = n.getChildNodes() ;
        for (int i=0; i<children.getLength(); i++) {
            showNodeContent(children.item(i), depth+1);
        }
    }

    public static void main(String[] args) {
        launch(args);
    }
}

关于javafx - 获取 JavaFX WebEngine 解释文档,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26562380/

相关文章:

java - 如何在JavaFX TextArea中显示日志?

java - 获取添加到网格 Pane 的按钮数组中位置 [x] [y] 的值

Java Fx自定义图像作为散点图数据点

Java : how to know when a XML Document has been modified

php - DomDocument 和特殊字符

ssl - javafx 16 Web 引擎异常 "SSL Handshake failed"

java - 使用线程发出数据库请求

php - XPATH - 获取返回的单个值而不是数组 php

javascript - 如何确保加载所有 HTML