2013-07-09 5 views
1

У меня есть следующий код:Длина не возвращает правильное значение

$(document).ready(function (e) { 

    $('#input').keydown(function (e) 
    { 
     var inpData_lenght = $(this).val().length+1; 
     var max_length  = 15; 
     if (inpData_lenght >= max_length) 
     { 
      if (inpData_lenght > max_length) 
      { 
       if ((e.keyCode != 8) && (e.keyCode != 46)) 
       { 
        e.stopImmediatePropagation(); 
        e.preventDefault(); 
       } 
      } 

      $(this).css({'background-color': '#ff8080'}); 
     } 
     else 
     { 
      $(this).css('background-color', ''); 
     } 
    }); 
}); 

HTML:

<textarea id="input"></textarea> 

(fiddle)

текстовое поле не меняет фон обратно на белый, когда есть max_length-1 символов, но только на max_length-3, есть ли обходной путь? Я знаю, что это связано с обратным пространством или удалением, которое считается символом.

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

+0

Затем с помощью другого плагина я рекомендовать. Что вы используете? – Bergi

+0

Обратите внимание, что backspace и delete - это не единственные ключи, которые вам нужно особо учитывать: как насчет вкладки (с или без сдвига)? Как насчет клавиш со стрелками? _ "... плагин ..." _ - Какой плагин? Я не вижу никакого кода плагина в вопросе. – nnnnnn

ответ

0

Если вам нужен обходной путь для keydown, должно работать:

var maxLength = 15; 
var currLength = this.value.length; 
if (e.keyCode == 8 || e.keyCode == 46) { 
    var expectedLength = currLength - 1; // distinguish here! 
} else { 
    var expectedLength = currLength + 1; 
    if (expectedLength > maxLength) { 
     e.stopImmediatePropagation(); 
     e.preventDefault(); 
    } 
} 
if (expectedLength >= maxLength) { 
    $(this).css('background-color', '#ff8080'); 
} else { 
    $(this).css('background-color', ''); 
} 
3

Лучше использовать keyup() вместо keydown(), потому что вы получите полученное значение ввода. Если длина превышает максимальную, просто замените входное значение на предыдущий. http://jsfiddle.net/9Ed8h/

$(document).ready(function (e) { 

    $('#input').keyup(function (e) 
    { 
     var inpData_lenght = $(this).val().length; 
     var max_length  = 15; 
     if (inpData_lenght >= max_length) 
     { 
      if (inpData_lenght > max_length) 
      { 
       $(this).val(this.lastValue); 
      } 

      $(this).css({'background-color': '#ff8080'}); 
     } 
     else 
     { 
      $(this).css('background-color', ''); 
     } 
     this.lastValue = $(this).val(); 
    }); 
}); 
-1

Вместо того чтобы использовать яваскрипт условие, которое вы можете использовать что-то вроде этого

<textarea maxlength="15" id="input"/> 
+1

Обратите внимание, что это не работает в старых браузерах (которые поддерживают только 'maxlength' на элементах' input'). – nnnnnn

+0

Да, вы правы – sajay

0

Использования KeyUp решит вашу проблему. Вы должны думать о том, как предотвратить людей, удерживающих их ключ. (Если удерживать клавишу в течение 2 секунд, ваш предел 15 символов будет превышен)

How to disable repetitive keydown in jQuery

0

Объединить MaxLength и KeyUp должен быть самым простым способом.

<textarea id="input" maxlength=3></textarea> 

И

$(document).ready(function (e) { 

    $('#input').keyup(function (e) 
    { 
     var inpData_lenght = $(this).val().length; 
     var max_length  = 3; 
     if (inpData_lenght >= max_length) 
     { 
      $(this).css({'background-color': '#ff8080'}); 
     } 
     else 
     { 
      $(this).css('background-color', ''); 
     } 
    }); 
}); 

Смотрите скрипку: http://jsfiddle.net/DEjgd/4/

Смежные вопросы