当前位置: 首页 > 知识库问答 >
问题:

JavaFX WebView中的Javascript

宗涵蓄
2023-03-14

我是Java和JavaFX的新手,我只是想知道JavaFX的webview是否可以运行javascript本身,除了它与java代码的通信之外。例如,当窗口加载时,我可以在webview中运行javascript警报语句,并在webview中实际获得警报,就像在普通浏览器中一样。我知道我可以通过以下方式使用我的java代码捕获此警报事件

<代码>Web引擎。setOnAlert设置

但我实际上希望javascript事件在webview窗口本身中发生,就像在普通浏览器中一样。

我之所以问这个简单的问题,是因为我正在使用一个带有文本区域的webview,我想在其中启用拼写检查。我有一个javascript拼写检查器,它在普通浏览器中工作得很好,当我键入错误的内容时,会得到红色下划线,但我希望它也能在JavaFX webview中工作。

我很感激我能得到的任何帮助!

共有1个答案

拓拔意
2023-03-14

WebView JavaScript回调处理程序示例

下面是一些基于JavaScript触发器命令显示JavaFX对话框的示例代码。示例代码用于JavaScript确认处理程序,但警报处理程序的代码的功能类似。

在示例屏幕截图中,左侧的黄色条将显示一个JavaFX标签,该标签基于从覆盖屏幕其余部分的WebView调用的JavaScript函数触发的确认对话框的结果。

确认对话框在JavaFX中呈现在WebView的顶部,防止在显示对话框时与WebView交互。确认对话框的样式只是一个示例,它可以按照您希望的任何方式使用css进行样式设置,布局也可以在代码中更改(或者您可以在FXML标记中定义对话框布局,如果您愿意的话)。

WebViewConfirm。Java语言

import javafx.application.Application;
import javafx.beans.property.BooleanProperty;
import javafx.beans.property.SimpleBooleanProperty;
import javafx.event.*;
import javafx.scene.Node;
import javafx.scene.Scene;
import javafx.scene.control.*;
import javafx.scene.effect.BoxBlur;
import javafx.scene.input.MouseEvent;
import javafx.scene.layout.*;
import javafx.scene.paint.Color;
import javafx.scene.web.WebView;
import javafx.stage.*;
import javafx.util.Callback;

/**
 * Demonstrates a modal WebView confirm box in JavaFX.
 * Dialog is rendered upon a blurred background.
 * Dialog is translucent.
 * Requires JavaFX 2.2
 * To test, run the program, then click the "Try it" button in the Result textarea.
 */
public class WebViewConfirm extends Application {
  public static void main(String[] args) { launch(args); }
  @Override public void start(final Stage primaryStage) {
    // initialize the stage
    primaryStage.setTitle("Modal Confirm Example");
    final WebView webView = new WebView();
    webView.getEngine().load("http://www.w3schools.com/js/tryit.asp?filename=tryjs_confirm");

    // layout the stage - a vbox to show confirmation results and a webview to generate confirmations.
    final VBox confirmationResults = new VBox();
    confirmationResults.getStyleClass().add("confirmation-results");
    confirmationResults.setMinWidth(150);
    HBox layout = new HBox();
    layout.getChildren().addAll(confirmationResults, webView);
    primaryStage.setScene(new Scene(layout));
    primaryStage.show();
    primaryStage.getScene().getStylesheets().add(getClass().getResource("modal-dialog.css").toExternalForm());

    // show the confirmation dialog each time a new page is loaded and
    // record the confirmation result.
    webView.getEngine().setConfirmHandler(new Callback<String, Boolean>() {
      @Override public Boolean call(String msg) {
        Boolean confirmed = confirm(primaryStage, msg);
        confirmationResults.getChildren().add(new Label("Confirmed? " + confirmed));
        return confirmed;
      }
    });
  }

