Отслеживание количества оставшихся символов всегда немного сложно. Хорошим событием для использования является keyup или нажатие клавиши, но оно не охватывает текст, который перетаскивается в элемент, поэтому люди в конечном итоге используют таймер.
Если у вас есть много элементов для мониторинга, рассмотрите возможность помещения их в массив, затем вызывайте таймер через каждый интервал и проверяйте все элементы. Будьте осторожны с производительностью, хотя запуск этой функции каждые 50 мс может значительно снизить производительность браузера, поэтому постарайтесь свести обработку к абсолютному минимуму.
Это означает, что вы можете кэшировать все, что можете, и сохранять логику простой.
Редактировать
Методы run
и stop
, приведенные ниже, можно использовать для запуска таймера, когда отдельные элементы получают фокус, а затем для его остановки, когда они теряют фокус. Таким образом, вы не тратите ресурсы, когда в этом нет необходимости.
/ Edit
var keyCountCheck = (function() {
var elementArray, timerRef;
return {
// Initialise once
init: function() {
var input, inputs;
// Initialise elementArray if hasn't been done already
// If adding and removing elements, create new aray
// instead each time.
if (!elementArray) {
elementArray = [];
inputs = document.getElementsByTagName('input');
for (var i=0, iLen=inputs.length; i<iLen; i++) {
input = inputs[i];
if (input.type == 'text') {
elementArray.push(input);
}
}
}
timerRef = window.setInterval(keyCountCheck.run, 50);
},
// Run timer
run: function() {
// If setInterval not running, start it
if (!timerRef) {
keyCountCheck.init();
}
var el;
for (var i=0, iLen=elementArray.length; i<iLen; i++) {
checkLength(elementArray[i]);
}
},
// In case there is a reason to stop this thing.
stop: function() {
if (timerRef) {
window.clearTimeout(timerRef);
timerRef = null;
}
}
};
}());
window.onload = keyCountCheck.init;
function checkLength(el) {
// Character limit can be set as a data- attribute or
// class or various other ways. This is the simple way
var limit = 10;
var msgEl = document.getElementById(el.id + '_limitMsg');
if (msgEl) {
msgEl.innerHTML = (limit - el.value.length) + ' characters left. ' + (new Date());
}
}
Некоторые поддерживают HTML для игры:
<input id="i0" value="1"><span id="i0_limitMsg"></span>
<br>
<input id="i1" value="2"><span id="i1_limitMsg"></span>
<br>
<button onclick="keyCountCheck.stop()">stop</button>
<button onclick="keyCountCheck.run()">run</button>