【问题标题】:Vaadin get/set cursor position / selection start/end in TextfieldVaadin 在文本字段中获取/设置光标位置/选择开始/结束
【发布时间】:2022-01-11 12:13:03
【问题描述】:

我知道在 Vaadin7 (8) 中有一些方法可以从服务器端获取/设置文本字段的光标位置。

我正在使用 Vaadin Flow v21,但没有这样的方法。如何从服务器端同步获取/设置光标位置?使用一些javascript设置它看起来可以正常工作,但我无法读取实际的光标位置,因为它只是异步的。如何同步?

我试着这样读:

public int getSelectionStart() throws InterruptedException
{
    Future<Integer> value = UI.getCurrent().getPage().executeJs(
            "return $0.shadowRoot.querySelector('[part=\"value\"]').selectionStart;"
            , getElement()).toCompletableFuture(Integer.class);

    final int[] val = new int[1];

    Thread t = new Thread(() ->
    {
        Integer result = null;
        try
        {
            result = value.get();
        }
        catch (Exception e)
        {
            e.printStackTrace();
        }
        val[0] = result == null ? 0 : result;
    });

    t.start();
    t.join();

    return val[0];
};

但是上面的方法给了我一个例外,正在进行的UI会话请求还没有关闭,所以基本上它不能执行javascript,除非我结束请求。

这就是我设置光标位置的方式,这似乎有效,因为我不想返回任何返回值,所以结束请求将执行脚本并设置正确的光标位置。

public void setSelectionStart(int pos)
{
    UI.getCurrent().getPage().executeJs("$0.shadowRoot.querySelector('[part=\"value\"]').setSelectionRange($1, $1);", getElement(), pos);
}

感谢任何帮助/建议!

【问题讨论】:

    标签: vaadin vaadin-flow vaadin21


    【解决方案1】:

    我希望 RPC 返回值的文档可以在这里提供帮助:https://vaadin.com/docs/latest/flow/element-api/client-server-rpc/#return-values

    【讨论】:

    • 好吧,@ClientCallable 可能很有用,如果我可以在文本字段的客户端设置一些 javascript 事件,那么每个按键都应该调用服务器端方法来设置当前插入符号位置。但由于我也在使用按键服务器端事件,所以我必须测试哪个事件首先出现。可能我必须在 keydown 上注册 javascript,因为它应该在按键之前触发。谢谢!
    猜你喜欢
    • 2011-04-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-10
    • 1970-01-01
    • 1970-01-01
    • 2021-02-05
    相关资源
    最近更新 更多