Модифицировать скрипт для работы с несколькими формами на одной странице
Есть простейший скрипт, подсчитывающий количество знаков в поле textarea. Вот он:
<!doctype html> <html> <head> <script> function countChars(name) { var els = document[name].getElementsByTagName("textarea"); for (var i = 0; i < els.length; i++) els[i].onkeyup = function () { document[name]['field' + this.name].value = this.value.length; }; } </script> <title>Счетчик</title> </head><body> <div class="wrap"> <form action="script.cgi" method="post" name="new_record" id="web"> <fieldset><label for="text">Текст <br><span class="ta_count">знаков <input type="text" name="fieldtext" disabled></span></label> <textarea id="text" name="text" placeholder="" required></textarea> </fieldset> <script>countChars('new_record');</script> <input type="submit" value="Добавить запись"> <input type="reset" value="Сброс"> </form> </div> </body></html> Возникла необходимость работать с несколькими одинаковыми формами на странице. Вот так, например: <!doctype html> <html> <head> <script> function countChars(name) { var els = document[name].getElementsByTagName("textarea"); for (var i = 0; i < els.length; i++) els[i].onkeyup = function () { document[name]['field' + this.name].value = this.value.length; }; } </script> <title>Счетчик</title> </head><body> <div class="wrap"> <form action="script.cgi" method="post" name="new_record" id="web"> <fieldset><label for="text">Текст <br><span class="ta_count">знаков <input type="text" name="fieldtext" disabled></span></label> <textarea id="text" name="text" placeholder="" required></textarea> </fieldset> <script>countChars('new_record');</script> <input type="submit" value="Добавить запись"> <input type="reset" value="Сброс"> </form> <form action="script.cgi" method="post" name="new_record" id="web"> <fieldset><label for="text">Текст <br><span class="ta_count">знаков <input type="text" name="fieldtext" disabled></span></label> <textarea id="text" name="text" placeholder="" required></textarea> </fieldset> <script>countChars('new_record');</script> <input type="submit" value="Добавить запись"> <input type="reset" value="Сброс"> </form> </div> </body></html> Изменить названия и идентификаторы форм, а также поля "text" нельзя, а поля, где отображаются счетчики - можно. Например, можно их пронумеровать. Непонятно как изменить скрипт. Пробовал так, но не работает: function countChars(name, number) { ... document[name]['field' + this.name + number].value = this.value.length; Подскажите, пожалуйста, как работать с несколькими формами на одной странице в данном случае? |
javascript_pupil,
<!doctype html> <html> <head> <meta charset="utf-8"> <script> window.addEventListener('DOMContentLoaded', function() { [].forEach.call(document.querySelectorAll('form'), function(form) { form.addEventListener('input', function() { form.fieldtext.value = form.text.value.length; }); }); }); </script> <title>Счетчик</title> </head><body> <div class="wrap"> <form action="script.cgi" method="post" name="new_record" id="web"> <fieldset><label for="text">Текст <br><span class="ta_count">знаков <input type="text" name="fieldtext" disabled></span></label> <textarea id="text" name="text" placeholder="" required></textarea> </fieldset> <script>countChars('new_record');</script> <input type="submit" value="Добавить запись"> <input type="reset" value="Сброс"> </form> <form action="script.cgi" method="post" name="new_record" id="web"> <fieldset><label for="text">Текст <br><span class="ta_count">знаков <input type="text" name="fieldtext" disabled></span></label> <textarea id="text" name="text" placeholder="" required></textarea> </fieldset> <script>countChars('new_record');</script> <input type="submit" value="Добавить запись"> <input type="reset" value="Сброс"> </form> </div> </body></html> |
Это просто чудо какое-то! :) Жаль только, что не всё в нем понятно. И есть еще одна проблемка. Форму для примера я сильно упростил для наглядности. Но дело в том, что в реальной форме есть несколько полей textarea и в javascript'е надо их формировать "на лету". Вот это и непонятно как?
Когда поле одно, то работает form.fieldtext.value = form.text.value.length; А когда там еще и fieldtext2 и text2, то они разумеется не подсчитываются, т.к. имена у них уже другие. У меня вот эта строка именно такой и была из-за этого: document[name]['field' + this.name].value = this.value.length; Т.к. "this" был разный у разных полей. Т.е. в форме, например, 3 textarea с разными именами. Пока форма была одна на странице - у меня все работало, как только их потребовалось больше одной - перестало. А все счетчики формировались с ключевым словом field для возможности последующей обработки как javascript, так и в CSS. |
Т.е. такая конструкция уже не работает.
<!doctype html> <html> <head> <meta charset="utf-8"> <script> function countChars(name) { window.addEventListener('DOMContentLoaded', function() { [].forEach.call(document.querySelectorAll('form'), function(form) { form.addEventListener('input', function() { form.fieldtext.value = form.text.value.length; }); }); }); } </script> <title>Счетчик</title> </head><body> <div class="wrap"> <form action="script.cgi" method="post" name="new_record" id="web"> <fieldset><label for="text">Текст <br><span class="ta_count">знаков <input type="text" name="fieldtext" disabled></span></label> <textarea id="text" name="text" placeholder="" required></textarea> </fieldset> <fieldset><label for="note">Примечание <br><span class="ta_count">знаков <input type="text" name="fieldnote" disabled></span></label> <textarea id="text" name="note" placeholder="" required></textarea> </fieldset> <script>countChars('new_record');</script> <input type="submit" value="Добавить запись"> <input type="reset" value="Сброс"> </form> <form action="script.cgi" method="post" name="new_record" id="web"> <fieldset><label for="text">Текст <br><span class="ta_count">знаков <input type="text" name="fieldtext" disabled></span></label> <textarea id="text" name="text" placeholder="" required></textarea> </fieldset> <fieldset><label for="note">Примечание <br><span class="ta_count">знаков <input type="text" name="fieldnote" disabled></span></label> <textarea id="text" name="note" placeholder="" required></textarea> </fieldset> <script>countChars('new_record');</script> <input type="submit" value="Добавить запись"> <input type="reset" value="Сброс"> </form> </div> </body></html> |
javascript_pupil, вызывать скрипт, который ниже в коде, повторно не нужно. достаточно одной таблетки!
<!doctype html> <html> <head> <meta charset="utf-8"> <script> document.addEventListener("input", function(a) { a = a.target; var b; "TEXTAREA" == a.tagName && (b = a.parentNode.querySelector("input")) && (b.value = a.value.length) }); </script> <title>Счетчик</title> </head><body> <div class="wrap"> <form action="script.cgi" method="post" name="new_record" id="web"> <fieldset><label for="text">Текст <br><span class="ta_count">знаков <input type="text" name="fieldtext" disabled></span></label> <textarea id="text" name="text" placeholder="" required></textarea> </fieldset> <fieldset><label for="note">Примечание <br><span class="ta_count">знаков <input type="text" name="fieldnote" disabled></span></label> <textarea id="text" name="note" placeholder="" required></textarea> </fieldset> <input type="submit" value="Добавить запись"> <input type="reset" value="Сброс"> </form> <form action="script.cgi" method="post" name="new_record" id="web"> <fieldset><label for="text">Текст <br><span class="ta_count">знаков <input type="text" name="fieldtext" disabled></span></label> <textarea id="text" name="text" placeholder="" required></textarea> </fieldset> <fieldset><label for="note">Примечание <br><span class="ta_count">знаков <input type="text" name="fieldnote" disabled></span></label> <textarea id="text" name="note" placeholder="" required></textarea> </fieldset> <input type="submit" value="Добавить запись"> <input type="reset" value="Сброс"> </form> </div> </body></html> |
Я не перестаю удивляться. :) Спасибо, сейчас всё работает. :)
Что касается "одной таблетки". Дело в том, что сам javascript находится во внешнем файле, его нет на странице. Формы же формируются динамически и не во всех из них есть textarea. Если же она присутствует, то следом за ней автоматически вставляется <script>countChars('new_record');</script> Надо же его как-то вызвать. Можно конечно сделать чтобы повторных вызовов не было. Они на что-то влияют? И как я понимаю 'new_record' теперь не требуется, достаточно countChars()? |
javascript_pupil,
зачем нужны повторные вызовы и какая разница как будет загружен скрипт ... Цитата:
|
Уберу, а то меня уже совесть замучила, что программа их лишний раз вставляет. :)
Еще хотел спросить, почему обязательно писать в верхнем регистре TEXTAREA? Интересно прочитать, но не знаю что искать. В JavaScript Фленагана (5 издание) мне такое не попадалось. |
Цитата:
|
Часовой пояс GMT +3, время: 18:22. |