Захват ключевого события для возврата - PullRequest
9 голосов
/ 27 апреля 2010

Я испытываю затруднения при захвате клавиши возврата на клавиатуре в качестве события клавиатуры в javascript / jQuery. В Firefox, Safari, Opera, Chrome и на iPhone / iPad я записываю событие keyup в поле ввода текста следующим образом:

$(id_input).keyup(function(event) {
   that.GetHints($(this).val().trim(), event, fieldName);
});

Это событие захватывает нажатия клавиш пользователя, а затем отправляет их функции, чтобы выполнить вызов поиска ajax.

Моя проблема возникает, когда пользователь желает вернуться на символ, который он / она уже набрал. Во всех браузерах, к которым у меня есть доступ, кроме моего телефона Droid, когда я нажимаю клавишу возврата, это событие keyup захватывает значение, возвращаемое $ (this) .val (). Trim (), и отправляет его на обработку в функцию. GetHints. На Droid, однако, ни этот keyup, ни эквивалентное событие keydown не срабатывают до тех пор, пока пользователь не возвратится через каждый символ в $ (this).

Так, например, если я наберу «cu», то после возврата на «u» оставлю только «c» в поле ввода, во всех браузерах, кроме Droid, событие keyup сработает и вызовет функцию GetHints("c", event, fieldName). На Droid событие keyup никогда не срабатывает.

Чего мне не хватает? Как / почему эта клавиша возврата на клавиатуре Droid не работает должным образом? Как мне обойти это?

1 Ответ

2 голосов
/ 03 июня 2011

Вы можете опросить изменения в тексте (используя setInterval). Это, вероятно, будет более надежным. Например, keyup не сработает, если пользователь щелкнет правой кнопкой мыши -> вырезать. Один опрос будет менее отзывчивым, но вы можете объединить его с keyup, чтобы сохранить его быстрым. Опрос будет немного более загруженным процессором.

Попробуйте что-нибудь в этом духе:

var oldText = '';
var timer = setInterval(function(){
    var text = $(id_input).val().trim();
    if(text != oldText){
        oldText = text;
        that.GetHints(text, fieldName);
    }
}, 500);

Настройте длительность интервала по мере необходимости.

Я не уверен, что that.GetHints делает с event, но, очевидно, вы не сможете передать это при использовании метода опроса (потому что фактическое событие не вызывается). Это проблема?

Вы можете использовать clearInterval(timer);, чтобы остановить опрос, если хотите.

Вы можете сохранить существующую функцию keyup как есть (для повышения отзывчивости). В качестве альтернативы вы можете просто опросить, чтобы избежать слишком частого вызова that.GetHints (например, если кто-то наберет что-то очень быстро).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...