  private Boolean confirm(final Stage parent, String msg) {
    final BooleanProperty confirmationResult = new SimpleBooleanProperty();
    // initialize the confirmation dialog
    final Stage dialog = new Stage(StageStyle.TRANSPARENT);
    dialog.initOwner(parent);
    dialog.initModality(Modality.WINDOW_MODAL);
    dialog.setScene(
      new Scene(
        HBoxBuilder.create().styleClass("modal-dialog").children(
          LabelBuilder.create().text(msg).build(),
          ButtonBuilder.create().text("OK").defaultButton(true).onAction(new EventHandler<ActionEvent>() {
            @Override public void handle(ActionEvent actionEvent) {
              // take action and close the dialog.
              confirmationResult.set(true);
              parent.getScene().getRoot().setEffect(null);
              dialog.close();
            }
          }).build(),
          ButtonBuilder.create().text("Cancel").cancelButton(true).onAction(new EventHandler<ActionEvent>() {
            @Override public void handle(ActionEvent actionEvent) {
              // abort action and close the dialog.
              confirmationResult.set(false);
              parent.getScene().getRoot().setEffect(null);
              dialog.close();
            }
          }).build()
        ).build()
        , Color.TRANSPARENT
      )
    );

    // allow the dialog to be dragged around.
    final Node root = dialog.getScene().getRoot();
    final Delta dragDelta = new Delta();
    root.setOnMousePressed(new EventHandler<MouseEvent>() {
      @Override public void handle(MouseEvent mouseEvent) {
        // record a delta distance for the drag and drop operation.
        dragDelta.x = dialog.getX() - mouseEvent.getScreenX();
        dragDelta.y = dialog.getY() - mouseEvent.getScreenY();
      }
    });
    root.setOnMouseDragged(new EventHandler<MouseEvent>() {
      @Override public void handle(MouseEvent mouseEvent) {
        dialog.setX(mouseEvent.getScreenX() + dragDelta.x);
        dialog.setY(mouseEvent.getScreenY() + dragDelta.y);
      }
    });

    // style and show the dialog.
    dialog.getScene().getStylesheets().add(getClass().getResource("modal-dialog.css").toExternalForm());
    parent.getScene().getRoot().setEffect(new BoxBlur());
    dialog.showAndWait();

    return confirmationResult.get();
  }

  // records relative x and y co-ordinates.
  class Delta { double x, y; }
}

模态对话框。css

/**
 * modal-dialog.css
 * place in same directory as WebViewConfirm.java
 * ensure your build system copies the file to your build output directory
 */

.root {
  -fx-glass-color: rgba(95, 158, 160, 0.9);
}

.modal-dialog {
  -fx-padding: 20;
  -fx-spacing: 10;
  -fx-alignment: center;
  -fx-font-size: 20;
  -fx-background-color: linear-gradient(to bottom, derive(-fx-glass-color, 20%), -fx-glass-color);
  -fx-border-color: derive(-fx-glass-color, -20%);
  -fx-border-width: 5;
  -fx-background-insets: 12;
  -fx-border-insets: 10;
  -fx-border-radius: 6;
  -fx-background-radius: 6;
}

.modal-dialog:pressed {
  -fx-cursor: move;
}

.modal-dialog .button:pressed {
  -fx-cursor: default;
}

.confirmation-results {
  -fx-background-color: cornsilk;
  -fx-padding: 5;
}

您问题的可能答案

我不太清楚你的问题,但我认为如果你弹出一个ControlsFX对话框,你会实现你想要的。您可以使用标准对话框(其功能类似于Internet Explorer的JavaScript警报对话框)或轻量级对话框(其功能类似于Firefox的JavaScript警报对话框)-有关详细信息,请参阅ControlsFX功能页面。

ControlsFX基于Java 8,但对于JavaFX 2.2,有许多关于在JavaFX中显示对话框的StackOverflow主题(例如:如何在JavaFX 2.0中创建和显示公共对话框(错误、警告、确认))。上面的示例代码是JavaFX 2.2中对话框用法的一个示例

对你问题中提出的补充意见的评论

如果JavaFX的webview可以在与java代码通信之外运行javascript

是的,WebView可以处理JavaScript。

例如,我可以在加载窗口时在webview中运行javascript警报语句,并在webview中实际获得警报,就像在普通浏览器中一样。

