2009-08-06 149 views
16

我有一个HTML窗体上的简单列表框,这很基本的jQuery代码Jquery的列表框Change事件不会触发键盘滚动

//Toggle visibility of selected item 
    $("#selCategory").change(function() { 
     $(".prashQs").addClass("hide"); 
     var cat = $("#selCategory :selected").attr("id"); 
     cat = cat.substr(1); 
     $("#d" + cat).removeClass("hide"); 
    }); 

变化事件触发罚款鼠标,但是当我使用键盘滚动项目的事件不会被解雇,我的代码永远不会执行。

是否有此行为的原因是什么?解决方法是什么?

回答

21

onchange事件一般不开除,直到元素失去焦点。您还需要使用onkeypress。也许是这样的:

var changeHandler = function() { 
    $(".prashQs").addClass("hide"); 
    var cat = $("#selCategory :selected").attr("id"); 
    cat = cat.substr(1); 
    $("#d" + cat).removeClass("hide"); 
} 

$("#selCategory").change(changeHandler).keypress(changeHandler); 

你会希望同时onchangeonkeypress,以分别占鼠标和键盘交互。

+0

但在这种情况下,我得到了按键不工作在任何浏览器,除了FireFox,我在铬,Safari浏览器和IE测试,并没有工作。 – 2010-07-02 03:16:53

+0

'keypress'事件在chrome上不起作用,但'keyup'正常运行 – 2011-08-17 12:37:17

4

有时改变行为可以为每个浏览器不同,作为一种解决方法,你可以做这样的事情:

//Toggle visibility of selected item 
    $("#selCategory").change(function() { 
     $(".prashQs").addClass("hide"); 
     var cat = $("#selCategory :selected").attr("id"); 
     cat = cat.substr(1); 
     $("#d" + cat).removeClass("hide"); 
    }).keypress(function() { $(this).change(); }); 

你可以连你想要的任何事件和手动触发更改事件。

IE:

var changeMethod = function() { $(this).change(); }; 
....keypress(changeMethod).click(changeMethod).xxx(changeMethod); 
+0

你说得对,这是由于跨浏览器不兼容。 – 2009-08-06 06:20:18

1

您所描述的行为,改变事件通过键盘在一个select元素滚动触发,实际上就是一个Internet Explorer漏洞。该DOM Level 2 Event说明书中change事件定义为这样的:当一个控制 失去输入焦点并且由于获得焦点其值 已被修改发生

的变化事件。 此事件是有效的INPUT,SELECT, 和TEXTAREA。元件。

如果你真的想要这种行为,我认为你应该看看键盘事件。

$("#selCategory").keypress(function (e) { 
    var keyCode = e.keyCode || e.which; 
    if (keyCode == 38 || keyCode == 40) { // if up or down key is pressed 
    $(this).change(); // trigger the change event 
    } 
}); 

检查一个例子here ...

+0

如何在Firefox中产生这种行为呢?我希望我的内容在焦点仍在框中时更改listitem更改。 – 2009-08-06 06:18:08

+3

+1我发现解决方案除了改变之外还使用了keyup事件。 – 2009-08-06 06:20:58

+0

你应该注意到,KEYUP不会被调用,如果按下并按住,直到关键是放手的keydown,浏览器可以通过列表中的不同项目滚动当按下键。我会确保这不会对依赖活动更改的任何代码产生负面影响。 – 2009-08-06 06:27:11

0

我的JQuery 1.4.1下有这个问题与IE浏览器 - 在组合框更改事件如果使用键盘进行更改并没有开火。

似乎已经固定在JQuery中1.4.2。

0
$('#item').live('change keypress', function() { /* code */ }); 
+1

'live'已弃用。使用'on'代替,如果你不使用jQuery 1.7或更高版本,请使用'delegate'。 – 2012-06-08 08:45:45

+0

@JamesAllardice谢谢:) – 2012-06-27 00:15:53

+1

不客气:)有关详细信息,请参阅http://liveisdeprecated.com – 2012-06-27 07:20:09