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

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


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

Тестовая скрипта: http://jsfiddle.net/maniator/E527z/


person Naftali aka Neal    schedule 05.04.2012    source источник
comment
Вот ваш ответ с доказательством: whatwg.org/specs/web-apps/current-work/multipage/   -  person    schedule 05.04.2012


Ответы (1)


По неизвестным причинам jQuery всегда преобразует все новые строки в значении <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.

person Pointy    schedule 05.04.2012
comment
В результате maxlength для тегов ‹textarea› практически бесполезна, если ваш код на стороне сервера действительно имеет фиксированный максимальный размер для значения поля. Я смущен. Мне кажется, вы говорите, что jQuery сообщает о новых строках как об одном символе, но браузер правильно использует два символа. Если это так, разве атрибут maxlength не будет работать правильно и считать новые строки как два символа, а именно так данные будут сохранены на бэкэнде? - person wired_in; 29.10.2014
comment
@wired_in нет, потому что разработчики браузера - странные люди, и они, похоже, не понимают всего смысла maxlength (мое личное мнение). Я зарегистрировал ошибки в Firefox и WebKit, и количество причудливых неосведомленных возражений, которые я получил, просто поразительно. Реализации maxlength проверяют длину, возвращаемую .value, то есть длину без символов CR, которые вводятся при отправке формы. Я пошел дальше, и я просто буду придерживаться своего решения JavaScript. - person Pointy; 30.10.2014
comment
Реализации maxlength проверяют длину, возвращаемую .value, то есть длину без символов CR - все наоборот. maxlength подсчитывает CR + LF (чего нет в JavaScript) - как показано выше jsfiddle и в связанном вопросе. Итак, maxlength на самом деле правильно в отношении кода на стороне сервера, это проблема только в том случае, если вы также обрабатываете это с помощью JavaScript на стороне клиента. - person MrWhite; 06.09.2015
comment
@ w3d сейчас все может быть по-другому с тех пор, как я последний раз тестировал это, но в прошлом определенно было так, что (кроме IE, как ни странно) браузеры сообщали значение без возврата каретки, и это было то, что maxlength проверял - было обширное обсуждение ошибок, которое я зарегистрировал тогда как с людьми из Mozilla, так и с WebKit. - person Pointy; 06.09.2015
comment
@w3d w3d да Firefox и Chrome, похоже, теперь делают это правильно. - person Pointy; 06.09.2015
comment
@w3d, подожди, я беру свои слова обратно — см. этот чрезвычайно простой jsfiddle. Введите текст, в том числе с жестким возвратом, и посмотрите, сколько символов позволяет вам ввести Firefox. Firefox 40.0.3 явно обрабатывает жесткие возвраты как 1 символ, а не 2. - person Pointy; 06.09.2015
comment
Подтверждено: Chrome (текущий: 47.0.2526.111 и Canary: v50.0.2525.0) по-прежнему включает \r и \n при рассмотрении maxlength, и это действительно помогает со стандартом HTTP для новых строк POST как \r\n (ввод браузера соответствует серверу). FireFox и Internet Explorer (10 и выше, где была введена поддержка HTML5 textarea maxlength) не учитывают \r при применении maxlength, и в их случае проблема заключается в том, что если сервер следует тем же правилам для усечения данных (что является хорошей идеей при очистке входных данных, потому что maxlength легко обойти), то ввод сервера не совпадает. - person nothingisnecessary; 21.01.2016
comment
Я обновил скрипт JS, чтобы он обновлялся быстрее/на лету по мере ввода jsfiddle.net/E527z/ 35, но я не вижу ни одного браузера, обрабатывающего разрывы строк текстовой области как 2 символа (\r + \n) в JavaScript или при применении атрибута maxlength (включая Chrome до 65/67)... при отправке на сервер, разрывы строк удваиваются как \r\n, как и ожидалось по спецификациям. - person scunliffe; 03.04.2018
comment
@scanliffe Я отказался от попыток заставить разработчиков Chrome или FF понять проблему; в некотором смысле он не работает вплоть до спецификации, потому что в конечном итоге разработчики (обе группы) размахивали какой-то спецификацией. - person Pointy; 03.04.2018
comment
@Pointy Я согласен с тем, что один \n в мире браузера — это нормально, и что все бэкэнд-решения должны приводить \r\n к \n if, чего хочет бэкэнд/БД. Некоторые части истории Интернета озадачивают меня. Я получаю войну / против \ Unix против Microsoft в пути URL ... но ИМХО, \r\n было ошибкой. - person scunliffe; 03.04.2018
comment
@scanliffe Я тоже не понимаю, почему \r является обязательным, так что избавиться от этого тоже было бы неплохо. Просто странная ситуация. - person Pointy; 03.04.2018
comment
По неизвестным причинам этот пост, кажется, в какой-то степени объясняет: github.com/jquery-validation/jquery-validation/issues/ - person gb2d; 13.01.2021
comment
@ gb2d спасибо, но я уже давно перестал спорить с педантами, которые явно никогда не реализовывали настоящее веб-приложение :) - person Pointy; 13.01.2021