Оставшиеся символы текстовой области не работают должным образом

У меня есть текстовое поле с предварительно заполненным значением. Теперь я также установил строку «оставшийся символ» под текстовой областью.

Мне не удалось получить значение счетчика по умолчанию, если вы заметили, что при загрузке количество слов остается на уровне «осталось 250 символов», также обратите внимание, что значение уже предварительно заполнено некоторым текстом, поэтому функция должна подсчитывать предварительно заполненный текст по умолчанию.

Цвет текста меняется на желтый, если «осталось 100 символов», и на красный, если «осталось 0 символов». Кажется, что цвет не меняется на значение по умолчанию, когда я достигаю желтого цвета и начинаю удалять текст до более чем 100 символов.

Кто-нибудь может помочь?

document.addEventListener('keyup', function(event) {
  if (event.target.matches('textarea.minchar')) {
    let element = event.target;
    let value = element.value;
    let maxLength = element.maxLength;
    let rechar = element.nextElementSibling;

    rechar.innerText = `${maxLength - Number(value.length)} characters remaining`;

    if (maxLength - Number(value.length) == 0) {
      rechar.style.color = "#E01424";
    } else if (maxLength - Number(value.length) <= 100) {
      rechar.style.color = "#CF7721";
    }
  }
}, false);
<div class = "col-md-10 pl-0">
  <textarea cols = "15" rows = "4" placeholder = "Describe this Extra in brief for your guest" class = "minchar" maxlength = "250">Save time and return the vehicle at any fuel level. The price includes up to a full tank of petrol/diesel/charge.</textarea>
  <p class = "rechar" id = "test">250 characters remaining</p>
</div>

