В 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, если пользователь нажимает гиперссылку с наложением.