HyperlinkListener in JavaFX WebEngine

2019-01-12 01:25发布

问题:

In the past I used JEditorPane and now I'm trying my best with JavaFX WebEngine. How can I register listeners for events containing hyperlinks on displayed page (like link selection or click on a link)?

In JEditorPane there was addHyperlinkListener method...

EDIT:

I followed the advice in the first answer. This is my code:

webEngine.getLoadWorker().stateProperty().addListener(new ChangeListener<State>() {
    public void changed(ObservableValue ov, State oldState, State newState) {
        if (newState == Worker.State.SUCCEEDED) {
                // note next classes are from org.w3c.dom domain
            EventListener listener = new EventListener() {
                public void handleEvent(Event ev) {
                    System.out.println("KLIKNIETO!!!");
                }
            };

            Document doc = webEngine.getDocument();
            Element el = doc.getElementById("a");
            NodeList lista = doc.getElementsByTagName("a");
            System.out.println("Liczba elementow: "+ lista.getLength());
            for (int i=0; i<lista.getLength(); i++)
                ((EventTarget)lista.item(i)).addEventListener("click", listener, false);
        }
    }
});

I now receive events after clicking on the links. However I need to get reference to the clicked link (to get it's content). How can I achieve that?

回答1:

You can catch the link click event by adding a click event handler in Java using the w3c dom classes once the relevant document has loaded.

See Sergey's example in Detecting HTML textarea onkeyup event in JavaFX WebView.

You can also catch the events using JavaScript (for example using jQuery), which might be a little easier to work with than the w3c dom api.

If you are using JavaScript to catch events and you want to feedback notification of the events or subsequent processing from JavaScript to Java, you can use the JavaScript <=> Java bridge api.

I've logged a request to get a sample of this functionality added to the official WebView tutorial.



回答2:

Where you have

System.out.println("KLIKNIETO!!!");

replace with

String href = ((Element)ev.getTarget()).getAttribute("href");

to get the URL of the link clicked on.

This page gives a good example of what you are trying to do:

http://blogs.kiyut.com/tonny/2013/07/30/javafx-webview-addhyperlinklistener



回答3:

The easier way would be using the LibFX libaries WebViewHyperlinkListener : https://github.com/CodeFX-org/LibFX/blob/master/src/main/java/org/codefx/libfx/control/webview/WebViewHyperlinkListener.java