我该如何可靠地取消compositionstart事件?

3

当仅针对Google Chrome时,是否可以取消compositionstart事件?根据这个草案,它是可取消的,但是,当使用e.preventDefault()时,如下所示:

document.querySelector("textarea").addEventListener('compositionstart', (e) => {
    e.preventDefault();
});

例如,当按下´键时,Chrome仍然开始组合。

我目前有一种相当可靠的方法来阻止这种情况,即使用

document.querySelector("textarea").addEventListener('compositionstart', function() {
    this.blur();
    
    setTimeout(() => this.focus(), 0);
});
<textarea>Spam ´ here</textarea>

只要我的文本区域中不包含任何换行符,按下 ´ 键时就会“取消” compositionstart 事件。我的问题是,如果我连续几秒钟 spam ´ 键,则我的方法并不总是取消该事件,这会导致出现一个 ´
我的做法也感觉很 hacky,所以我想知道有没有一种好的、可能跨浏览器的方法来停止 compositionstart 事件?
2个回答

3
我发现防止垃圾邮件的(也是不太正规的)解决方案是将超时时间增加到20毫秒。这个超时时间应该足够短,以至于用户不会注意到模糊和重新聚焦,但它足够长,可以停止垃圾邮件。
当触发compositionstart事件时,如果我存储选择和范围,然后在模糊后重复使用它们,那么我就不会遇到最初出现的奇怪副作用。对于我的原始

这段代码在Chrome上有用,但在FireFox上不起作用。 - undefined

0
好问题。我可以绕过这个不幸的限制的另一种方法是将输入框设置为只读,只需几毫秒的时间。这种方法的优点是在我测试过的浏览器上都能正常工作,包括Chrome、Firefox和Safari(未在移动设备上测试)。以下是我的两个事件处理程序。
    onCompositionStart (e) {
      e.preventDefault() // Does not work.
      e.target.setAttribute('readonly', true)
    },
    onCompositionUpdate (e) {
      setTimeout(() => e.target.removeAttribute('readonly'), 200)
    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接