JavaFX Webview: addEventListener для кликов НЕ по гиперссылке? - PullRequest
0 голосов
/ 07 апреля 2020

В WebView есть ли способ выполнить функцию для любого щелчка НЕ ​​по данной гиперссылке?

Я пытался добавить обработчик событий в WebView, чтобы всегда выполнять функцию, а затем добавить событие слушатель гиперссылок в попытке использовать событие. Однако event.preventDefault() и event.stopPropagation() на самом деле не останавливают событие, поэтому функция по-прежнему выполняется при нажатии гиперссылки.

В этом примере сообщение по-прежнему печатается при нажатии гиперссылки:

import javafx.application.Application;
import javafx.concurrent.Worker;
import javafx.scene.Scene;
import javafx.scene.input.MouseEvent;
import javafx.scene.layout.VBox;
import javafx.scene.web.WebView;
import javafx.stage.Stage;
import org.w3c.dom.Document;
import org.w3c.dom.NodeList;
import org.w3c.dom.events.EventListener;
import org.w3c.dom.events.EventTarget;

public class Main extends Application {
    public static void main(String[] args) { launch(args); }

    public void start(Stage primaryStage) {
        // Setup the WebView
        WebView webView = new WebView();
        String content = "<br>some text<br> a link: <a href='www.google.com'>google</a></body>";
        webView.getEngine().loadContent(content);

        // Add the hyperlink listener
        webView.getEngine().getLoadWorker().stateProperty().addListener(
                (o, old, state) -> {
                    if (state != Worker.State.SUCCEEDED) { return; }

                    // Create the event listener
                    EventListener listenerA = event -> {
                        System.out.println("Attempting to block the click");
                        // Doesn't actually block the click
                        event.preventDefault();
                        event.stopPropagation();
                    };

                    Document doc = webView.getEngine().getDocument();
                    // Add event handler to <a> hyperlinks.
                    NodeList nodeList = doc.getElementsByTagName("a");
                    for (int i = 0; i < nodeList.getLength(); i++) {
                        EventTarget hyperlink = (EventTarget) nodeList.item(i);
                        hyperlink.addEventListener("click", listenerA, true);
                    }
                });
        // Add the click listener
        webView.addEventHandler(MouseEvent.MOUSE_CLICKED,
                event -> System.out.println("I want this to be printed only when a click occurs outside an hyperlink"));

        // Setup the scene
        VBox vBox = new VBox(webView);
        Scene scene = new Scene(vBox, 960, 600);
        primaryStage.setScene(scene);
        primaryStage.show();
    }
}

Я пытаюсь сделать это, потому что я использую WebView в качестве прозрачного наложения для моего Swing UI; У меня есть клики, перенаправленные на компоненты Swing, но я не хочу переадресовывать клики на Swing, если пользователь нажимает гиперссылку с наложением.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...