Консультация № 179999
23.09.2010, 20:16
0.00 руб.
0 3 2
Всем доброго дня.

Кто может, помогите решить такую проблему. Есть такой скрипт для вывода нескольких строк.

Код:

<body onload="start_up_text()">
<div id="up_text">
<script type="text/javascript">
var delay=120;
var msg = ('Это первая строка.
Это вторая строка.

Это третья строка
Это четвертая строка

Это пятая строка
Это шестая строка');
function start_up_text()
{ do_up_text(msg, 0, 1);}
function do_up_text(text, pos, dir)
{
var out=text.substring(msg, pos);
up_text.innerHTML=out;
pos+=dir;
setTimeout('do_up_text("'+text+'",'+pos+','+dir+')', delay);
}
</script>
</div>


Проблема в том, что при переносе строки печатается знак "<" в конце строки. Также он печатается на пустой строке. В ИЕ все нормально, а вот в Опере и FF вот такая беда.

Кто знает, как с этим бороться, помогите. Или может у кого-то есть другой вариант такого скрипта.

Спасибо.

Обсуждение

Неизвестный
23.09.2010, 21:18
общий
это ответ
Здравствуйте, Кохан Владимир Иванович.

Предлагаю исправить скрипт так:
Код:
<body onload="start_up_text()"> 
<div id="up_text">
<script type="text/javascript">
var delay=120;
var msg = ('Это первая строка.@Это вторая строка.@@Это третья строка@Это четвертая строка@Это пятая строка@Это шестая строка');
function start_up_text()
{ do_up_text(msg, 0, 1);}
function do_up_text(text, pos, dir)
{
var out=text.substring(pos, pos+1); // выделяет ОДИН символ
document.getElementById('up_text').innerHTML +=(out=='@'?'
':out); // дописывает к ('up_text').innerHTML очередной символ или динамически заменяет один символ @ на весь тег
сразу (иначе он выводится посимвольно, отсюда и вывод <
pos+=dir;
setTimeout('do_up_text("'+text+'",'+pos+','+dir+')', delay);
}
</script>
</div>
5
Отлично! Все работает как нужно, большое спасибо
Неизвестный
24.09.2010, 03:19
общий
немного дополню ответ Волкова Алексея aka Lupo:

в данном случае, аргумент dir нужно убрать совсем, дополнять нужно всегда по 1 символу (попробуйте написать ..do_up_text(msg, 0, 2);...)

з/ы

и нужна проверка на окончание вывода, например, если pos > text.length, то setTimeout уже не нужен...

Неизвестный
24.09.2010, 04:11
общий
это ответ
Здравствуйте, Кохан Владимир Иванович.
еще вариант:
dir может быть любым, обрабатывает теги и html сущности #..;


Успехов.

ps
пытался в msg вставить часть html этой страницы, но что-то там не так с обработкой кода в приложении...
долгие попытки поменять форматирование ни к чему не привели..
и файл прикрепить уже не могу...
можете поменять сами...


Приложение:
<body onload="start_up_text()">
<div id="up_text"> </div>
<script type="text/javascript">
var delay=120;
var msg = ('<p align="left">Всем доброго дня.

Кто может, помогите решить такую проблему. Есть такой скрипт для вывода нескольких строк.

<div style="margin:5px; margin-bottom:15px"><div class="S"><b><font color="gray">Код:</font></b></div><div style="padding: 10px; width: 650px; font-size:12px; font-family:Tahoma, Verdana, Arial; overflow: auto; color:#032866; border: 1px inset #555555; border-left: 12px solid #AAAAAA;"><pre>rusfaq не дает писать вложненный html</pre></div></div>

Проблема в том, что при переносе строки печатается знак "<" в конце строки. Также он печатается на пустой строке. В ИЕ все нормально, а вот в Опере и FF вот такая беда.

Кто знает, как с этим бороться, помогите. Или может у кого-то есть другой вариант такого скрипта.

Спасибо.</p>');

function start_up_text()
{
do_up_text(msg, 0, 5);
}

function do_up_text(text, pos, dir)
{
var ctpos = text.indexOf('>', pos);
var otpos = text.indexOf('<', pos + 1);
while (ctpos > -1 && (otpos == -1 || ctpos < otpos)) { //pos попала "внутрь" тега
pos = ctpos + 1;
ctpos = text.indexOf('>', pos);
otpos = text.indexOf('<', pos + 1);
}

var amppos = text.lastIndexOf('&', pos);
var sempos = text.lastIndexOf(';', pos - 1);
if (amppos > -1 && sempos < amppos) { //pos попала "внутрь" &...;
sempos = text.indexOf(';', pos);
if (sempos > -1) {
pos = sempos;
} else {
pos = text.length - 1;
}
}

var out=text.substring(msg, pos);
up_text.innerHTML=out;
if (out.length < text.length) {
pos+=dir;
setTimeout(function(){do_up_text(text,pos,dir)}, delay);
}
}
</script>
5
Большое спасибо за ответ.
Форма ответа