前端页面开发的非常多情况下都须要实时监听文本框输入,比方腾讯微博编写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;
}


例2、对全部ie使用onpropertychange,其它浏览器用oninput:


var ie = !!window.ActiveXObject;
if(ie){
object.onpropertychange = fn;
}else{
object.addEventListener("input",fn,false);
}


汇总onchange onpropertychange 和oninput事件的差别:




1、onchange事件与onpropertychange事件的差别: 


onchange事件在内容改变(两次内容有可能还是相等的)且失去焦点时触发;onpropertychange事件却是实时触发,即每添加或删除一个字符就会触发。通过js改变也会触发该事件。可是该事件IE专有。

 




2、oninput事件与onpropertychange事件的差别: 


oninput事件是IE之外的大多数浏览器支持的事件。在value改变时触发,实时的,即每添加或删除一个字符就会触发,然而通过js改变value时。却不会触发;onpropertychange事件是不论什么属性改变都会触发的,而oninput却仅仅在value改变时触发,oninput要通过addEventListener()来注冊,onpropertychange注冊方式跟一般事件一样。(此处都是指在js中动态绑定事件,以实现内容与行为分离) 




3、oninput与onpropertychange失效的情况: 


(1)oninput事件:a). 当脚本中改变value时。不会触发。b).从浏览器的自己主动下拉提示中选取时,不会触发。 


(2)onpropertychange事件:当input设置为disable=true后。onpropertychange不会触发。