Почему Javascript только возвращает кавычку как один символ, когда он равен двум?

Это ответ на этот вопрос: Chrome считает символы неправильными в textarea с атрибутом maxlength


В этом вопросе было обнаружено, что Javascript считает, что возврат каретки - это один символ, когда на самом деле это два (\r\n), почему?

Test Fiddle: http://jsfiddle.net/maniator/E527z/

Ответ 1

По неизвестным причинам jQuery всегда преобразует все символы новой строки в значение a <textarea> в один символ. То есть, если браузер дает ему \r\n для новой строки, jQuery делает это как раз \n в возвращаемом значении .val(). (На самом деле причина, вероятно, не "неизвестна", вероятно, для нормализации результатов в браузерах, потому что IE сообщает, что символы новой строки имеют длину 2 символа.)

Chrome и Firefox оба подсчитывают длину тегов <textarea> одинаково для целей "maxlength".

Однако спецификация HTTP настаивает на том, что символы новой строки будут представлены как \r\n. Таким образом, jQuery, webkit и Firefox все ошибаются. Когда поле опубликовано, webkit и Firefox правильно добавляют новые строки!

В результате получается, что "maxlength" в тегах <textarea> практически бесполезно, если ваш серверный код действительно имеет фиксированный максимальный размер для значения поля.

Изменить. Это все еще проблема в 2015 году - по крайней мере, в Chrome 45.0.2454 и IE 11.0.9600.