Обратный отсчет доступных мест в текстовой области с помощью jquery или другого?

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

Я нашел этот плагин jquery; плагин максимальной длины jquery

Он делает именно то, что мне нужно, но кажется излишним, я не уверен в размере файла, но похоже, что для такой простой задачи много строк кода, как вы думаете, мне было бы лучше использовать метод, отличный от jquery ? Причина, по которой я думал, что jquery — это то, что нужно, заключается в том, что jquery уже включен на все мои страницы UPDATE;

Я только что нашел этот метод, отличный от jquery, который делает то же самое, но занимает меньше места, так что будет ли это лучшим методом?

<script language="javascript" type="text/javascript">
function limitText(limitField, limitCount, limitNum) {
   if (limitField.value.length > limitNum) {
    limitField.value = limitField.value.substring(0, limitNum);
   } else {
    limitCount.value = limitNum - limitField.value.length;
   }
}
</script>

You have 
<input readonly type="text" name="countdown" size="3" value="1000">
characters left.

person JasonDavis    schedule 09.08.2009    source источник
comment
stackoverflow.com/questions/2136647/   -  person Connor Leech    schedule 17.10.2013
comment
@ConnorLeech Это 5 лет   -  person JasonDavis    schedule 17.10.2013
comment
Я бы предложил этот плагин, который активно поддерживается: mimo84.github.io/bootstrap-maxlength : я автор   -  person Mimo    schedule 03.03.2014


Ответы (8)


Очень просто в jQuery:

<textarea id="myTextarea"></textarea>
<p id="counter"></p>

<script type="text/javascript">
$('#myTextarea').keyup(function () {
    var left = 200 - $(this).val().length;
    if (left < 0) {
        left = 0;
    }
    $('#counter').text('Characters left: ' + left);
});
</script>

Замените 200 любым вашим пределом.

Обратите внимание, что это не ограничивает фактический ввод текста, он просто ведет обратный отсчет. Вам нужно проверить длину ввода на стороне сервера, это просто визуальный помощник.

Кроме того, я не думаю, что вам даже следует пытаться ограничивать длину ввода, запрещая любой ввод, когда предел достигнут. Это боль в тылу с точки зрения удобства использования, и на нее нельзя полагаться в любом случае. Простой обратный отсчет и проверка на стороне сервера - лучший вариант ИМХО.

person deceze♦    schedule 09.08.2009
comment
Всем, кто реализует это, я бы рекомендовал использовать bind("propertychange input textInput") вместо keyup. Эти события будут обнаруживать все формы ввода, а не только с клавиатуры. - person Andy E; 29.10.2011
comment
Или вместо .bind(), начиная с jQuery 1.7, метод .on() предоставляет все функциональные возможности, необходимые для присоединения обработчиков событий, и является предпочтительным. $('#myTextarea').on("propertychange input textInput", funtion() {...});. См. принятый ответ здесь для получения дополнительной информации. - person chrisjleu; 19.06.2012
comment
Textarea не может иметь идентификатор. - person Charlie; 30.04.2014
comment
@Charlie У тебя есть доказательства этого утверждения? developer.mozilla.org/en-US/docs/Web/HTML/ Глобальные_атрибуты - person deceze♦; 30.04.2014
comment
Я где-то читал об этом, и каждый раз, когда я использую инструмент проверки HTML, он всегда вызывает истерику по этому поводу. Я знаю, что это работает, но я предполагал, что текстовой области не разрешено иметь идентификатор. Я мог ошибаться, и я должен был спросить: «Может ли текстовая область иметь идентификатор?». - person Charlie; 30.04.2014
comment
@Charlie Может, по крайней мере, в HTML 5. Но, насколько я знаю, и раньше. - person deceze♦; 30.04.2014
comment
Глупая проверка HTML! - person Charlie; 30.04.2014
comment
Чтобы ограничить длину ввода, вы можете добавить эту строку непосредственно под левой = 0; $(this).val($(this).val().substring(0, 200)); - person Alan B. Dee; 09.01.2016
comment
Как загрузить файл, отображающий содержимое # counter? Извините за португальский комментарий выше - person deleting; 17.05.2017

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

<script type="text/javascript">
$(document).ready(function(){
    $('textarea[maxLength]').each(function(){
        var tId=$(this).attr("id");
        $(this).after('<br><span id="cnt'+tId+'"></span>');
        $(this).keyup(function () {
            var tId=$(this).attr("id");
            var tMax=$(this).attr("maxLength");//case-sensitive, unlike HTML input maxlength
            var left = tMax - $(this).val().length;
            if (left < 0) left = 0;
            $('#cnt'+tId).text('Characters left: ' + left);
        }).keyup();
    });
});
</script>
<textarea id="myTextarea" maxLength="200">Initial text lorem ipsum blah blah blah</textarea><br><br>
<textarea id="mySecondTextarea" maxLength="500"></textarea><br><br>
<textarea id="textareaWithoutCounter"></textarea>
person gordon    schedule 13.12.2011
comment
В то время как вставки клавиатуры CTRL-V запускают обратный отсчет, вставки мыши этого не делают. Я сделал функцию обновления текста обратного отсчета, а затем вызвал ее с помощью клавиш и размытия: $(this).keyup(function(){myFcn(this)}).blur(function(){myFcn(this)}).keyup(); и function myFcn(argE){ var tId=$(argE).attr("id"); var tMax=$(argE).attr("maxLength"); var left = tMax - $(argE).val().length; if (left < 0) left = 0; $(argE).val( $(argE).val().substr(0,tMax) ); $('#cnt'+tId).text('Characters left: ' + left); } Попытка обработать событие вставки стала для меня уродливой. - person gordon; 07.06.2012
comment
Конечно, настоящие браузеры, такие как FireFox, теперь распознают атрибут textarea maxLength :) - person gordon; 23.04.2013