是的,如果您为WebView设置了警报处理程序,使其功能类似于“普通浏览器”,则在接收JavaScript警报命令时会弹出一个对话框。请注意,“普通浏览器”不会基于JavaScript警报功能修改网页文档对象模型,而是弹出一个本机对话框-该对话框实际上不是网页的一部分。

实际上,我希望javascript事件像在普通浏览器中一样发生在webview窗口中。

“普通”浏览器根据其UI模型处理警报的方式不同。例如,在Firefox中,警报对话框将显示在当前浏览器选项卡窗口中,在Internet Explorer中,警报对话框将显示在Internet Explorer窗口的上方。JavaFX警报处理程序非常灵活,您可以根据需要处理警报。

 类似资料:
  • 本文向大家介绍jQuery中的read和JavaScript中的onload函数的区别,包括了jQuery中的read和JavaScript中的onload函数的区别的使用技巧和注意事项,需要的朋友参考一下 在JavaScript中,onload函数是最经常使用的,几乎涉及到JavaScript的童鞋都少不了要接触它。这个函数的作用就是等待网页完全装载完了以后再去执行代码块内的语句,因为按照文档流

  • 问题内容: 如何在JavaScript中检查字符串是否以特定字符结尾? 示例:我有一个字符串 我想知道该字符串是否以结尾。我该如何检查? JavaScript中是否有方法? 我有一个解决方案是获取字符串的长度并获取最后一个字符并进行检查。 这是最好的方法还是还有其他方法? 问题答案: 该答案最初发布于2010年(六年前),因此请注意以下有见地的评论: Shauna -Google员工的更新-看起来

  • 本文向大家介绍JavaScript中的Object.assign()?,包括了JavaScript中的Object.assign()?的使用技巧和注意事项,需要的朋友参考一下 Object.assign() 此方法用于将一个或多个源对象复制到目标对象。因为它在源上使用“ get”,在目标上使用“ Set”,所以它会调用getter和setter。它返回目标对象,该对象具有从目标对象复制的属性和值。

  • 问题内容: 我有一个现有的网络服务,可以使用AES进行加密和解密,现在我必须以与Java相同的方式进行加密,但是要使用javascript。我已经阅读了有关在javascript中执行此操作的所有主题,但尚未找到任何有用的解决方案。Javascript总是以不同的方式加密,我找不到原因。 这是现有的java代码: 这是我倾向于使用的javascript代码,但是提供了不同的加密(CryptoJS)

  • 作为一个示例,让我们假设在一个项目中,我在我的主要活动中使用了一个WebView实例,加载一个本地HTML文件: 我有一个JavascriptInterface也,从那里我想调用在我的超文本标记语言文件: 到目前为止,我想明白为什么这行不通了。从我从这样或这样的答案中了解到的,尤其是在WebView的留档中,我知道JavascriptInterface和WebView在不同的线程上运行,所以像这样

  • 我目前正在Javascript上实现RSA-OAEP加密,并在Java上实现解密。 我的javascript代码有以下内容 我还有一个Java函数来解密文本。假设“rsoaepciphertext”是字符串文本。 然而,我在Java上不断遇到解密错误,目前仍停留在这一部分,我在Javascript上的加密是否有任何错误?

  • 问题内容: 我是角度框架的新手。这是我的情况,我想在一段时间后更改$ scope.variable,所以我使用了javascript 方法。 此代码对我不起作用。我曾经使这段代码起作用。 后来我才知道angular本身有一个$ timeout服务,可以完成相同的工作。 如何比较JavaScript服务的性能? 为什么我们应该使用而不是?? 请给我一些示例和使用它的理由,以显示性能。 谢谢 :) 问

  • 问题内容: 我正在尝试编写一个执行以下操作的函数: 将整数数组作为参数(例如[1,2,3,4]) 创建所有[1,2,3,4]可能排列的数组,每个排列的长度为4 下面的函数(我在网上找到了它)通过将字符串作为参数并返回该字符串的所有排列来实现 我无法弄清楚如何对其进行修改以使其与整数数组一起工作,(我认为这与某些方法在字符串上的处理方式与在整数上的处理方式不同有关,但是我不确定。 ..) 注意:我正