Vaadin 14、Safari 13:带有输入事件侦听器的文本字段不会触发 ValueChangeListener

Vaadin 14, Safari 13: Textfield with input event listener does not trigger ValueChangeListener

在 Vaadin 14.3.2 应用程序中,我创建了自己的数字字段来格式化(数字)输入。

因此我创建了一个 class 这样的:

@Tag("my-number-field")
@JsModule("./js/my-number-field.js")
public class MyNumberField extends TextField {
[...]
}

和 my-number-field.js(见下文)中的一些 JavaScript 进行格式化。 这种格式在 Chromium、Chrome、Edge、Firefox 以及 Safari 13.1.3 中工作正常。

但是在 Safari 中,发生这种情况时不会在服务器端触发 ValueChangeListener:

inputElement.value = [newValue];

这是我的代码的一些最小片段,它仍然显示了行为:

(function() {

customElements.whenDefined('vaadin-text-field').then(() => {
    class MyNumberField extends customElements.get('vaadin-text-field') {

        constructor() {
            super();
        }

        static get is() {
            return 'my-number-field';
        }

        ready() {
            super.ready();
            this.addEventListener('input', this.formatInput, true);
        }
        
        formatInput (event) {
            const inputElement = this.inputElement;
            const originalInputValue = inputElement.value;
            // this is the re-formatting
            inputElement.value=originalInputValue+'0';
        };

    }
    customElements.define(MyNumberField.is, MyNumberField);
});

})();

当我注释行 inputElement.value = [newValue]; 时,服务器端的 ValueChangeListener 获取输入的值。激活该行后,ValueChangeListener 不会获得 entered/newly 格式的值。

有没有在 Safari 中也触发 ValueChangeListener 的技巧?

更新(也许是我的案例的解决方案):将 MyNumberField 的 ValueChangeMode 设置为 ON_BLUR 有效:

public MyNumberField(...) {
    this.setValueChangeMode(ValueChangeMode.ON_BLUR);
}

EAGER 也有效。 LAZY 也有效。超时有效。

只有 ON_CHANGE 不起作用,它在 TextField 构造函数中设置为默认值。