Я использовал плагин Aaron Russell simply countable jQuery с успех

Простое использование:

$('#my_textarea').simplyCountable();

Расширенное использование:

$('#my_textarea').simplyCountable({
    counter: '#counter',
    countable: 'characters',
    maxCount: 140,
    strictMax: false,
    countDirection: 'down',
    safeClass: 'safe',
    overClass: 'over',
    thousandSeparator: ','
});
person Ryan McGeary    schedule 26.01.2010
comment
спасибо за ответ, я рассматривал много вариантов, но этот плагин действительно огромен для такой простой задачи - person JasonDavis; 26.01.2010
comment
Я также использовал этот плагин - очень хорошо! Лично я не возражаю против размера файла, так как этот плагин предлагает так много надежных функций для подсчета/ограничения слов и символов. - person Chris Jacob; 28.07.2011

Я использовал jQuery и ответ от deceze, а затем настроил его, чтобы дать мне обратный отсчет в стиле твиттера, чтобы пользователи могли видеть, сколько они прошли, и соответствующим образом корректировать свой текст. Я также поместил его в отдельную функцию, чтобы вызывать его из другой функции, которая иногда автоматически заполняла текстовое поле:

    function reCalcToText() {
        var left = 200 - $('.toText').val().length;
        if (left < 0) {
            $('#counter').text(left);
            $('#counter').addClass("excess");
        } else {
            $('#counter').text(left);
            $('#counter').removeClass();
        }
    }
    function onReady() {
                  $('#<%= toText.ClientID %>').keyup(function() {
            reCalcToText();
        });
    };
person Falkayn    schedule 30.09.2009

Поэтому я взял версию @deceze и добавил к ней небольшой трюк:

  • показывать всегда, а не только когда пользователь начинает печатать,
  • показывать минус, когда лимит закончился, и
  • добавить класс - чтобы раскрасить текст - когда он превышает лимит (для этого, конечно, нужен дополнительный css)

    $(document).ready(function(){
        var left = 200
        $('#field_counter').text('Characters left: ' + left);
    
            $('#id_description').keyup(function () {
    
            left = 200 - $(this).val().length;
    
            if(left < 0){
                $('#field_counter').addClass("overlimit");
            }
            if(left >= 0){
                $('#field_counter span').removeClass("overlimit");
            }
    
            $('#field_counter').text('Characters left: ' + left);
        });
    });
    

Для тех, кому нужно то же, что и мне :)

person Christoffer    schedule 06.03.2012

Используя jQuery, предполагая, что у вас есть текстовое поле с идентификатором field, которое вы хотите ограничить 100 символами, и еще один элемент с идентификатором chars-remaining для отображения количества доступных символов :

var max = 100;
$('#field').keyup(function() {
    if($(this).val().length > max) {
        $(this).val($(this).val().substr(0, max));
    }
    $('#chars-remaining').html((max - $(this).val().length) + ' characters remaining');
});
person bryan    schedule 09.08.2009

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

function DisplayCharactersLeft(idOfInputControl) {
    var maxNumberOfCharacters = $("#" + idOfInputControl).attr("maxLength");

    $("#" + idOfInputControl).on("input", function () {
        var currentText = $(this).val();
        var numberOfNewLines = GetNumberOfNewLines(currentText);

        var left = maxNumberOfCharacters - (currentText.length + numberOfNewLines);
        if (left < 0) { left = 0; }
        $("#" + idOfInputControl + "CharactersLeftCounter").text("Characters left: " + left);
    });

}    

function GetNumberOfNewLines(text) {

    var newLines = text.match(/(\r\n|\n|\r)/g);
    var numberOfNewLines = 0;
    if (newLines != null) {
        numberOfNewLines = newLines.length;
    }
    return numberOfNewLines;
}
person trainer    schedule 12.10.2015

person    schedule
comment
При ответе, чтобы сделать его хорошим и полезным, вам также необходимо объяснить, как использовать ваш код. - person ZygD; 29.03.2015
comment
@ZygD На этот вопрос отвечали так много раз с тех пор, как я впервые опубликовал его в 2009 году !! В любом случае приятно видеть разные подходы к одному и тому же результату. Мне нравится идея отключить кнопку отправки, когда в текстовом поле слишком много символов! На основе этого ответа я только что создал эту демонстрацию JSFiddle... jsfiddle.net/jasondavis/ht7qdL3m - person JasonDavis; 29.03.2015
comment
я просто пытаюсь написать запрос, такой как твиттер, я также работаю над некоторыми различными аспектами твиттера, например, когда символы входят в значение -ve. текст textarea выделен красным цветом - person Mujahid Ali; 06.04.2015