input 事件兼容处理以及中文输入法优化

发布于 2021-11-13 15:07:33 字数 1757 浏览 1178 评论 0

oninput 是 HTML5 的标准事件,对于检测 textarea、input:text、input:password 和 input:search 这几个元素通过用户界面发生的内容变化非常有用,在内容修改后立即被触发,不像 onchange 事件需要失去焦点才触发。 oninput 事件兼容为 ie9+,ie下可以 onpropertychange 事件不是本节内容。

bug

  1. IE9下不触发退格/删除/剪切输入事件(IE9 doesn't fire input event on backspace/del/cut)
  2. 当用户当前输入法状态是中文时,在未选择词组到输入框也会触发事件

解决

为元素添加 cut, keyup 事件例:


_.on(el, 'input', this.listener)

// IE9 doesn't fire input event on backspace/del/cut
if (_.isIE9) {
    this.onCut = function() {
        _.nextTick(self.listener)
    }
    this.onDel = function(e) {
        if (e.keyCode === 46 || e.keyCode === 8) {
            self.listener()
        }
    }
    _.on(el, 'cut', this.onCut)
    _.on(el, 'keyup', this.onDel)
}

来自于 vuejs

中文输入优化,我们想要的结果是只有词组进入了输入框才会触发事件

我们可以使用两个较新的事件来达到预期的效果:compositionstart 和 compositionend,也是 ie9+ 的兼容最合适不过。

MDN

compositionstart

当浏览器有非直接的文字输入时,compositionstart 事件会以同步模式触发。

compositionend

当浏览器是直接的文字输入时,compositionend会以同步模式触发。

看了两个事件就明白,为元素添加这个两个事件,做一个开关,如下:

<input type="text" id="person" />
var node = document.querySelector('#person');
var cpLock = false;
node.addEventListener('compositionstart', function(){
    cpLock = true;
})
node.addEventListener('compositionend', function(){
    cpLock = false;
})
node.addEventListener('input', function(){
    if(!cpLock)console.log(this.value);
});

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据

关于作者

孤独患者

暂无简介

0 文章
0 评论
536 人气
更多

推荐作者

lioqio

文章 0 评论 0

Single

文章 0 评论 0

禾厶谷欠

文章 0 评论 0

alipaysp_2zg8elfGgC

文章 0 评论 0

qq_N6d4X7

文章 0 评论 0

放低过去

文章 0 评论 0

    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文