Javascript 如何在更改或键控时触发select标记上的某些代码,而不是在select失去焦点时触发

Javascript 如何在更改或键控时触发select标记上的某些代码,而不是在select失去焦点时触发,javascript,jquery,javascript-events,Javascript,Jquery,Javascript Events,(使用jQuery 1.4.4版) 问题的标题可能不太清楚,因此我将在下面进行更详细的描述: 当我的一个选择框中的选择发生变化时,我试图触发一些javascript代码。我知道我可以通过change()实现这一点,如下所示: var my_handler = function(eventObject){ // ... do something here ... }; $('#my_select_box').change(my_handler); var my_handler = funct

(使用jQuery 1.4.4版)

问题的标题可能不太清楚,因此我将在下面进行更详细的描述:

当我的一个选择框中的选择发生变化时,我试图触发一些javascript代码。我知道我可以通过
change()
实现这一点,如下所示:

var my_handler = function(eventObject){
  // ... do something here ...
};
$('#my_select_box').change(my_handler);
var my_handler = function(eventObject){
  // ... do something here ...
};
$('#my_select_box').change(my_handler).keyup(my_handler);
问题在于,当用户更改键盘选择时,不会触发此操作。我搜索了SO,每个人都建议在
keyup
事件上也绑定相同的处理程序,如下所示:

var my_handler = function(eventObject){
  // ... do something here ...
};
$('#my_select_box').change(my_handler);
var my_handler = function(eventObject){
  // ... do something here ...
};
$('#my_select_box').change(my_handler).keyup(my_handler);
实际上,当我通过键盘和鼠标更改选择时,处理程序都会执行

问题是当我用键盘更改选择,然后移动到表单中的下一个字段(通过鼠标或键盘)。再次触发处理程序(第二次)


您能解释一下为什么会发生这种情况,并告诉我是否有办法绕过此问题吗?

您可以尝试使用按键事件:


或者您可以忽略您不想要的关键事件:

唯一有效的答案是以某种方式跟踪您的值的实际变化,比如事件处理程序之外的变量。您可能无法避免引发该事件,但您可以选择不响应它。下面的例子说明:

var lastVal = null;
var my_handler = function(eventObject) {
    if (lastVal == $(this).val()) return;
    console.log("Changed");
    lastVal = $(this).val();
    eventObject.stopPropagation();
};

$('#my_select_box').change(my_handler).keyup(my_handler);

根据您的要求,一个不太理想的解决方案将是在“选择”上按一个键,然后按


按键
…试过了。也一样。问题在于以下操作顺序1)使用键盘更改2)离开焦点。第一个动作触发事件,第二个动作也会触发事件。第一个动作触发keyup事件,而离开焦点则触发change事件。我认为这是预期行为,我认为您不需要使用绑定
keyup
change
只要
change
就可以了@Supertramp这就是我现在所做的,因为
change
keyup
的组合并没有按照我想要的方式工作。关键是,当用户使用键盘时,我没有调用我的处理程序,这是我想要的。我希望每次用户通过键盘或鼠标更改其选择时调用我的处理程序。绑定到这两个事件的组合几乎是最佳的。但是,它有一个问题,我正在描述用户何时按顺序执行下两个操作:1)使用键盘更改2)离开焦点。第一个操作触发事件,第二个操作也触发事件。Boom.请访问页面并更改第一个选择框的选择(通过键盘或鼠标),然后查看是否调用了处理程序(以红色登录)。另外,我使用了Firefox7.0。1@TheSuperTramp好啊我刚去过那里。问题在于,在您所在的页面中,在select标记上有一个带有
size
属性的选择框。如果你去掉这个,那么行为就像我描述的那样。你想试试吗?我去了你的JSFIDLE页面,从沃尔沃换成了萨博,什么也没印出来。