Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Не корректно работает slice (https://javascript.ru/forum/misc/7403-ne-korrektno-rabotaet-slice.html)

Dotod 30.01.2010 15:31

Не корректно работает slice
 
Мир клубу опасных людей! Проблема вот в чем: вызываю приведенную ниже функцию по событию onChange к некоторому textarea:

[ js ]
function sliceta(obj_slice)
{
var a = obj_slice.value.length;
if (a >= 500) obj_slice.value = obj_slice.value.slice(0,500);
}
[ /js ]

Она должна образать введенный в textarea текст до 500 символов. При вставке текста такого вида все работает нормально:

"В Российской Федерации признаются и гарантируются права и свободы человека и гражданина согласно общепризнанным принциам и нормам междунаро8ного права и в соответствии с настоящей Конституцией. Основные права и свободы человека неотчуждаемы и принадлежат каждому от рождения. Осуществление прав и свобод человека и гражданина не должно нарушать права и свободы других лиц.
...
...
..."

Но при вставке текста следующего вида с абзацами получаю в firefox-е 496 символов вместо указанных 500, а в oper-е 492 символа:

"В Российской Федерации признаются и гарантируются права и свободы человека и гражданина согласно общепризнанным принциам и нормам междунаро8ного права и в соответствии с настоящей Конституцией.

2. Основные права и свободы человека неотчуждаемы и принадлежат каждому от рождения.

3. Осуществление прав и свобод человека и гражданина не должно нарушать права и свободы других лиц
...
...
..."

В обоих случаях текст вставляется в textarea общей сложностью в 1607 символов. Еще неделю просидеть с этим - это уже слишком

Octane 30.01.2010 15:36

<textarea id="test1">1
2</textarea>
<script type="text/javascript">
alert(document.getElementById("test1").value.length);
</script>

Dotod 30.01.2010 15:55

Я понял, ты хотел сказать мне, что все отлично работает. И я согласен, что length работает нормально, но мне нужно обрезать текст до 500 символов. А slice и substr обрезают большой текст с абзацами так, как будто бы вместе с ним есть какие-то скрытые символы

Dotod 30.01.2010 16:11

Вопрос все еще актуален. Думаю, многим будет интересно, что за фокус такой

Octane 30.01.2010 16:12

Цитата:

Сообщение от Dotod
как будто бы вместе с ним есть какие-то скрытые символы

не как будто, а действительно есть непечатные символы

Dotod 30.01.2010 16:19

То есть лучше смириться с грустным фактом, что обрезать большой текст с точностью до n-го кол-ва символов нереально? Причем, когда человек печатает в поле, то slice и substr работают нормально, а когда вставляет большой текст, то работает приблизительно нормально) Может там скрытые символы удалить как-то или еще чего?

Octane 30.01.2010 16:29

Все реально. Если переносы строк не нужны, удалите их перед получением фрагмента строки.

Kolyaj 30.01.2010 16:42

Цитата:

Сообщение от Dotod
То есть лучше смириться с грустным фактом, что обрезать большой текст с точностью до n-го кол-ва символов нереально?

Вы сейчас что символами называете?

Dotod 30.01.2010 17:07

Под символами подразумеваю цифры, буквы, пробелы, спец. символы, а также возможно переносы строк. Сейчас попробовал удалить все переносы /n и /r, добавив метод replace вот так:

[ js ]
function sliceta(obj_slice)
{
var a = obj_slice.value.length;
if (a >= 500)
{
b = obj_slice.value.slice(0,500);
obj_slice.value = b.replace(/(\n(\r)?)/g, ' ');
}
}
[ /js ]

Но та же история - получаю 496, 492 символа, но не 500. Число символов проверяю в word-е - Файл - Свойства - Статистика

Octane 30.01.2010 17:14

Цитата:

Сообщение от Dotod
b = obj_slice.value.slice(0,500);
obj_slice.value = b.replace(/(\n(\r)?)/g, ' ');

Цитата:

Сообщение от Octane
Если переносы строк не нужны, удалите их перед получением фрагмента строки.

и регулярное выражение неправильное

Dotod 30.01.2010 17:18

Да пробовал уже и маршем, и гуськом, и по пластунски:

[ js ]
function sliceta(obj_slice)
{
var a = obj_slice.value.length;
if (a >= 500)
{
b = obj_slice.value.slice(0,500);
c = b.replace(/(\n(\r)?)/g, ' ');
obj_slice.value = c;
}
}
[ /js ]

