Как я могу получить значение NEW для ввода текста HTML во время события нажатия клавиши через jQuery? - PullRequest
5 голосов
/ 12 августа 2010

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

Объединение старого значения с keyCode, достижимым из аргументов события, также недопустимо, поскольку не гарантируется, что пользователь будет печатать вконец строки в текстовом поле.

Ответы [ 4 ]

6 голосов
/ 12 августа 2010

Оберните код вашего обработчика в setTimeout(function() { ... }, 0).

. Этот код будет выполнен в следующем цикле сообщений после обновления value.

2 голосов
/ 13 августа 2010

Можно определить, какое значение будет после нажатия клавиши. Это легко сделать в браузерах, отличных от IE, и сложнее в IE, но это сделает следующее:

document.getElementById("your_input").onkeypress = function(evt) {
    var val = this.value;
    evt = evt || window.event;
    var charCode = typeof evt.which == "number" ? evt.which : evt.keyCode;
    if (charCode) {
        var keyChar = String.fromCharCode(charCode);
        var start, end;
        if (typeof this.selectionStart == "number" && typeof this.selectionEnd == "number") {
            start = this.selectionStart;
            end = this.selectionEnd;
        } else if (document.selection && document.selection.createRange) {
            // For IE up to version 8
            var selectionRange = document.selection.createRange();
            var textInputRange = this.createTextRange();
            var precedingRange = this.createTextRange();
            var bookmark = selectionRange.getBookmark();
            textInputRange.moveToBookmark(bookmark);
            precedingRange.setEndPoint("EndToStart", textInputRange);
            start = precedingRange.text.length;
            end = start + selectionRange.text.length;
        }
        var newValue = val.slice(0, start) + keyChar + val.slice(end);
        alert(newValue);
    }
};
1 голос
/ 12 августа 2010

Вот идея, которая может сработать.Нажмите клавишу и сохраните значение val в этой точке, чтобы вы всегда могли сравнить текущее значение с последним и найти разницу в строках.Разница будет нажата клавиша.

Один из способов сделать это - превратить строки в массивы и сравнить 2 массива, как они делают здесь: Разница в массиве JavaScript

Никогда не пытался ничего подобноготак что это может быть нежизнеспособным, но может стоить того.

0 голосов
/ 11 октября 2012

У меня был особый случай с клавишей TAB, которая изменяет e.target в keyUp, так что это решение - привязать к элементу контейнера, получить целевой ввод в обработчике keyDown, подписаться на keyUp и прочитать значение.

$("#container").keydown(function (e) {
   //here you decide whether to handle the key event, and grab the control that sent the event 
   var myInput = e.target;
   $("#container").one('keyup', function() {
      console.log(myInput.val());  
      // do smth here
   });
});
...