У меня есть текстовое поле с предварительно заполненным значением. Теперь я также установил строку «оставшийся символ» под текстовой областью.
Мне не удалось получить значение счетчика по умолчанию, если вы заметили, что при загрузке количество слов остается на уровне «осталось 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>
1. потому что вы слушаете keyup 2. вы не изменили цвет обратно.
@Cyval возможен предварительный просмотр?
Добавьте оператор 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
Почему вы думаете, что устаревшее решение будет лучшим?
Я не знаю, поэтому я дал ссылку на документы
Я проанализировал содержание вашего вопроса и нашел там более одной проблемы, решение которых даст вам открытый взгляд на происходящее. Позволь мне объяснить.
Это поможет вам лучше понять код, определив сначала полезные переменные. Так что вам не придется звонить им снова и снова. Итак, я предлагаю вам определить ссылки на элементы 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;
Так просто, он обновит ваше значение с самого начала.
Это связано с тем, что если вы не добавите значение по умолчанию, вы никогда не сможете вернуться к значение по умолчанию, как вы упомянули:
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 Всегда рад помочь. Для этого конкретного вопроса просто используйте соответствующее значение шестнадцатеричное значение, RGB или значение цвета по вашему желанию. Этот инструмент может быть полезен. То есть, для самого яркого синего #00F
значение.
Если вы хотите сделать это с помощью 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/
Вам нужен еще один блок
else
, чтобы установитьrechar.style.color
на черный (#000
), так как вам нужно прослушивать событие удаления символа.