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

原创 2014年09月04日 12:36:45

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

下面引用一篇译文:

HTML5将oninput事件标准化了,该事件用来检测用户的输入状态。当然,通过使用onkeydown或者onkeyup作为代替也是可以的。这些事件设计本意也并非如此,参见详情


所有的现代浏览器支持oninput,其中包括IE9。对于那些老式浏览器,在不支持该事件时用keydown作为优雅降级。不幸的是,检测浏览器对该oninput事件的支持性并不容易。假定浏览器支持oninput,那么以下这段js代码的返回值为true,否则为false
'oninput' in document.createElement('input')
这段代码在大多数浏览器中正常运行,除了Firefoxbug #414853),故仍旧需要为oninput作浏览器特性检测。除此以外就没必要为其他浏览器作特性检测了,只需为inputkeydown绑定事件,并在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

onchange和oninput事件区别

oninput,onpropertychange,onchange的用法 onchange触发事件必须满足两个条件: a)当前对象属性改变,并且是由键盘或鼠标事件激发的,如果得用javascrip...
  • lipinganq
  • lipinganq
  • 2016年04月26日 15:14
  • 1050

js 实时监听input中值变化

RunJS 实时监测input中值的变化
  • spy19881201
  • spy19881201
  • 2014年05月11日 11:13
  • 188970

input事件的处理

接InputReader::loopOnce()的 if (count) { processEventsLocked(mEventBuffer, count); } input事件获取到就该处理了。 ...
  • coldsnow33
  • coldsnow33
  • 2013年12月01日 13:09
  • 3346

文本框输入后立即触发事件

文本框输入事件:onchange 、onkeyup 、onblur onchange在用于文本框输入框时,有一个明显的不足. 事件不会随着文字的输入而触发,而是等到文本框失去焦点(onblur)时才会...
  • meizhiyun
  • meizhiyun
  • 2013年11月27日 12:14
  • 93831

input子系统四 input事件处理

input事件处理流程 input driver -> input core ->event handler -> userspace 给应用程序。 一 事件分发跟踪 核心层留给驱动层的上报接口是i...
  • coldsnow33
  • coldsnow33
  • 2013年10月18日 17:24
  • 3514

input驱动12种事件类型Event types的含义

linux2.6 input subsystem中部分相关结构体的分析   最近在做linux2.6的键盘驱动程序的工作,接触到了input subsystem这一概念,现把我对其中相关结构体的理解写...
  • LoongEmbedded
  • LoongEmbedded
  • 2016年04月16日 11:08
  • 2600

jquery绑定input的change事件

$(function(){ //输入框的值改变时触发 $("#inputid").on("input",function(e){ ...
  • xiejunna
  • xiejunna
  • 2017年12月07日 16:10
  • 80

input子系统四 input事件处理

input事件处理流程 input driver -> input core ->event handler -> userspace 给应用程序。 一 事件分发跟踪   核心层留给驱动层的上报接...
  • sdkdlwk
  • sdkdlwk
  • 2017年05月03日 11:08
  • 277

jquery input change事件

input输入框的change事件,要在input失去焦点的时候才会触发 $('input[name=myInput]').change(function() { ... }); 在输入框内容变化的...
  • arkblue
  • arkblue
  • 2014年01月09日 13:51
  • 143231

input 输入完成时执行的事件change事件

$("#code_num").change(function(){});
  • u012493556
  • u012493556
  • 2016年09月29日 17:27
  • 4147
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:总结oninput、onchange与onpropertychange事件的用法和区别
举报原因:
原因补充:

(最多只允许输入30个字)