Вам нужен еще один блок else, чтобы установить rechar.style.color на черный (#000), так как вам нужно прослушивать событие удаления символа.

Cyval 28.05.2019 04:37

1. потому что вы слушаете keyup 2. вы не изменили цвет обратно.

apple apple 28.05.2019 04:37

@Cyval возможен предварительный просмотр?

BillNathan 28.05.2019 04:38
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
3
330
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Добавьте оператор else внизу и установите черный цвет следующим образом:

if (maxLength - Number(value.length) <= 0) {
  rechar.style.color = "#E01424";
} else if (maxLength - Number(value.length) <= 100) {
  rechar.style.color = "#CF7721";
} else { // You can add an if statement here to check if the color is #000 yet to prevent re-renders
  rechar.style.color = "#000";
}

Запуск события вручную в первый раз:

var evnt = document.createEvent('HTMLEvents');
evnt.initEvent('keyup', true, true); // Deprecated but still works
$('textarea.minchar').dispatchEvent(evnt);

@BillNathan Отредактировано с ответом, который вы хотите запустить при загрузке, это предполагает JQuery developer.mozilla.org/en-US/docs/Web/API/EventTarget/…developer.mozilla.org/en-US/docs/Web/API/Event/initEvent

abelito 28.05.2019 05:10

Почему вы думаете, что устаревшее решение будет лучшим?

k3llydev 28.05.2019 05:16

Я не знаю, поэтому я дал ссылку на документы

abelito 28.05.2019 05:19

Я проанализировал содержание вашего вопроса и нашел там более одной проблемы, решение которых даст вам открытый взгляд на происходящее. Позволь мне объяснить.

Сначала определите, что вы будете использовать в своем коде.

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

var textarea = document.querySelector(".minchar"),
    output = document.querySelector(".rechar");
var maxLength = +textarea.getAttribute("maxlength");

Теперь у нас есть текстовая область в переменной, выходной div в другой и максимальная длина, которую мы должны использовать.

Обработайте оставшиеся символы в функции.

Почему это вы можете спросить? Что ж, смотрите сами, насколько чище, читабельнее и проще меняется код. Таким образом, наличие простой функции, единственной задачей которой является обновление remaining characters output, позволит вам запускать функцию всякий раз, когда вы хотите ее обновить. Это может быть нажатие клавиши, изменение текстовой области или даже когда сайт загружается:

Функция:

function outputRemainingCharacters(){
    let used = textarea.value.length;
    output.innerText = `${maxLength - +used} characters remaining`;
}

Добавление функции в прослушиватель событий сразу после завершения загрузки веб-сайта:

window.onload = outputRemainingCharacters;

Так просто, он обновит ваше значение с самого начала.

Добавьте условие по умолчанию в оператор if.

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

textarea.addEventListener('keydown', function(event) {

    outputRemainingCharacters();
    let used = textarea.value.length;
    if (maxLength - used == 0) {
        output.style.color = "#E01424";
    } else if (maxLength - used <= 100) {
        output.style.color = "#CF7721";
    } else {
        output.style.color = "#000"; //Default color
    }

});

Как видите, прослушиватель событий стал намного чище. Я бы также рекомендовал:

Use event listeners for the specific event on the specific element you need.

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

Примечание: Вы должны использовать прослушиватель событий keydown вместо keyup. Это связано с тем, что удерживание клавиши не вызовет событие, пока клавиша не будет нажата. keydown здесь будет точнее. Попробуйте удерживать клавишу пробела во время записи в текстовое поле в следующем фрагменте и посмотрите, что произойдет.

Проверьте этот пример:

var textarea = document.querySelector(".minchar"),
    output = document.querySelector(".rechar");
var maxLength = +textarea.getAttribute("maxlength");

function outputRemainingCharacters(){
    let used = textarea.value.length;
    output.innerText = `${maxLength - +used} characters remaining`;
}

textarea.addEventListener('keydown', function(event) {

    outputRemainingCharacters();
    let used = textarea.value.length;
    if (maxLength - used == 0) {
        output.style.color = "#E01424";
    } else if (maxLength - used <= 100) {
        output.style.color = "#CF7721";
    } else {
        output.style.color = "#000"; //Default color
    }

});

window.onload = outputRemainingCharacters;
<div class = "col-md-10 pl-0">
  <textarea cols = "15" rows = "4" placeholder = "Describe this Extra in brief for your guest" class = "minchar" maxlength = "250">Save time and return the vehicle at any fuel level. The price includes up to a full tank of petrol/diesel/charge.</textarea>
  <p class = "rechar" id = "test">250 characters remaining</p>
</div>

Это мило! А что, если я также хочу выбрать синий цвет по умолчанию вместо черного?

BillNathan 28.05.2019 05:36

@BillNathan Всегда рад помочь. Для этого конкретного вопроса просто используйте соответствующее значение шестнадцатеричное значение, RGB или значение цвета по вашему желанию. Этот инструмент может быть полезен. То есть, для самого яркого синего #00F значение.

k3llydev 28.05.2019 05:41
Ответ принят как подходящий

Если вы хотите сделать это с помощью jQuery, ниже следует сделать то же самое.

Фрагмент HTML:

    <label class = "col-md-12 pl-0">Description</label>
<div class = "col-md-10 pl-0">
  <textarea cols = "75" rows = "5" class = "minchar" maxlength = "250" placeholder = "Describe this Extra in brief for your guest">Save time and return the vehicle at any fuel level. The price includes up to a full tank of petrol/diesel/charge.</textarea>
  <p class = "rechar"></p>
  </div>

Фрагмент jQuery:

$('.minchar').on('input', function(e){
    e.stopPropagation();
  // Get Length
  var txtLength = $(e.currentTarget).val().length;
  // Get Remaining Length
  var txtLengthRemaining = 250 - txtLength;
  // Create HTML String
  var strHtml = txtLengthRemaining+" characters remaining";
  // Fill the String & Color based on below conditions
  if (txtLengthRemaining <= 0) {
    $('.rechar').css('color', '#E01424').html(strHtml);
  } else if (txtLengthRemaining <= 100) {
    $('.rechar').css('color', '#CF7721').html(strHtml);
  } else {
    $('.rechar').css('color', '#737373').html(strHtml);
  }
});  
// Trigger event on page load by default.
$('.minchar').trigger('input');

JSFiddle: http://jsfiddle.net/nh147uaf/2/

Другие вопросы по теме