Как запретить пользователю вводить текст в текстовую область после достижения максимального количества символов

Я хочу запретить пользователю вводить текст в текстовую область, как только он достигает максимального предела символов. Что происходило, когда я достигал максимального предела, тогда моя полоса прокрутки текстовой области перемещалась вверх, я каким-то образом предотвратил это с помощью этого кода.

jQuery(document).ready(function($) {
    $('textarea.max').keyup(function() {
        var $textarea = $(this);
        var max = 400;
        if ($textarea.val().length > max) {
            var top = $textarea.scrollTop();
            $textarea.val($textarea.val().substr(0, max));
            $textarea.scrollTop(top);

        }
    });
}); //end if ready(fn)

Но я также хочу, чтобы после достижения максимального предела пользователь не мог ничего вводить в текстовую область. В настоящее время происходит то, что после достижения максимального предела, если пользователь нажимает и удерживает клавишу, символы печатаются в текстовой области, хотя после отпускания кнопки они возвращаются к исходному тексту (т.е. $textarea.val($textarea.val(). substr(0, max)); ). Но я хочу, чтобы однажды это условие стало верным

if ($textarea.val().length > max) {

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


person Basit    schedule 02.05.2012    source источник


Ответы (9)


Событие keyup срабатывает после того, как произошло поведение по умолчанию (заполнение текстовой области).

Лучше использовать событие keypress и фильтровать непечатаемые символы.

Демонстрация: http://jsfiddle.net/3uhNP/1/ ( с максимальной длиной 4)

jQuery(document).ready(function($) {
    var max = 400;
    $('textarea.max').keypress(function(e) {
        if (e.which < 0x20) {
            // e.which < 0x20, then it's not a printable character
            // e.which === 0 - Not a character
            return;     // Do nothing
        }
        if (this.value.length == max) {
            e.preventDefault();
        } else if (this.value.length > max) {
            // Maximum exceeded
            this.value = this.value.substring(0, max);
        }
    });
}); //end if ready(fn)
person Rob W    schedule 02.05.2012
comment
спасибо, но после тестирования вашего кода. Как только он достигает максимального предела, он останавливается. Я не могу ввести слово. Но если затем я нажму клавишу возврата, то это тоже не сработает. По крайней мере, у пользователя есть возможность нажать клавишу Backspace, чтобы удалить текст, а затем снова начать ввод. Кстати, это поведение, которое я хочу. Пользователь не может ничего вводить после достижения максимального лимита. :) Как я могу сделать так, чтобы пользователь нажал клавишу возврата, чтобы удалить, а затем снова начал вводить текст. Спасибо - person Basit; 02.05.2012
comment
@Basit Обновленный ответ. В Firefox непечатаемые символы не были нормализованы до нуля с помощью jQuery. Таким образом, вы должны вручную исключить это ( asciitable.com). - person Rob W; 02.05.2012
comment
Спасибо, Роб В.:) Но, пожалуйста, скажи мне, что ты использовал (e.which < 0x20) . Это означает, что все символы, такие как backspace, enter, tab, shift, которые нельзя распечатать. Я прав? Вы также сказали, что nonprintable characters were not normalized to zero by jQuery. Что вы подразумеваете под не нормализованным к 0? Не могли бы вы объяснить это мне? - person Basit; 02.05.2012
comment
@Basit 0x20 - это просто шестнадцатеричная запись для 32. Любой код ASCII ниже 32 не печатается. Предполагается, что event.which jQuery будет согласованным во всех браузерах. Это не так. В Chrome сообщается 0 для возврата, в Firefox сообщается 8. event.which для события keypress представляет свойство event.charCode, которое содержит символьный код ASCII нажатой клавиши (ноль, если это не символ). - person Rob W; 02.05.2012
comment
Хм, хорошо, но почему backspace не работал, когда мы использовали if(!event.which){return}. Почему это работает после использования event.which<0x20. В первом случае FF не может найти непечатаемые символы? Итак, мы явно сообщаем FF, используя <0x20? Я прямо сейчас? Могу ли я использовать здесь 32 вместо шестнадцатеричной записи. Спрашивать только о знаниях? Спасибо - person Basit; 02.05.2012
comment
Еще одна вещь после достижения максимального предела, если я нажму клавишу ввода, то он перейдет к следующей строке. Как я могу предотвратить нажатие клавиши ввода после достижения максимального предела. Вы также можете проверить это в своем опубликованном коде jsfiddle. Спасибо - person Basit; 02.05.2012
comment
@Basit ENTER имеет charCode 13. Просто добавьте это исключение: if (e.which < 0x20 && e.which != 13) { - person Rob W; 02.05.2012
comment
Он будет работать, когда пользователь вводит символы. Но это не работает, когда пользователь копирует и вставляет текст - person jeeva; 25.09.2013
comment
Спасибо! оно работает. Но возникли проблемы с мобильными телефонами. Можете ли вы понять это. - person Naveen Gogineni; 12.10.2017
comment
Но это обрезает последние символы, когда я ввожу любой символ между ними из-за подстроки - person Juke; 10.05.2019

<textarea maxlength="400"> </textarea>

Используйте приведенный выше код, чтобы ограничить количество символов, вставляемых в текстовую область, если вы хотите отключить саму текстовую область (т. е. не сможете редактировать ее впоследствии), вы можете использовать javascript/jquery, чтобы отключить ее.

person KBN    schedule 02.05.2012
comment
Черт, @RobW, пожалуйста, проверьте jsfiddle.net/ucb3n . РЕДАКТИРОВАТЬ: протестировано на Firefox 12.0, Chrome 18.0, IE9. Не работал на IE9. - person KBN; 02.05.2012
comment
Атрибут maxlength является новым для HTML5 и недоступен для Internet Explorer или Firefox ‹ 4. Тем не менее, +1, потому что это хорошее решение. - person Rob W; 02.05.2012
comment
@RobW, спасибо за эту информацию. И я искренне считаю, что пора всем нам использовать обновленные браузеры, за исключением, конечно, людей, которым это НУЖНО. - person KBN; 02.05.2012
comment
Пожалуйста, протестируйте решение в Firefox, Chrome и Safari. Это решение не работает в Firefox версии 51.0.1 (64-разрядная версия). - person Parik Tiwari; 02.02.2017
comment
Лучшее и гораздо более простое решение, чем принятый ответ. - person Max Voisard; 05.02.2020
comment
Будьте в курсе! Многие современные браузеры (в 2020 г.) сначала позволяют вводить текст, превышающий максимальную длину, но удаляют все символы, превышающие максимальную длину, когда фокус теряется, что может привести к усечению текста caniuse.com/#feat=maxlength - person denoise; 16.08.2020
comment
простое решение - person Santhosh; 17.11.2020

Будь проще

var max = 50;
$("#textarea").keyup(function(e){
$("#count").text("Characters left: " + (max - $(this).val().length));
});

и добавьте это в свой html

<textarea id="textarea" maxlength="50"></textarea>
<div id="count"></div>

просмотреть пример

person Joseph Fizzy Beats    schedule 19.02.2014
comment
Пожалуйста, протестируйте решение в Firefox, Chrome и Safari. Это решение не работает в Firefox версии 51.0.1 (64-разрядная версия). - person Parik Tiwari; 02.02.2017

Просто напишите этот код в файле Javascript. Но нужно указать атрибут «maxlength» с текстовой областью. Это будет работать для всей текстовой области страницы.

$('textarea').bind("change keyup input",function() {

        var limitNum=$(this).attr("maxlength");

        if ($(this).val().length > limitNum) {
            $(this).val($(this).val().substring(0, limitNum));
        }

    });
person ViPuL5    schedule 12.06.2013

Вы можете напрямую передать maxlength textarea, чтобы отключить себя. Но вы хотите отобразить соответствующее сообщение, затем используйте событие keyup для поведения по умолчанию и textarea length для вычисления символа и отображения подходящего сообщения.

HTML

<div id="count"></div>
<textarea class="max"  maxlength="250" id="tarea"></textarea>
<div id="msg"></div>

jQuery

$(function(){
    var max = parseInt($("#tarea").attr("maxlength"));
  $("#count").text("Characters left: " + max);
    $("#tarea").keyup(function(e){
        $("#count").text("Characters left: " + (max - $(this).val().length));
    if($(this).val().length==max)
        $("#msg").text("Limit Reached....");
        else
        $("#msg").text("");
    });
});

Демонстрационная скрипта

person GuRu    schedule 01.03.2016

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

Примеры

// applying a click event to one element

Touche(document.querySelector('#myButton')).on('click', handleClick);

// or to multiple at once

Touche(document.querySelectorAll('.myButtons')).on('click', handleClicks);

// or with jQuery

$('.myButtons').on('click', handleClicks);
person ProllyGeek    schedule 24.03.2015

Для тех, кто уже использует ES2015 в своих браузерах, вот реализация, использующая некоторые из приведенных выше ответов:

class InputCharacterCount {
  constructor(element, min, max) {
    this.element = element;
    this.min = min;
    this.max = max;
    this.appendCharacterCount();
  }

  appendCharacterCount(){
    let charCount = `<small class="char-counter help-block"></small>`;
    this.element.closest('.form-group').append(charCount);
  }

  count(event){
    this.element.attr('maxlength', this.max); // Add maxlenght attr to input element

    let value = this.element.val();
    this.element
      .closest('.form-group')
      .find('.char-counter')
      .html(value.length+'/'+this.max); // Add a character count on keyup/keypress

    if (value.length < this.min || value.length > this.max) { // color text on min/max changes
      this.element.addClass('text-danger');
    } else {
      this.element.removeClass('text-danger');
    }
  }
}

Применение:

let comment = $('[name="collection-state-comment"]');
let counter = new InputCharacterCount(comment, 21, 140);
$(comment).keyup(function(event){
  counter.count(event);
});
person Gus    schedule 03.06.2016

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

person arb    schedule 02.05.2012
comment
Ссылка выше не работает, используйте эту - person Parik Tiwari; 02.02.2017

person    schedule
comment
Привет и добро пожаловать в Stack Overflow! Совет: при публикации ответов рекомендуется объяснить, почему ваш ответ является хорошим подходом и как он работает. - person hat; 21.02.2019
comment
Пожалуйста, включите объяснение вашего кода и то, как он отвечает на вопрос. - person tshimkus; 21.02.2019