input 框中debounce_input搜索框如何实现防抖?如何实现中文输入?

input搜索框相信大家在开发中用的很多,那么input框输入的事件大家用的是什么呢?大家肯定都使用过oninput或者onchange事件。

oninput

搜索框输入事件,是DOM0级别事件,只要用户输入内容就会触发,即便输入中文输入法还没有将中文汉字填入搜索框内也会一直触发。事件绑定代码示例如下

// DOM0级别事件绑定

dom.oninput = function (e) {

console.log(e);

}

// DOM2级别事件绑定

dom.addEventListenter('input', function (e) {

console.log(e);

});

onchange

搜索框内容变更事件,也是DOM0级别事件,在搜索框内容改变,并且失去焦点的时候触发。注意,它是在失去焦点时才触发的。事件绑定代码如下

// DOM0级别事件绑定

dom.onchange = function (e) {

console.log(e);

}

// DOM2级别事件绑定

dom.addEventListener('change', function (e) {

console.log(e);

});

输入中文如何实现

想必大家发现了,如果我要输入中文该怎么办呢?当在输入法中打字时,我们不希望不断的触发input事件,而是希望在打完并且选择了相应的汉字时才触发事件。

此时我们可以使用compositionstart、compositionupdate和compositionend事件来实现。

compositionstart:在中文输入的开始时触发一次

compositionupdate:在中文输入过程中不断触发,效果类似oninput事件

compositionend:在输入完毕通过输入法选择中文汉字填入搜索框时触发一次

注意:这三个事件是DOM2级别事件,无法通过dom.oncompositionstart = function (e) {}的形式添加,只能通过addEventListener('compositionstart', function (e) {})添加监听处理。可以在start和end事件中,分别在dom对象上添加锁的方式,来限制oninput事件的执行,甚至可以不需要监听input事件。示例如下

var dom = document.getElementById('xx');

dom.oninput = function (e) {

if (!e.target.composing) {

console.log('input');

}

console.log(e);

}

dom.onchange = function (e) {

console.log(e);

}

dom.addEventListener('change', function (e) {

console.log('changed');

});

dom.addEventListener('compositionstart', function (e) {

console.log('start');

e.target.composing = true;

});

dom.addEventListener('compositionend', function (e) {

console.log('end');

e.target.composing = false;

// 手动触发input事件

var event = new Event('input');

e.target.dispatchEvent(event);

});

xx.addEventListener('compositionupdate', function (e) {

console.log('update');

});

至于防抖函数,在我的其他文章内有讲到,不再赘述。

function debounce(fn, delay) {

let timerid;

return function (...args) {

if (timerid) {

clearTimeout(timerid);

timerid = null;

}

timerid = setTimeout(() => {

fn(...args);

timerid = null;

}, delay);

}

}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值