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