Страницы: 1
Есть скрипт бегущей строки (ну нужен) в которой "бегут" html теги со стилями.
Это все работает. Но если в Опере, Хроме, IE6(!) и IE7 это работает с нормальной (удовлетворительной) скоростью, то в Firefox 3.6 и IE8 скрипт выдает не FPS, а SPF, т.е. дико торомзит.
Я заоптимиризовал всё что можно, хотя это мало (никак не) сказалось на скорости работы.
Может есть какое-то интересное решение для FF? Или он как-то особенно понимает некоторые команды JS?
Я понимаю, что проблема может быть решена в FF4, но ждать пока все с 3.6 перейдут на него не получается.
Собсвтенно скрипт:
function newschk (xmldoc) { /*функция для подтягивания новых новостей. Работает раз в 5мин, на скорость влиять не должна*/
var news = xmldoc.getElementsByTagName('item');
var id,p,fl;
var narid=[];
var s={'Jan':'янв','Feb':'фев','Mar':'мар','Apr':'апр','May':'май','Jun':'июн','Jul':'июл','Aug':'авг','Sep':'сен','Oct':'окт','Nov':'ноя','Dec':'дек'};
nl=news.length;
for (var i=0; i<nl; i++) {narid[i]=nar[0][i]}
var nartmp=nar;
var nltmp=nl;
for (var i=0; i<nl; i++) {
id=_xmlGetOneChildValue(news[i], 'link').match(/\?news=(\d+)$/)[1];
p=_xmlGetOneChildValue(news[i], 'pubDate').match(/\d+\s[a-zA-Z]{3}|\d+:\d+/g);
p[0]=p[0].replace(/.{3}$/,function(m){return s[m]});
fl=false;
for(var j=0;j<nl;j++) {if(narid[j]==id) fl=true}
nar[0][i]=id;
nar[1][i]='<b>'+p[0].split(' ')[0]+'<em>'+p[0].split(' ')[1]+'</em>| '+p[1]+' || </b>'+
'<a href="'+_xmlGetOneChildValue(news[i], 'link')+'">'+_xmlGetOneChildValue(news[i], 'title')+'</a>';
if (tmp!='' && fl==false) nar[2][i]=true;
else nar[2][i]=false;
}
processRSS();
}
callSrv('/rss/news.xml', null, newschk, '');
window.setInterval(function(){callSrv('/rss/news.xml', null, newschk, '')}, 300000); /* 15мин - 900000 мс */
function processRSS() { /* Функция занесения новостей в строку, вызывается также раз в 5 мин. Также не должна влиять на производительность */
el.innerHTML=tmp; tmp='';
for (var i=0; i<nl; i++) {
if (nar[2][i]) tmp+='<span class="new">'+nar[1][i]+'</span>'
else tmp+=nar[1][i];
if (i==nl-4) {
el.innerHTML+=tmp; tmp='';
w=-el.offsetWidth;
}
}
el.innerHTML+=tmp;
}
/* Начало "тяжелого профиля" */
var pp=0;
function OnTimer() {
var stmp;
if (--pp<w) pp=0;
pp=pp.toString();
stmp=pp;
stmp+='px';
el.style.left=stmp;
}
/* Был еще вариант:
function OnTimer() {
if (--pp<w) pp=0;
el.style.left=pp+'px';
}
Скорость от замены не выросла. */
if (el
&& !(navigator.userAgent.toLowerCase().indexOf("firefox") != -1) /* для теста это стОит убрать */
&& !(navigator.userAgent.toLowerCase().indexOf("msie 8") != -1) /* и это тоже */
)
window.setInterval(OnTimer, 50);
}
да, похоже (в ходе экспериментов)) Firefox перерисовывает всю область экрана (в отличие от Хрома или Оперы), может ему можно как-то скриптом задать область прорисовки?
Отредактировано RedElf (13-12-2010 13:21:31)
Отсутствует
1) большинством браузеров поддерживается,какой смысл изгаляться?
2)я конечно не спец по жабоскрипту но даже мне видно что скрипт уж больно мудрёный и главное куча регекспов которые как известно тормозят, вобщем простой поиск выдал четвертой ссылкой
http://www.gcmingati.net/wordpress/wp-content/lab/jquery/newsticker/jq-liscroll/scrollanimate.html
вполне работоспособный и не тормозящий скрипт,который можно подправить под свои нужды.
1) При чем здесь браузеры вообще?
2) И пост вы тоже видать не читали, потому что там очень четко и понятно написано, что повторяются (т.е. тормозят) только две строчки кода, в которых никаких регулярок нет (собственно их там всего две штуки).
Ну и простым поиском я вполне умею пользоваться, раз написал код в котором вы с ходу не смогли разобраться, хотя там 70 строк и комментарии на русском)
А на счет ЖКвари - я пробовал это решение - оно не тормозит пока находится в вакууме. Как только оно помещается в реальную страницу и туда загоняется реальный контент начинаются аналогичные тормоза.
Спасибо, попробую ваше вдруг тормозить не будет.
Отсутствует
Вообще тормозит скорее не скрипт а перерисовка.
Для начала можно увеличить интервал отрисовки с 50 до 150мс, например
Ну и, поскольку проблема похоже в вёрстке, лучше смотреть на полную страницу, а не на «скрипт в вакууме».
ссылка для чтения: http://chikuyonok.ru/2010/11/optimization-story/
Isn't it ironic... don't you think? — Alanis Morissette
Отсутствует
вполне работоспособный и не тормозящий скрипт,который можно подправить под свои нужды.
Угу, этот "не тормозящий" скрипт грузит мой проц на 100% (с учетом других задач - ~80). А странице он конечно же тормозит сильнее, что впрочем не удивительно - он работает точно также как и мой, только использует дополнительно ЖКвери, а значит работает медленнее.
Вообще тормозит скорее не скрипт а перерисовка.
Ага И тормозит она в частности из-за того, что ФФ перерисовывает всю область экрана, а не только изменившуюся.
Для начала можно увеличить интервал отрисовки с 50 до 150мс, например
Можно вообще строку убрать) Если бы меня устроили настолько дискретные перемещения, я бы не спрашивал.
ссылка для чтения: http://chikuyonok.ru/2010/11/optimization-story/
Спасибо, изучу.
Отредактировано RedElf (14-12-2010 11:25:17)
Отсутствует
Мда, прочитал. В качестве решения предлагается забить.
Попробовал ставить строку в iframe. Ага. Опера и Хром как обычно показывают, ФФ как обычно нет.
cont=cont.firstChild.contentWindow.document /* (или contentDocument) */;
var el=cont.getElementsByTagName('head')[0];
tmp.innerHTML='<link rel="stylesheet" type="text/css" href="css/ani.css" />';
el.appendChild(tmp.firstChild);
el=cont.getElementsByTagName('body')[0];
tmp.innerHTML='<div id="ani">test</div>';
el.appendChild(tmp.firstChild);
el=el.firstChild; /* переходим к элементу ani */
var w=-1; /* длинна части в px, которая должна уйти влево для нового витка */
var nl=0;
Отредактировано RedElf (09-12-2010 18:00:22)
Отсутствует
уфф. Остановился на комбинированном варианте: Opera, Chrome, IE6 и 7 грузят начальный вариант, а Firefox и IE8 - iframe (спасибо Lynn навел на мысль).
function newschk (xmldoc) {
var news = xmldoc.getElementsByTagName('item'); /* получаем список новостей .documentElement */
var id,p,fl;
var narid=[];
var s={'Jan':'янв','Feb':'фев','Mar':'мар','Apr':'апр','May':'май','Jun':'июн','Jul':'июл','Aug':'авг','Sep':'сен','Oct':'окт','Nov':'ноя','Dec':'дек'};
nl=news.length;
for (var i=0; i<nl; i++) {narid[i]=nar[0][i]} /* заносим все айдишники во временный массив */
var nartmp=nar;
var nltmp=nl;
for (var i=0; i<nl; i++) {
id=_xmlGetOneChildValue(news[i], 'link').match(/\?news=(\d+)$/)[1];
p=_xmlGetOneChildValue(news[i], 'pubDate').match(/\d+\s[a-zA-Z]{3}|\d+:\d+/g);
p[0]=p[0].replace(/.{3}$/,function(m){return s[m]});
fl=false;
for(var j=0;j<nl;j++) {if(narid[j]==id) fl=true} /* просмотр новостей - если новсть уже есть - Ъ */
nar[0][i]=id;
nar[1][i]='<b>'+p[0].split(' ')[0]+'<em>'+p[0].split(' ')[1]+'</em>| '+p[1]+' || </b>'+
'<a href="'+_xmlGetOneChildValue(news[i], 'link')+'">'+_xmlGetOneChildValue(news[i], 'title')+'</a>';
if (tmp!='' && fl==false) nar[2][i]=true;
else nar[2][i]=false;
}
el.innerHTML=tmp; tmp=''; /* в начале идут последние 3 новсти предыдущей стоки */
for (var i=0; i<nl; i++) { /* потом новости новой строки */
if (nar[2][i]) tmp+='<span class="new">'+nar[1][i]+'</span>'
else tmp+=nar[1][i];
if (i==nl-4) { /* если текущая новость - 3-я с конца */
el.innerHTML+=tmp; tmp='';
w=-el.offsetWidth;
}
}
el.innerHTML+=tmp;
}
else {
cont.innerHTML='<iframe src="/js/ani.html" type="text/html" id="anic" name="anic" scrolling="no"></iframe><img id="anifgl" src="http://news.vdv-s.ru/img/anifg_l.png" alt="" /><img id="anifgr" src="http://news.vdv-s.ru/img/anifg_r.png" alt="" />';
}
}
function newschk (xmldoc) {
var news = xmldoc.getElementsByTagName('item'); /* получаем список новостей .documentElement */
var id,p,fl;
var s={'Jan':'янв','Feb':'фев','Mar':'мар','Apr':'апр','May':'май','Jun':'июн','Jul':'июл','Aug':'авг','Sep':'сен','Oct':'окт','Nov':'ноя','Dec':'дек'};
var nl=news.length;
for (var i=0; i<nl; i++) {narid[i]=nar[0][i]} /* заносим все айдишники во временный массив */
var nartmp=nar;
var nltmp=nl;
for (var i=0; i<nl; i++) {
id=_xmlGetOneChildValue(news[i], 'link').match(/\?news=(\d+)$/)[1];
p=_xmlGetOneChildValue(news[i], 'pubDate').match(/\d+\s[a-zA-Z]{3}|\d+:\d+/g);
p[0]=p[0].replace(/.{3}$/,function(m){return s[m]});
fl=false;
for(var j=0;j<nl;j++) {if(narid[j]==id) fl=true} /* просмотр новостей - если новсть уже есть - Ъ */
nar[0][i]=id;
nar[1][i]='<b>'+p[0].split(' ')[0]+'<em>'+p[0].split(' ')[1]+'</em>| '+p[1]+' || </b>'+
'<a href="'+_xmlGetOneChildValue(news[i], 'link')+'" target="_top">'+_xmlGetOneChildValue(news[i], 'title')+'</a>';
if (tmp!='' && fl==false) nar[2][i]=true;
else nar[2][i]=false;
}
el.innerHTML=tmp; tmp=''; /* в начале идут последние 3 новости предыдущей стоки */
for (var i=0; i<nl; i++) { /* потом новости новой строки */
if (nar[2][i]) tmp+='<span class="new">'+nar[1][i]+'</span>'
else tmp+=nar[1][i];
if (i==nl-4) { /* если текущая новость - 3-я с конца */
el.innerHTML+=tmp; tmp='';
w=-el.offsetWidth;
}
}
el.innerHTML+=tmp;
}
callSrv('/rss/news.xml', null, newschk, '');
window.setInterval(function(){callSrv('/rss/news.xml', null, newschk, '')}, 300000); /* 15мин - 900000 мс */
var pp=0;
function OnTimer() {
if (--pp<w) pp=0;
el.style.left=pp+'px';
}
if (el) window.setInterval(OnTimer, 40)
}
window.onload=anistart;
</script>
</head>
<body id="body"></body>
</html>
И чтобы строка отображалась в ФФ нормально нужно дописать в стилях iframe#anic {width:120%}, чтобы правая пятая часть фрейма была скрыта.
Везде приемлемая скорость и одинаковый внешний вид. Это вин
Отредактировано RedElf (13-12-2010 13:20:57)
Отсутствует
Страницы: 1