以往我们实现input的输入监听用到的无非是onkeyup、onkeydown、onchange,但是这些都有着一些不好的用户体验。比如onchange事件只在键盘或者鼠标操作改变对象属性,且失去焦点时触发,脚本触发无效;而onkeydown、onkeyup在处理复制、粘贴、拖拽、长按键(按住键盘不放)等细节上并不完善。
onpropertychange属性可在某些情况下解决上面存在的问题,不用考虑是否失去焦点,不管js操作还是键盘鼠标手动操作,只要HTML元素属性发生改变即可立即捕获到。遗憾的是,onpropertychange为IE专属的。其他浏览器下如果想要实现这一实时监听的需求,就要用到HTML5中的标准事件oninput,不过IE9以下的浏览器是不支持oninput事件的。如果要兼容IE9以下浏览器,就需要oninput和onpropertychange一起使用。
如下实例:
hello world!
#box{
width:100%;
height:30px;
}
function Monitor(t){
console.log(t.value)
var box = document.getElementById('box')
box.innerHTML = '你当前输入的是:'+ t.value
}
实时监听input中输入内容的变化。
oninput的定义和用法
oninput 事件在用户输入时触发。
该事件在 或 元素的值发生改变时触发。
提示: 该事件类似于 onchange 事件。不同之处在于 oninput 事件在元素值发生变化是立即触发, onchange 在元素失去焦点时触发。另外一点不同是 onchange 事件也可以作用于 和 元素。
浏览器支持
表格中的数字表示支持该事件的第一个浏览器的版本号。
事件
Chrome
IE
Firefox
Safari
Opera
oninput
Yes
9.0
4.0
5.0
Yes
技术细节
是否支持冒泡:
Yes
是否可以取消:
No
事件类型:
Event
支持的 HTML 标签:
, , 和
一个基于JQuery的oninput和onpropertychanged的使用案例,实时监听textarea中的输入字数:
hello world!
.box{
position:relative;
width:50%;
height:100px;
margin:auto;
}
.commentTextArea{
width: 100%;
height: 100%;
padding-top: 20px;
}
.comments{
width: 100%;
max-width:100%;
height: 100%;
}
.commentTextCount{
position: absolute;
top: 0;
right: 0;
}
.count_alarm{
color:red;
}
placeholder="看点槽点,不吐不快!别憋着,马上大声说出来吧!">
0
/300
$("#comments").focus(function(){
counts(this)
})
function counts(t){
$(t).on('input propertychange', function () {
var maxLength = $(t).maxLength
var counts = $(t).parent().siblings('.commentTextCount ').children(".count")
var count = $(t).val().length
counts.text(count)
if(count > maxLength){
counts.addClass('count_alarm')
}else{
counts.removeClass('count_alarm')
}
})
}
oninput事件与onpropertychange事件的区别:
oninput事件是IE之外的大多数浏览器支持的事件,在value改变时触发,实时的,即每增加或删除一个字符就会触发,然而通过js改变value时,却不会触发;onpropertychange事件是任何属性改变都会触发的,而oninput却只在value改变时触发,oninput要通过addEventListener()来注册,onpropertychange注册方式跟一般事件一样。(此处都是指在js中动态绑定事件,以实现内容与行为分离)
oninput与onpropertychange失效的情况:
(1)oninput事件:a). 当脚本中改变value时,不会触发;b).从浏览器的自动下拉提示中选取时,不会触发。
(2)onpropertychange事件:当input设置为disable=true后,onpropertychange不会触发。
如果你觉得这篇文章不错或者对你有帮助,想请我喝一杯咖啡,可以打赏