总结oninput、onchange与onpropertychange事件的用法和区别

前端页面开发的很多情况下都需要实时监听文本框输入,比如腾讯微博编写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:


[javascript]  view plain  copy
  1. var testinput = document.createElement('input');      
  2. if('oninput' in testinput){  
  3.     object.addEventListener("input",fn,false);  
  4. }else{  
  5.     object.onpropertychange = fn;  
  6. }  

例2、对所有ie使用onpropertychange,其他浏览器用oninput:


[javascript]  view plain  copy
  1. var ie = !!window.ActiveXObject;  
  2. if(ie){  
  3.     object.onpropertychange = fn;  
  4. }else{  
  5.     object.addEventListener("input",fn,false);  
  6. }  

汇总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不会触发。 

下面引用一篇译文:

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特性检测代码要好些吧。

oninput事件

  1. <p>向文本框中尝试输入即可触发事件。</p>  
  2. 输入您的名字: <input type="text" value="Mickey" οninput="myFunction()">  
  3. <script>  
  4. function myFunction() {  
  5.     alert("input 输入框值已发生变化。");  
  6. }  
  7. </script>  
<p style= "border: 0px; margin-top: 0px; margin-bottom: 0px; padding-top: 0px; padding-bottom: 0px; line- height: 2em; font-family: " Microsoft Yahei ", " Helvetica Neue ", Helvetica, Arial, sans- serif; color: rgb(51, 51, 51);" >oninput 事件在用户输入时触发。<span style= "line-height: 2em;" >该事件 在 <input> 或 <textarea> 元素的值发生改变时触发。</span></p><span style= "color: rgb(51, 51, 51); font- family: " Microsoft Yahei ", " Helvetica Neue ", Helvetica, Arial, sans-serif; line-height: 24px;" > oninput 事件 在元素值 发生变化是立即触发, onchange 在元素失去焦点时触发。另外一点不同是 onchange 事件也可以作用 于 <keygen> 和 <select> 元素。</span> 


译文部分转自:http://blog.163.com/jinlu_hz/blog/static/1138301522011431102044154/
译文原地址:http://mathiasbynens.be/notes/oninput

译文原作者:mathias

转自:http://blog.csdn.net/freshlover/article/details/39050609 仅为学习,多谢作者

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值