Вот, разве не перед получением фрагмента?

Dotod 30.01.2010 17:22

Так и знал! Сейчас буду искать правильное, спасибо за направление

Octane 30.01.2010 17:24

b.replace(/[\n\r]/g, "")

Dotod 30.01.2010 17:24

Так и знал, что лучше пока с регулярщиной не связываться. Поищу варианты. Спасибо за направление. До связи

Dotod 30.01.2010 17:52

Кстати, ваш вариант не помог - попробуйте сами. У меня только одна догадка - дело не в переносах строк. Не думал, что застопорюсь на такой мелочи. Если раскопаю, отпишусь здесь, чтоб другие сэкономили недельку другую. Но если у кого есть решение - пишите - не стесняйтесь

Octane 30.01.2010 18:21

все работает
<textarea id="test2" cols="10" rows="8">1
2
3
4
5
6
7
8</textarea>
<script type="text/javascript">
alert(document.getElementById("test2").value.replace(/[\r\n]/g, "").slice(0, 4));
</script>

Kolyaj 30.01.2010 18:30

Octane,
ну он же
Цитата:

Сообщение от Dotod
Число символов проверяю в word-е


Octane 30.01.2010 18:37

Цитата:

Сообщение от Kolyaj
Octane,
ну он же
Цитата:

Сообщение от Dotod
Число символов проверяю в word-е


да))) тяжелый случай, целую неделю в ворде символы считать

Dotod 30.01.2010 22:42

Ладно-ладно-ладно. Вот функция, которая должна обрезать текст до 500 символов:

function sliceta(obj_slice)
{
var a = obj_slice.value.length;
if (a >= 500)
{
b = obj_slice.value.slice(0, 500);
c = b.replace(/[\n\r]/g, "");
obj_slice.value = c;
alert(c.length);
}
}

Вставьте в textarea этот текст:
"
В Российской Федерации признаются и гарантируются права и свободы человека и гражданина согласно общепризнанным принциам и нормам междунаро8ного права и в соответствии с настоящей Конституцией.
2. Основные права и свободы человека неотчуждаемы и принадлежат каждому от рождения.
3. Осуществление прав и свобод человека и гражданина не должно нарушать права и свободы других лиц.
Статья 18
Права и свободы человека и гражданина являются непосредственно действующими. Они определяют смысл, содержание и применение законов, деятельность законодательной и исполнительной власти, местного самоуправления и обеспечиваются правосудием.
Статья 19
1. Все равны перед законом и судом.
2. Государство гарантирует равенство прав и свобод человека и гражданина независимо от пола, расы, национальности, языка, происхождения, имущественного и должностного положения, места жительства, отношения к религии, убеждений, принадлежности к общественным объединениям, а также других обстоятельств. Запрещаются любые формы ограничения прав граждан по признакам социальной, расовой, национальной, языковой или религиозной принадлежности.
3. Мужчина и женщина имеют равные права и свободы и равные возможности для их реализации.
Статья 20
1. Каждый имеет право на жизнь.
2. Смертная казнь впредь до ее отмены может устанавливаться федеральным законом в качестве исключительной меры наказания за особо тяжкие преступления против жизни при предоставлении обвиняемому права на рассмотрение его дела судом с участием присяжных заседателей.
В Российской Федерации признаются и гарантируются права и свободы человека и гражданина согласно
"

И узрите, alert в firefox покажет длину в 496 символов, а в opera и того 492 вместо нужных 500

Octane 30.01.2010 22:52

Цитата:

Сообщение от Dotod
Ладно-ладно-ладно. Вот функция, которая должна обрезать текст до 500 символов:

function sliceta(obj_slice) 
{
var a = obj_slice.value.length;
if (a >= 500) 
{
*!*
b = obj_slice.value.slice(0, 500);
c = b.replace(/[\n\r]/g, "");
*/!*
obj_slice.value = c;
alert(c.length);
}
}

ладно, повторю 3-й раз, мне не трудно:
Цитата:

Сообщение от Octane
Если переносы строк не нужны, удалите их перед получением фрагмента строки.

Цитата:

Сообщение от Octane
…value.replace(/[\r\n]/g, "").slice(0, …)



Цитата:

Сообщение от Dotod
if (a >= 500)

в итоге, при удалении непечатных символов, может получится меньше 500. Тоже проверять количество видимых символов нужно после удаления непечатных.

Dotod 30.01.2010 23:31

Все-все, Octan, понял-понял - все заработало. Было бы чем, отблагодарил бы


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