Используйте классы для выбора текстовых полей и динамически переходите из обработчика к связанному элементу caption
. Например, если они расположены рядом, вы можете использовать .next()
:
const maxLength = 100;
function showRemaining() {
const currLength = $(this).val().length;
const remaining = maxLength - currLength;
$(this).next().text(remaining + ' characters');
}
$('.caption').on('input', showRemaining);
$('.caption').trigger('input');
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<textarea class="caption" rows="5"></textarea>
<div></div>
<textarea class="caption" rows="5"></textarea>
<div></div>
<textarea class="caption" rows="5"></textarea>
<div></div>
<textarea class="caption" rows="5"></textarea>
<div></div>
Это довольно тривиально для выполнения sh без jQuery, если только это не необходимо для чего-то еще, не стесняйтесь удалять его как зависимость:
const maxLength = 100;
function showRemaining() {
const currLength = this.value.length;
const remaining = maxLength - currLength;
this.nextElementSibling.textContent = remaining + ' characters';
}
for (const caption of document.querySelectorAll('.caption')) {
caption.addEventListener('input', showRemaining);
caption.dispatchEvent(new Event('input'));
}
<textarea class="caption" rows="5"></textarea>
<div></div>
<textarea class="caption" rows="5"></textarea>
<div></div>
<textarea class="caption" rows="5"></textarea>
<div></div>
<textarea class="caption" rows="5"></textarea>
<div></div>