前端页面开发的很多情况下都需要实时监听文本框输入,比如腾讯微博编写140字的微博时输入框hu9i动态显示还可以输入的字数。过去一般都使用onchange/onkeyup/onkeypress/onkeydown实现,但是这存在着一些不好的用户体验。比如onchange事件只在键盘或者鼠标操作改变对象属性,且失去焦点时触发,脚本触发无效;而onkeydown/onkeypress/onkeyup在处理复制、粘贴、拖拽、长按键(按住键盘不放)等细节上并不完善。
onpropertychange属性可在某些情况下解决上面存在的问题,不用考虑是否失去焦点,不管js操作还是键盘鼠标手动操作,只要HTML元素属性发生改变即可立即捕获到。遗憾的是,onpropertychange为IE专属的。其他浏览器下如果想要实现这一实时监听的需求,就要用到HTML5中的标准事件oninput,不过IE9以下的浏览器是不支持oninput事件的。
所以我们需要综合oninput和onpropertychange二者来实现文本区域实时监听的功能。举例如下:
例1、对支持oninput的浏览器用oninput,其他浏览器(IE6/7/8)使用onpropertychange:
var testinput = document.createElement('input'); if('oninput' in testinput){ object.addEventListener("input",fn,false); }else{ object.onpropertychange = fn; }
var ie = !!window.ActiveXObject; if(ie){ object.onpropertychange = fn; }else{ object.addEventListener("input",fn,false); }
汇总onchange onpropertychange 和oninput事件的区别:
下面引用一篇译文:
HTML5将oninput事件标准化了,该事件用来检测用户的输入状态。当然,通过使用onkeydown
或者onkeyup
作为代替也是可以的。这些事件设计本意也并非如此,参见详情。
oninput
,其中包括IE9。对于那些老式浏览器,在不支持该事件时用
keydown
作为优雅降级。不幸的是,检测浏览器对该
oninput
事件的支持性并不容易。假定浏览器支持
oninput
,那么以下这段js代码的返回值为
true
,否则为
false
。'oninput' in document.createElement('input')
这段代码在大多数浏览器中正常运行,除了
Firefox(
见 bug #414853
),故仍旧需要 为oninput作浏览器特性检测
。除此以外就没必要为其他浏览器作特性检测了,只需为
input
和
keydown
绑定事件,并在
oninput
事件触发之后删除
onkeydown
即可。示例如下:someElement.oninput = function() { el.onkeydown = null; // Your code goes here }; someElement.onkeydown = function() { // Your code goes here }
keydown
事件仅会被触发一次(在oninput
事件触发前),之后再触发oninput
。虽然并不完美,但总比写上一大堆oninput
特性检测代码要好些吧。
译文部分转自:http://blog.163.com/jinlu_hz/blog/static/1138301522011431102044154/
译文原地址:http://mathiasbynens.be/notes/oninput
译文原作者:mathias