以往我们实现input的输入监听用到的无非是onkeyup、onkeydown、onchange,但是这些都有着一些不好的用户体验。比如onchange事件只在键盘或者鼠标操作改变对象属性,且失去焦点时触发,脚本触发无效;而onkeydown、onkeyup在处理复制、粘贴、拖拽、长按键(按住键盘不放)等细节上并不完善。
onpropertychange属性可在某些情况下解决上面存在的问题,不用考虑是否失去焦点,不管js操作还是键盘鼠标手动操作,只要HTML元素属性发生改变即可立即捕获到。遗憾的是,onpropertychange为IE专属的。其他浏览器下如果想要实现这一实时监听的需求,就要用到HTML5中的标准事件oninput,不过IE9以下的浏览器是不支持oninput事件的。如果要兼容IE9以下浏览器,就需要oninput和onpropertychange一起使用。
如下实例:
<!doctype html>
<html>
<head>
<meta charset="UTF-8">
<meta name="Author" content="神棍、Falost">
<title>hello world!</title>
<style type="text/css">
#box{
width:100%;
height:30px;
}
</style>
</head>
<body>
<div id="box"></div>
<input type="text" oninput="Monitor(this)" onpropertychange="Monitor(this)"/>
<script type="text/javascript">
function Monitor(t){
console.log(t.value)
var box = document.getElementById('box')
box.innerHTML = '你当前输入的是:'+ t.value
}
</script>
</body>
</html>
实时监听input中输入内容的变化。
oninput的定义和用法
oninput 事件在用户输入时触发。
该事件在 <input> 或 <textarea> 元素的值发生改变时触发。
提示: 该事件类似于 onchange 事件。不同之处在于 oninput 事件在元素值发生变化是立即触发, onchange 在元素失去焦点时触发。另外一点不同是 onchange 事件也可以作用于 <keygen> 和 <select> 元素。
浏览器支持
表格中的数字表示支持该事件的第一个浏览器的版本号。
事件 | Chrome | IE | Firefox | Safari | Opera |
---|---|---|---|---|---|
oninput | Yes | 9.0 | 4.0 | 5.0 | Yes |
技术细节
是否支持冒泡: | Yes |
---|---|
是否可以取消: | No |
事件类型: | Event |
支持的 HTML 标签: | <input type=”password”>, <input type=”search”>, <input type=”text”> 和 <textarea> |
一个基于JQuery的oninput和onpropertychanged的使用案例,实时监听textarea中的输入字数:
<!doctype html>
<html>
<head>
<meta charset="UTF-8">
<meta name="Author" content="神棍、Falost">
<title>hello world!</title>
<script type="text/javascript" src="http://localhost:3000/static/libs/jquery/dist/jquery.min.js"></script>
<style type="text/css">
.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;
}
</style>
</head>
<body>
<div class="box">
<div class="commentTextArea">
<textarea name="comment" id="comments" class="comments" maxlength="300"
placeholder="看点槽点,不吐不快!别憋着,马上大声说出来吧!"></textarea>
</div>
<div class="commentTextCount">
<span class="count">0</span>
<span>/300</span>
</div>
</div>
<script type="text/javascript">
("#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')
}
})
}
</script>
</body>
</html>
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不会触发。
转载请注明:Falost的小窝 » HTML5标准事件oninput实现输入检测