#javascript #jquery
#javascript #jquery
Вопрос:
Я пытаюсь создать простой счетчик символов, который показывает, ввел ли пользователь минимальное количество символов, прежде чем они смогут нажать enter.
$(document).ready(function(){
$('#notification').hide();
$('#press_enter_notification').hide();
var allow_enter = false;
var min = 4;
var max = 30;
var char_count = 0;
$("#form_textbox").keydown(function() {
$('#press_enter_notification').hide();
if(this.value.length < min) {
char_count = min - (this.value.length) -1;
//alert('Too short');
$('#notification').show("fast");
$('#notification').text(char_count ' more characters to go');
allow_enter = false;
} else if(this.value.length >= max) {
char_count = (this.value.length) - max;
this.value = this.value.substring(0,max);
$('#notification').show("fast");
$('#notification').text(' no more characters remaining');
} else {
char_count = max - (this.value.length) -1;
$('#notification').show("fast");
$('#notification').text(char_count ' characters remaining');
$('#press_enter_notification').show("fast");
allow_enter = true;
}
});
$("form").submit( function () {
if (allow_enter == false)
{
$('#press_enter_notification').show("fast").text('you cannot press enter yet');
return allow_enter;
}
} );
});
Это работает, однако у него есть следующие особенности:
- Когда вы что-то вводите и удаляете весь текст, сообщение о количестве символов не исчезает и не отсчитывается в обратном направлении
- Когда вы удаляете все, что указывает на то, что осталось еще 3 символа, мне пришлось добавить -1 в
if(this.value.length < min) {
, в противном случае он позволяет ввести 5 символов, прежде чем перестанет указывать, что осталось еще 3,2,1 символа.
char_count = min - (this.value.length) -1;
Если вы попробуете это в браузере или jsbin, вы их заметите. Как я могу структурировать это, чтобы отсортировать его?
Спасибо.
Ответ №1:
Вам нужно изменить keydown()
на keyup()
, поскольку длина не зарегистрирована до полного завершения нажатия клавиши. Единственное, что вам нужно проверить на keydown, — это предотвращаете ли вы значение по умолчанию для таких вещей, как return или tab.
Вы также можете удалить ошибку -1 прямо сейчас.
Скрипта JS:http://jsfiddle.net/VPD3j /
Ответ №2:
Одна из проблем заключается в том, что keydown
срабатывает до того, как выполняется действие этого нажатия клавиши. Вы можете исправить это, изменив на keyup
. Существует много проблем со счетчиками символов при нажатии клавиши (независимо от нажатия клавиши, нажатия клавиши и т.д.). Например, что, если человек удерживает нажатой кнопку, четный срабатывает один раз.
Я бы рассмотрел один из многих уже созданных плагинов. http://plugins .jquery.com/plugin-tags/character-counter
РЕДАКТИРОВАТЬ: Небольшое изменение, вы, вероятно, захотите привязать ввод, сведение клавиш и нажатие клавиш. Это позволит обойти несколько проблем:
$("#form_textbox").bind("keydown keyup keypress"...
Комментарии:
1. Событие может сработать только один раз, но поскольку он будет проверять возможную длину при вводе ключа, это ничего не нарушает в данном конкретном случае.
2. Только одна из многих проблем с ключевыми событиями. Что происходит, когда кто-то вставляет кучу текста?
3. Его переменная allow_enter по умолчанию имеет значение false, поэтому форма не будет отправлена. Я не утверждаю, что то, что вы говорите, неверно (что есть много вещей, которые следует учитывать при нажатии клавиши), но я возмущен тем, что плагин необходим, когда проблемы довольно легко преодолеть. Вероятно, проще, чем подковырнуть во внешнем плагине.
4. Плагин никогда не требуется, он может просто немного упростить задачу. Существует множество особенностей ключевых событий в различных браузерах, и, возможно, будет проще позволить кому-то другому учитывать их все. Или, если допустима возможность того, что точное количество иногда может быть неверным, тогда просто добавьте проверку количества символов при отправке и покончите с этим.