gpt4 book ai didi

具有 contenteditable 的 Webview 无法以编程方式聚焦

转载 作者:行者123 更新时间:2023-12-02 15:30:24 25 4
gpt4 key购买 nike

在用户首次单击该控件之前,尝试在 WebView 上执行 requestFocus() 不会起作用。

我知道这一定是可能的,因为 htmlEditor 可以通过这种方式聚焦(并且我怀疑它是基于可内容编辑的 WebView)。

我正在使用带有“contenteditable”的 webview 编写自己的专用 htmlEditor,并且我真的希望能够像使用标准 htmlEditor 一样集中精力。

我相信这一定是 Javafx 的问题,我已经将其提交给 Jira,但我想知道是否有人能想到解决方法。

更新:jira 中的问题编号:RT-21695

简短的演示代码:

/* Demo webview */

public class WebViewConteneditableDemo extends Application {


String initialEditview = "<html><head>"
+ "</head><body contenteditable='true'>"
+"</body></html>";

/**
* @param args the command line arguments
*/
public static void main(String[] args) {
launch(args);
}

@Override
public void start(Stage primaryStage) {
primaryStage.setTitle("Webview focus demo");


final WebView editor = new WebView();

Button btn = new Button();
btn.setText("Test Webview focus");
btn.setOnAction(new EventHandler<ActionEvent>() {

@Override
public void handle(ActionEvent event) {
editor.requestFocus();
}
});

BorderPane root = new BorderPane();
root.setTop(btn);

root.setCenter(editor);
editor.getEngine().loadContent(initialEditview);

primaryStage.setScene(new Scene(root, 500, 450));
primaryStage.show();
}

}

最佳答案

requestFocus api只是请求焦点,并不保证焦点。

有时,其他 JavaFX 控件的内部实现会在您请求焦点之前或之后请求焦点,这最终会导致您的 requestFocus 调用没有任何效果。

通常,您可以通过将 requestFocus 调用包装在 Platform.runLater 中来使其生效。或使用 TimelineKeyFrame它会在延迟后调用 requestFocus。

如果这些都不起作用,那么 WebView 的 requestFocus 处理中可能存在错误,JavaFX 团队可以在您提交的 jira 上下文中解决该错误。

更新

问题中示例代码的具体问题是,尽管 WebView 获得了焦点,但 WebView 中的可编辑内容元素并未获得焦点。

我尝试仅加载示例代码 <html><head></head><body contenteditable='true'></body></html> 中的 html进入 firefox,它的行为与 JavaFX WebView 完全相同(即,可编辑内容元素在单击之前不会获得焦点)。所以我不认为这是 WebView 的问题。

要获得可编辑元素的焦点,您需要在需要焦点时执行一些脚本,例如在 javascript onload Hook <body onLoad='document.body.focus();' contenteditable='true'/>

这是一个可执行示例应用程序,演示了对 JavaFX WebView 中可内容编辑元素的焦点行为的编程控制:

import javafx.application.Application;
import javafx.beans.binding.Bindings;
import javafx.event.*;
import javafx.scene.Scene;
import javafx.scene.control.*;
import javafx.scene.layout.*;
import javafx.scene.web.WebView;
import javafx.stage.Stage;

public class WebViewEditable extends Application {
String content = "<body bgcolor='cornsilk' onLoad='document.body.focus();' contenteditable='true'/>";
public static void main(String[] args) { launch(args); }
@Override public void start(Stage stage) {
final WebView editor = new WebView();
editor.getEngine().loadContent(content);

Button webviewFocusButton = new Button("Focus on WebView");
webviewFocusButton.setOnAction(new EventHandler<ActionEvent>() {
@Override public void handle(ActionEvent event) {
editor.getEngine().executeScript("document.body.focus()");
editor.requestFocus();
}
});
Button selfFocusButton = new Button("Focus on this Button");

Label focusLabel = new Label();
focusLabel.textProperty().bind(Bindings
.when(editor.focusedProperty())
.then("WebView has the focus.")
.otherwise("WebView does not have the focus.")
);
focusLabel.setMaxWidth(Double.MAX_VALUE);
focusLabel.setStyle("-fx-background-color: coral; -fx-padding: 5;");

BorderPane layout = new BorderPane();
layout.setTop(HBoxBuilder.create().spacing(10).children(webviewFocusButton, selfFocusButton).style("-fx-padding: 10; -fx-background-color: palegreen").build());
layout.setCenter(editor);
layout.setBottom(focusLabel);
stage.setScene(new Scene(layout));
stage.show();
}
}

关于具有 contenteditable 的 Webview 无法以编程方式聚焦,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10685395/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com