oninput 、onpropertychange 、addEvent思考

1. onchange事件与onpropertychange事件的区别:

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

2. oninput事件与onpropertychange事件的区别:

  oninput事件是IE之外的大多数浏览器支持的事件,在value改变时实时触发,但是通过js改变value时不会触发;onpropertychange事件是任何属性改变都会触发,而oninput却只在value改变时触发,oninput要通过addEventListener()来注册,onpropertychange注册方法与一般事件相同。

3. oninput与onpropertychange失效的情况:

oninput事件:

  (1)当脚本中改变value时,不会触发;

  (2)从浏览器的自动下拉提示中选取时,不会触发;

onpropertychange事件:

  当input设置为disable=true后,不会触发。



我用onpropertychange取input值变化时,发现这个问题:
在IE10及之前版本都是对的,升级到IE11后,发现只有键盘输入值才能触发事件,如果是JS给input赋值,则不能触发事件。

下面是测试代码,可以实现,但是input加入下拉时,就会失效

<body>


<p>该实例使用 addEventListener() 方法来向按钮添加点击事件。</p>


<button id="myBtn">点我</button>
<input id="TandV">
<input οninput="d()">
<p id="demo"></p>


<script>
document.getElementById("myBtn").addEventListener("click", function(){
    document.getElementById("demo").innerHTML = "Hello World";
});
document.getElementById("TandV").addEventListener("input", function(){
    alert("aaa")
}, false);
function d(){
alert("bbb")
}
</script>


</body>


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


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值