如何检测主应用程序对 JavaFX WebView 的点击?

How can I detect clicks on a JavaFX WebView from the main application?

目前,我通过向 HTML 内容添加一个 Javascript 事件处理程序来实现此目的,该事件处理程序根据单击的项目设置全局变量:

<script>
  var clicked="";
</script>

<span onmousedown="clicked='me';">me</span>

然后在主应用程序中我在 webview 的鼠标点击处理程序中查询这个变量的内容:

webview.setOnMouseClicked(new EventHandler[MouseEvent]{
  def handle(mouseEvent:MouseEvent){
    if(mouseEvent.getEventType().toString()=="MOUSE_CLICKED"){

       val clicked=webview.executeScript("clicked").toString()

}}})

这恰好有效,但感觉像是黑客攻击。 Webview 是否可以通过合法的方式请求应用程序根据被点击的元素刷新其内容?

由于我不会Scala,所以只能提供一个Java中的方法,但是你应该可以想出如何将它转换成Scala。 在 Java(或您的情况下为 Scala)代码和 JavaScript 之间注册一个桥梁。 Oracle 在 this article 中描述了基础知识。 Java您页面中的脚本可以调用应用程序,通知它单击了某个按钮:

public class MyBridge {
  public void callbackFromJavaScript(String what) {
     ...
  }
}

JSObject jsobj = (JSObject) webEngine.executeScript("window");
jsobj.setMember("java", new MyBridge());

然后你可以在点击一个元素时进行调用,callbackFromJavaScript将被执行:

<span onmousedown="java.callbackFromJavaScript('me');">me</span>

然后您可以从您的 callbackFromJavaScript 轻松调用 JavaScript 函数并传递一个对象(例如 JSON),JS 函数将更新页面,或者您可以载入完全不同的内容。