Javascript-форум (https://javascript.ru/forum/)
-   Элементы интерфейса (https://javascript.ru/forum/dom-window/)
-   -   Подсчет "реальной" длины текста в textarea (https://javascript.ru/forum/dom-window/9760-podschet-realnojj-dliny-teksta-v-textarea.html)

modernx 04.06.2010 13:38

Подсчет "реальной" длины текста в textarea
 
1) В БД хранится описание некоторого объекта, размер поля ограничен, предположим, 1000 символов.
2) В форме пытаюсь осуществить предварительную валидацию по длине текста в TEXTAREA с помощью JS (document.form.info.value.length)

Переносы строк в Chrome подсчитываются как 1 символ, в IE - как 2 символа. В php-скрипт же (метод POST) передается реальная строка, в которой переносы выглядят как "\r\n" (4 символа).

Вопрос: Подскажите новичку, как правильно подсчитать с помощью JS дину текста в textarea, которую получит php-скрипт. Спасибо!

Gvozd 04.06.2010 15:06

Цитата:

Сообщение от modernx
переносы выглядят как "\r\n" (4 символа).

это два символа

micscr 04.06.2010 16:16

Вот этому значению
document.form.info.value.length

можете доверять.
Разница в том какие символы какой браузер вставляет чтобы обозначить конец строки. IE вставляет \r\n, а Chrome - только \n. Но эти же символы в php и уйдут.

p.s. jQuery метод val() стандартизирует этот разнобой - удаляет \r

modernx 04.06.2010 16:51

Цитата:

Сообщение от Gvozd
переносы выглядят как "\r\n" (4 символа).
это два символа

посчитайте вручную, если не верите :) Строка передается как она есть:
Код
echo $_POST['info'];
echo "(".strlen(utf8_decode($_POST['info'])).")"; return;

Выдает: 1\r\n\r\n(9)

Цитата:

Сообщение от micscr
jQuery метод val() стандартизирует этот разнобой - удаляет \r

Это лишь часть решения, которая реализует кроссбраузерность подсчета на стороне клиента. В любом случае, серверный скрипт получает свои "\r\n" хоть их хрома, хоть из ие (пробовал вот так даже сделать перед отправкой $('#tinfo').val($('#tinfo').val());)

Kolyaj 04.06.2010 17:16

Цитата:

Сообщение от modernx
Выдает: 1\r\n\r\n(9)

stripslashes не забыли?

micscr 04.06.2010 17:27

Цитата:

Сообщение от modernx (Сообщение 57874)
посчитайте вручную, если не верите :)

А зачем мне верить? Я знаю, что
echo strlen("\r\n");
выведет 2
Цитата:

Сообщение от modernx (Сообщение 57874)
Строка передается как она есть:
Код
echo $_POST['info'];
echo "(".strlen(utf8_decode($_POST['info'])).")"; return;
Выдает: 1\r\n\r\n(9)

а вот то что приходят данные искаженные наводит на мысль о например включенных magic_quotes.
Kolyaj, выше подсказал, что нужно лишнее экранирование убрать.

modernx 04.06.2010 17:29

Цитата:

Сообщение от Kolyaj
stripslashes не забыли?

чтобы на выходе получить 1rnrn ? Зачем?

modernx 04.06.2010 17:31

Цитата:

Сообщение от micscr
а вот то что приходят данные искаженные наводит на мысль о например включенных magic_quotes.

Вот такой код у меня в шапке:
function slashes(&$el)
{
if (is_array($el))
foreach($el as $k=>$v)
slashes($el[$k]);
else $el = stripslashes($el);
}

if (ini_get('magic_quotes_gpc'))
{
slashes($_GET);
slashes($_POST);
slashes($_COOKIE);
}

micscr 04.06.2010 17:41

А ты проверь - включены ли у тебя и выполняется ли
if (ini_get('magic_quotes_gpc'))
{
 // этот код
}


потому что я вообще проверяю так:
if (get_magic_quotes_gpc()) {
...
}


Цитата:

чтобы на выходе получить 1rnrn ? Зачем?
Ты введешь
w
r

И получишь:
w
r

если просмотреть исходный код страницы

modernx 04.06.2010 17:41

В общем, пока организовал такой подсчет, вроде работает:

temptext = $('#tinfo').val();
   count = 0;
   pos = temptext.indexOf("\n");
   while ( pos != -1 ) {
   count+=3;
   pos = temptext.indexOf("\n",pos+1);
   }
   document.iform.counter.value= $('#tinfo').val().length + count;


Часовой пояс GMT +3, время: 07:18.