У меня есть страница JSP с фрагментом кода проверки Javascript, который ограничивает определенное количество символов при отправке. Я использую <textarea>, поэтому я не могу просто использовать атрибут длины, как в <input type = "text">.
Я использую document.getElementById("text").value.length, чтобы получить длину строки. Я использую Firefox 3.0 в Windows (но я тестировал это поведение и с IE 6). Форма отправляется сервлету J2EE. В моем сервлете Java длина строки параметра больше 2000!
Я заметил, что это можно легко воспроизвести, добавив в <textarea> символы возврата каретки. Я использовал Firebug для определения длины <textare>, и на самом деле она составляет 2000 символов. На стороне Java возврат каретки преобразуется в стиль UNIX (\r\n вместо \n), поэтому длина строки отличается!
Я упустил что-то очевидное или что? Если нет, то как бы вы надежно (кросс-платформенный / браузер) удостоверились, что <textarea> ограничен.
просто наткнулся на такую ситуацию. ваша тема сделала мой день, сэр! большое спасибо!




Вы особенно заботитесь о том, какие окончания строк используются? Почему бы просто не заставить Java конвертировать "\ r \ n" в "\ n"? (Обратите внимание, что «\ r \ n» - это стиль Windows; «\ n» - стиль Unix.)
В качестве альтернативы сделайте обратное при проверке длины в JavaScript.
ОК. Я понял. Я предполагаю, что это означает, что Javascript всегда представляет собой возврат каретки способом UNIX внутри и через его API (например, length()). Каким-то образом меня конвертируют в \r\n, потому что виртуальная машина Java работает в Windows. Хотелось бы, чтобы он был более однородным ...
Я не знаю, какие правила будут применяться в разных браузерах к сервлетам, но нормализация в любом случае должна устранить различия. Кстати, на Mac тоже стоит попробовать, где \ r - нормальный перенос строки.
+1 Просто удалите все "\ r", и все будут счастливы, какую бы платформу вы ни использовали. Mac включены.
Вы ограничиваете его до 2000 символов, чтобы он помещался в столбец nvarchar (2000) в базе данных? В противном случае, возможно, просто разрешите перерасход 2% для гибкости на стороне Java.
И Java должна использовать Unicode UTF16 для представления строк. Этот /r должен быть где-то еще, может быть, преобразование в веб-браузере при отправке? Вы пробовали разные браузеры? На разных платформах? Возможно, вам просто придется удалить /r.
На самом деле это не проблема JavaScript (или Java) - оба уровня сообщают точную длину строки, с которой имеют дело. Проблема в вашем случае заключается в том, что строка преобразуется во время передачи HTTP.
Если вам абсолютно необходимо убедиться, что длина строки не превышает определенной длины, вы можете имитировать это преобразование на клиенте, заменив каждый экземпляр «\ n» на «\ n \ r» - но только для целей проверки длины:
textarea.value.replace(/\n/g, "\r\n").length
Примечание: код должен быть textarea.value.replace(/\n/g, "\n\r").length, чтобы найти все вхождения. Исходный код ищет только первое совпадение.
Это должен быть "\r\n", а не "\n\r".
Чтобы помнить, что правильным порядком является \r\n, помните, что \r означает возврат каретки (Cr), а \n означает (новая) перевод строки (Lf) в CrLf.
Я думаю, вам нужно выполнить преобразование / проверку окончания строки как на клиенте, так и на сервере, потому что вы не знаете, какие окончания строки будет использовать клиентский браузер (Firefox отправляет \ n даже в Windows), и если вы разрабатываете серверную часть в Windows и развернуть в Linux, то окончание строк будет обрабатываться по-другому.
@ François: Всегда заключайте элементы в скобки тегов в обратные галочки (например, форматируйте их как код), иначе они будут удалены при отображении вашего вопроса.