问题

这是在工作中遇到的一个问题:

一个textarea文本框,需要动态监听输入文本个数

方案

通过谷歌查到一种完美的兼容方法

"如果使用 onkeydown、onkeypress、onkeyup 这个几个键盘事件来监测的话,监听不了右键的复制、剪贴和粘贴这些操作,处理组合快捷键也很麻烦

因此这篇文章向大家介绍一种完美的解决方案:结合 HTML5 标准事件 oninput 和 IE 专属事件 onpropertychange 事件来监听输入框值变化。"

引用自 http://www.cnblogs.com/lhb25/archive/2012/11/30/oninput-and-onpropertychange-event-for-input.html

如果项目中使用了jQeury,可以这样绑定事件:

$("#content").on("input propertychange",function(){
//code...
});

propertychange

The onpropertychange event is only supported in conjunction with the legacy attachEvent IE-only event registration model, which has deprecated since Windows Internet Explorer 9 in favor of the W3C standard "addEventListener" event model.

引用自 https://msdn.microsoft.com/en-us/library/ms536956(v=vs.85).aspx

propertychange事件只能通过早前的IE版本的attachEvent方法绑定,在IE9后支持了W3C标准的addEventListener方法绑定中被移除.

propertychange事件的兼容性从官网上没看到,网上的说法是IE6-8.

input

input事件因为采用的是W3C标准,所以主流现代浏览器都支持,IE在IE9后支持(详情看官网)

虽然input方法在IE9下有"剪切和删除不会触发"的BUG,但是综上两个方法仍是"完美"的兼容方案,所以项目中便使用了

"坑"

项目中要实现的对新添DOM实现变化监听.因此需要把事件委托到Document上(彼时还不知道事件委托的原理,只知道代码怎么写),上述代码改为:

$(document).on("input propertychange","#content",function(){
//code...
});

开发中发现input事件完美实现对新DOM的变化监听.但是propertychange事件怎么着也不触发.

网上关于propertychange事件不触发的文章很少,不过还是被我发现了,分享给大家网址

propertychange事件有个特点就是不支持冒泡,这样就不能实现事件的委托,而且jquery也没有解决这个BUG

引用自 http://www.cnblogs.com/3tree/p/4597295.html

上文中也给出了解决方案:

对于IE9+和firefox以及Opera浏览器,支持DOMAttrModified事件,和propertychange事件很相似,监听属性的变化,但是不监听用户操作的修改。

引用自 http://www.cnblogs.com/3tree/p/4597295.html

DOMAttrModified讲解

总结

通过这个"坑",我觉得我有必要看一下什么是冒泡事件?什么是事件委托的原理?

网上有太多讲解文章,因此我就不赘述了,挑选了讲解的比较明白的文章,感兴趣的同学自己看一下吧

javascript事件委托与"坑"的更多相关文章

  1. JavaScript 事件委托的技术原理

    如今的 JavaScript 技术界里最火热的一项技术应该是‘事件委托(event delegation)’了.使用事件委托技术能让你避免对特定的每个节点添加事件监听器:相反,事件监听器是被添加到它们 ...

  2. JavaScript事件委托的技术原理

    如今的JavaScript技术界里最火热的一项技术应该是‘事件委托(event delegation)’了.使用事件委托技术能让你避免对特定的每个节点添加事件监听器:相反,事件监听器是被添加到它们的父 ...

  3. javascript事件委托机制详解

    以个人前端工作面试经历来看,javascript事件委托是问的最多的一类题目之一,熟悉事件委托能够了解你对于javascript的掌握程度. 面试官可能问一下问题,现在有5个li待办事件,需要实现当点 ...

  4. JavaScript 事件委托

    JavaScript事件委托,或者叫事件代理,是利用事件冒泡,只指定一个事件处理程序,就可以管理某一类型的所有事件. 借花献佛的例子(取快递): 有三个同事预计会在周一收到快递.为签收快递,有两种办法 ...

  5. 关于javaScript事件委托的那些事

    今天是第一次写稿,还是有那么一丢丢小鸡冻...回归正题啦... 关于javaScript事件委托不得不说的那些事,为什么要使用事件委托? 我们可以这么说,假设老板要分配一项任务,首先要秘书叫A君来到办 ...

  6. javascript 事件委托,jq,js模拟事件

    <!DOCTYPE> <html> <head> <title></title> <script src="Scripts/ ...

  7. Javascript事件委托

      事件委托利用事件冒泡,只指定一个事件处理程序,就可以管理某一类型的所有事件未使用事件委托之前: <!DOCTYPE html> <html> <head> &l ...

  8. javascript事件委托和jQuery事件绑定on、off 和one

    一. 事件委托什么是事件委托?用现实中的理解就是:有100 个学生同时在某天中午收到快递,但这100 个学生不可能同时站在学校门口等,那么都会委托门卫去收取,然后再逐个交给学生.而在jQuery 中, ...

  9. javascript 事件委托 和jQuery事件绑定on、off 和one

    一. 事件委托什么是事件委托?用现实中的理解就是:有100 个学生同时在某天中午收到快递,但这100 个学生不可能同时站在学校门口等,那么都会委托门卫去收取,然后再逐个交给学生.而在jQuery 中, ...

随机推荐

  1. Jmeter命令行 传递参数

    二.参数 -J 和 -G 1.格式:-J变量名=值  -G变量名=值 2.相同之处:设置jmeter属性,例如线程数.循环次数.ramp up-time等 3.不同之处:-J是设置本地jmeter属性 ...

  2. MySQL数据库安装与启动(Linux)

    1.用yum安装 用root权限打开命令行界面,执行以下yum指令: yum安装MySQL yum install mysql mysql-server mysql-devel -y 在最终提示Com ...

  3. git拉取远程所有分支

    第一步: git branch -r | grep -v '->' | while read remote; do git branch --track "${remote#origi ...

  4. Android开发:Handler的简单使用(一)

    1.Handler是什么? 原文: A Handler allows you to send and process Message and Runnable objects associated w ...

  5. windows上测试网络数据跳转路径

    今天遇到一个有关路由方面的问题,所以向一位CCIE大神问了点问题.就是关于ip ping包出了pc之后怎么走的. 然后告诉我了这么一个命令: Tracert(跟踪路由)是路由跟踪实用程序,用于确定 I ...

  6. js获取url参数值的几种方式

    一.原生js获取URL参数值: 比如当前URL为:http://localhost:8080/#/page2?id=100&name=guanxy <template> <d ...

  7. 在Kubernetes下部署Prometheus

    使用ConfigMaps管理应用配置 当使用Deployment管理和部署应用程序时,用户可以方便了对应用进行扩容或者缩容,从而产生多个Pod实例.为了 能够统一管理这些Pod的配置信息,在Kuber ...

  8. ECMAScript 6学习总结

    学习ECMAScript 6 一.什么是ES6 ECMAScript6是ECMAScript的升级,实现用来编写复杂程序项目. 二.ECMAScript和JavaScript的关系 JavaScrip ...

  9. shell编程基础干货

    变量及赋值 设置变量   A=‘china’  取消变量  unset  A    加上 export 关键字  代表全局变量 a=$(ls -l /root/bin)   ##运行里面的命令,并把结 ...

  10. 【转】Spring+Websocket实现消息的推送

    本文主要有三个步骤 1.用户登录后建立websocket连接,默认选择websocket连接,如果浏览器不支持,则使用sockjs进行模拟连接 2.建立连接后,服务端返回该用户的未读消息 3.服务端进 ...