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

这段代码在大多数浏览器中正常运行,除了 Firefox( 见 bug #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

总结oninput、onchange与onpropertychange事件的用法和区别相关推荐

  1. 【转】总结oninput、onchange与onpropertychange事件的用法和区别

    经本人测试在chrome下的从历史记录中选取值的时候也户触发input事件 前端页面开发的很多情况下都需要实时监听文本框输入,比如腾讯微博编写140字的微博时输入框hu9i动态显示还可以输入的字数.过 ...

  2. 实时监听文本框输入 oninput、onchange与onpropertychange事件的用法和区别

    前端页面开发的很多情况下都需要实时监听文本框输入,比如腾讯微博编写140字的微博时输入框hu9i动态显示还可以输入的字数.过去一般都使用onchange/onkeyup/onkeypress/onke ...

  3. oninput事件onpropertychange事件onchange事件textIput事件

    oninput事件&onpropertychange事件&onchange事件&textIput事件 oninput事件 简介 input,select,textarea元素值 ...

  4. onchange事件与onpropertychange事件的区别

    onchange事件与onpropertychange事件的区别 1.onchange事件与onpropertychange事件的区别:onchange事件在内容改变(两次内容有可能还是相等的)且失去 ...

  5. onchange、onpropertychange和oninput

    1.onchange事件与onpropertychange事件的区别:  onchange事件在内容改变(两次内容有可能还是相等的)且失去焦点时触发:onpropertychange事件却是实时触发, ...

  6. JS中onpropertychange事件和onchange事件区别

    2019独角兽企业重金招聘Python工程师标准>>> 当一个HTML元素的属性用js改变的时候,都能通过 onpropertychange来捕获.例如一个 <input na ...

  7. onpropertychange事件

    document.getElementById('updatelog').attachEvent('onpropertychange', function(o) {if (o.propertyName ...

  8. javascript中的onpropertychange事件 与 jquery中的propertychange事件

    2019独角兽企业重金招聘Python工程师标准>>> jquery 中的propertychange事件不兼容IE9  而javascript中的onpropertychange事 ...

  9. 解决ie8下onpropertychange事件间歇性失效的问题

    有的时候onpropertychange事件一下好用,一下不好用 网上有的说去掉<!DOCTYPE html>就好了, 我试了下,虽然然管用,但doctype是推荐加上的,去掉他有些东西会 ...

  10. c# 事件和委托的区别,使用事件的好处

    网上一些介绍事件 (event) 的文章让人看来觉得事件和委托好像有很大的不同.通常,事件被作为一种特殊的类型或结构来看待.但事实上,事件只是委托的一个修饰符 (modifier),此外编译器增加了一 ...

最新文章

  1. Android面试题大集合
  2. 互联网协议 — TCP — 滑动窗口(网络质量保障)
  3. MinGW:sjlj vs dwarf vs seh有什么区别?
  4. mysql f_MySQL
  5. GLSL中 Billboard和Point的顶点空间变换
  6. mysql导出表部分数据
  7. Python 工匠: 异常处理的三个好习惯
  8. 仅此一文让你明白ASP.NET MVC原理
  9. gitlab和github一起使用
  10. pandas df.loc
  11. cs229 学习笔记四 学习理论
  12. linux下好看的中文字体,推荐一款 Linux 上比较漂亮的字体(转)
  13. Ajax原生XHR和Promise 学习
  14. 各大主流社交软件显示ip地址-如何实现ip飘移
  15. python 判断一个list列表是否包含另一个list列表
  16. python插入excel文件数据(递增+随机)
  17. 蓝桥杯——单片机设计与开发初学者必备资料
  18. excel 文件工作表保护密码破解
  19. AFNetworking(v3.1.0) 源码解析
  20. Linux 学习“安装CentOS与多重引导小技巧”

热门文章

  1. SaaSBase:最适合小团队轻量级项目管理的软件——Tower
  2. mysql没有卸载干净服务还启动着,MySQL卸载不干净,真的让人很头大
  3. 强化学习之Q-learning简介
  4. win10安装MySQL5.7教程,linux安装MySQL教程,SQLyog安装教程
  5. 文字时钟罗盘动态html代码_抖音时钟原生JS文字钟源码下载
  6. 斐讯盒子t1 刷Android,T1刷机的详细步骤
  7. hnust 数据挖掘原理与算法期中考试复习资料
  8. vue 图片拖拉转放大缩小组件
  9. 云计算决策指南:解析医疗的7大解决方案
  10. 昆仑通态通用版找不到驱动_昆仑通态无法连接1200