3

当按下回车键时,我一直编写以下代码来处理:

$("#selectorid").keypress(function (e) {
    if (e.keyCode == 13) {
        var targetType = e.originalTarget
            ? e.originalTarget.type.toLowerCase()
            : e.srcElement.tagName.toLowerCase();
        if (targetType != "textarea") {
            e.preventDefault();
            e.stopPropagation();
            // code to handler enter key pressed
        }
    }
});

有没有办法扩展 jQuery,这样我就可以写:

$("#selectorid").enterKeyPress(fn);
4

4 回答 4

5

您可以扩展 jquery,例如:

jQuery.fn.returnPress = function(x) {
  return this.each(function() {
    jQuery(this).keypress(function(e) {
      if ((e.which && e.which == 13) || (e.keyCode && e.keyCode == 13)) {
        x();
        return false;
      }
      else {
        return true;
      }
    });
  });
};

可以像这样调用:

$('selector').returnPress(function() { alert('enter pressed'); });
于 2010-03-26T17:50:44.330 回答
4

你可以按照 David G 所说的去做,但也许最正确的方法是编写一个自定义事件:

$(document).keypress(function(evt){
    if(evt.keyCode==13) $(evt.target).trigger('enterPress');
});

可以像这样绑定:

$(document).bind('enterPress', fn);

在此处查看示例:http: //jquery.nodnod.net/cases/1821/run

这种方法的优点是您可以像 jQuery 中的任何其他事件一样绑定、取消绑定、命名空间和触发事件。

于 2010-03-26T18:06:42.670 回答
2

您可以将其定义为一个插件,代码少一点,如下所示:

jQuery.fn.enterKeyPress = function(callback) {
  return this.not("textarea").keypress(function (e) {
    if (e.keyCode == 13) {
      callback($(this));
      return false;
    }
  });
};

像这样使用:

$("input").enterKeyPress(function() { alert('hi'); });

这种方法仍然会忽略<textarea>,但我们不会检查每个击键,而是永远不会将keypress事件绑定到任何文本区域。

于 2010-03-26T17:52:40.087 回答
0

这是我用来捕获任何表单元素上的回车键并将其转换为选项卡的方法。我已经做到了,因此 enter 键在 textarea 中以及在提交、重置和按钮元素上正常工作。

$.fn.focusNext = function(e) {
  var t = $(this);
  if ( t.is(":submit")==true || t.is(":reset")==true || t.is("textarea")==true || t.is("button")==true ) { exit(); }

  if (e.which==13 || e.which==3) {
    return this.each(function() {
      e.preventDefault();
      var fields = $(this).parents("form:eq(0)").find(":input:visible");
      var index = fields.index( this );
      if ( index > -1 && ( index + 1 ) < fields.length ) { fields.eq( index + 1 ).focus(); }
    });
  }
  return true;
};

并使用它,它是这样调用的

$(":input").keypress(function(e) { $(this).focusNext(e); });

或者

$(":input").live("keypress", function(e) { $(this).focusNext(e); });
于 2010-07-31T00:18:46.420 回答