代码之家  ›  专栏  ›  技术社区  ›  Cyril Gupta

键盘滚动时jquery列表框更改事件不触发

  •  16
  • Cyril Gupta  · 技术社区  · 15 年前

    我在HTML表单上有一个简单的列表框,这个非常基本的jquery代码

        //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");
        });
    

    当使用鼠标选择当前项时,更改事件将很好地激发,但当我使用键盘滚动这些项时,事件不会激发,代码也不会执行。

    这种行为有什么原因吗?解决方法是什么?

    5 回复  |  直到 13 年前
        1
  •  21
  •   Justin Johnson    15 年前

    这个 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);
    

    两个都要 换上 按键式 分别考虑鼠标和键盘的交互。

        2
  •  4
  •   Quintin Robinson    15 年前

    有时,每个浏览器的更改行为可能有所不同,作为解决方法,您可以这样做:

     //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);
    
        3
  •  1
  •   Christian C. Salvadó    15 年前

    您所描述的行为,即由选择元素中的键盘滚动触发的更改事件,实际上是一个Internet Explorer错误。这个 DOM Level 2 Event 规范定义了 change 事件如下:

    当控件 失去输入焦点及其值 自获得焦点后被修改。 此事件对输入有效,请选择, 和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

        4
  •  0
  •   Jonathan Moffatt    15 年前

    我在jquery 1.4.1下的IE中遇到了这个问题——如果使用键盘进行更改,组合框上的更改事件就不会触发。

    似乎已在jquery 1.4.2中修复。

        5
  •  0
  •   Brynner Ferreira    13 年前
    $('#item').live('change keypress', function() { /* code */ });