Не работает атрибут maxlength для многострочных textbox'ов
Доброго времени суток.
Я столкнулся со следующей проблемой:
Из-за того, что элемент <textbox multiline="true"> является лишь враппером элемента <html:textarea>, значения его атрибута maxlength и свойства maxLength молча игнорируются.
Поискав соответвующий баг или feature request в Багзилле, я не нашел ничего конструктивного по этой теме.
Перед тем, как самому создать feature request, решил задать здесь пару вопросов:
- Неужели эта функциональность никому не нужна? :)
- Есть ли всё же способ эмулировать этот атрибут?
С уважением,
Георгий Мирошников.
- Думаю, что да :) Единственное применение этому, которое я видел — отправление SMS'ок.
- Есть. Ставьте обработчик на событие input и обрезайте textbox.value.
ОК, тогда относительно способов эмуляции.
Раньше я делал так:
XUL: <textbox multiline="true" oninput="maxlength(this, 40)"/> JS: function maxlength(element, l) { if (!element || !element.value) return; if (l < 0) return; if (l == 0) { element.value = ''; return; } var selectionStart = element.selectionStart; var selectionEnd = element.selectionEnd; element.value = element.value.substring(0, l); if (selectionStart >= l + 1) selectionStart = l; if (selectionEnd >= l + 1) selectionEnd = l; element.selectionStart = selectionStart; element.selectionEnd = selectionEnd; }
Но всплыл новый баг:
Если текста настолько много, что появляется горизонтальный или вертикальный скроллбар, при переназначении свойства value он перематывается в начальное положение (крайнее левое и крайнее верхнее соответственно) и пользователь не видит текст, который печатает.
Я надеялся, что установка атрибута selectionStart / selectionEnd должа "перематывать" скроллбары в нужное положение, чтобы выделенный текст был видимым, но это не так :(
Кроме того, согласно этому багу, движок не предоставляет средств для программного управления скроллингом в многострочных текстбоксах.
Похоже, ситуация безвыходная :(
Что-ж, буду писать feature request.
Спасибо,
Георгий Мирошников.