我在很多地方都看到 jQuery 在选择上的更改事件只会在模糊或鼠标单击时触发,但是当我尝试它时,该事件也会在每次按下箭头键时触发。当使用箭头选择选项时,我试图让 change 事件不触发。例如:
<select size="4" id="more" name="more" required="required">
<option value="0">No</option>
<option value="1">Yes</option>
<option value="2">Maybe</option>
<option value="3">No clue</option>
</select>
$('#more').on('change', function(event){
alert('hi');
});
这个小提琴演示了在以下情况下触发的事件:http: //jsfiddle.net/McWatt/x5cTr/7/
根据 jQuery change() 页面,如果我选择选项卡,然后使用箭头选择一个选项,则更改事件不应该触发,直到选择失去焦点(至少我是这样阅读它的)。实际上,我看到每次按下箭头键都会触发更改事件。
对于选择框、复选框和单选按钮,当用户使用鼠标进行选择时会立即触发该事件,但对于其他元素类型,该事件会延迟到元素失去焦点为止。
这种行为是否发生了变化,还是我不了解该功能?
更新:我误读了 jQuery 文档,尽管它们可能更清楚。我已经接受了导致我意识到这一点的答案。对于我的问题的实际解决方案,如果使用箭头,我将 keydown 事件绑定到将数据属性设置为 false 的选择。然后在更改绑定中,我设置了一个条件,如果数据属性为真,则仅在更改时执行代码。这不是最好的解决方案,因为如果使用箭头,它会有效地终止更改回调代码,但由于有另一种触发功能的方法(通过按钮),我可以接受这个功能。
Update2:这是一个工作小提琴:http: //jsfiddle.net/McWatt/BR8QQ/
// prevent change event being fired on arrow keys
$('#more').data('activation', 'activated').bind({
keydown: function(event) {
if(event.which === 38 || event.which === 40){
$(this).data('activation', 'paused');
}
},
click: function(event) {
if($(this).data('activation') === 'paused'){
$(this).data('activation', 'activated');
$(this).trigger('change');
}
},
change: function(event) {
if($(this).data('activation') === 'activated'){
var time = new Date();
$('#changed').text(event.type + ": " + time.getTime());
}
}
});
</p>