Есть ли способ расширить jQuery для обработки события ввода пользовательского ключа? - PullRequest
3 голосов
/ 26 марта 2010

Я все время пишу следующий код для обработки при нажатии клавиши ввода:

$("#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 ]

5 голосов
/ 26 марта 2010

Вы можете расширить 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'); });
4 голосов
/ 26 марта 2010

Вы можете сделать то, что говорит Дэвид Г., но, возможно, самый правильный способ сделать это - написать пользовательское событие:

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

Что может быть связано так:

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

См. Пример здесь: http://jquery.nodnod.net/cases/1821/run

Преимущество этого подхода заключается в том, что вы можете связывать, отменять привязку, пространство имен и запускать событие, как любое другое событие в jQuery.

2 голосов
/ 26 марта 2010

Вы можете определить его как плагин с немного меньшим количеством кода, подобного этому:

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 с какой-либо текстовой областью.

0 голосов
/ 31 июля 2010

Это то, что я использую, чтобы получить ключ ввода на любом элементе формы и преобразовать его во вкладку. Я сделал так, чтобы клавиша ввода работала нормально в текстовой области, а также при отправке, сбросе и кнопках.

$.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); });

OR

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