Суровые глюки и кривые руки. Помогите новичку)
Вот у меня есть чудо-код монстрообразного вида. Но код вроде неплохой, и в Mozilla 3.5 и IE свой функционал прекрасно реализует.
Идея такова: есть SHOUTcast радиоканал, там вещается музыка. PHP-скрипт через сокет получает данные о треке, далее основной HTML-файл получает их через IFRAME, подгружая туда серверный скрипт с соответствующей JavaScript функцией. Основной файл периодически перезагружает IFRAME, чтобы обновлять информацию, но в IE этого не происходит из-за щелчков, а вместо этого реализовано обновление поля при наведении мыши. И всё бы хорошо, но в Опере последней версии меня ждали 2 неудачи: 1) Не перегружается IFRAME, хоть тресни 2) При наведении мыши событие видимо вызывается не один раз, а множество, из-за чего там получается очень неприятная штука с прокруткой на бешенной скорости и рывками. Кстати странно, что от многократных запусков не спасает clearTimeout(), стоящий в начале функции прокрутки. Но если вторую проблему можно решить заменой наведения на клик, то что делать с первой, я не в курсе. Более того, у меня какая-то глюкавая версия похоже стоит. Я код обновляю - а результат работы прежний. Нажимаю Обновить - всё равно прежний. Что-то она там кэширует лишнее. Из-за этой засады я даже не смог понять, помогает ли убрать обработчик на наведение мышки. По логике должно, но у меня проблема не ушла после того, как я эту строчку вырезал. Наверно, причина этому была та, что я выше описал. пробовал я также делать принудительный выброс из обработчика при идентификации браузера как Опера (правильно, зачем он в Опере-то), но это почему-то тоже результата не дало. Настроек кэширования я в этом гении программистской мысли также не нашёл. С позиционированием контейнеров в Опере были те же "залипания", изменения только на четвёртый раз появились. А скрипт должен кроссбраузерным быть по хорошему... В общем - что мне теперь делать с этим чудом?.. :-? |
<div id="song_info" onMouseOver="updateIE()"></div>
<iframe name="aux" id="aux" src="get_track_info.php"></iframe>
<script language="JavaScript" type="text/javascript">
function detectIE() {
var agent = navigator.userAgent.toLowerCase()
return agent.indexOf('msie')
}
function detectOpera() {
var agent = navigator.userAgent.toLowerCase()
var i = agent.indexOf('opera')
if (i!=-1) return parseFloat(agent.slice(i+6))
return false
}
i = 0;
if (detectOpera()) {
document.getElementById('analyser').style.top += 250;
}
function scroll(str, disp, obj) {
clearTimeout(timer);
var length = str.length - 1;
if (disp >= length) {
obj.innerHTML = str;
return;
}
var temp = '';
var out = '';
if ((i + disp > length) && (i <= length)) {
temp = str.slice(i);
fromStart = i + disp - (length + 1);
out = temp + str.slice(0, fromStart);
} else if (i < length) {
out = str.slice(i, i + disp);
} else {
i = 0;
var timer;
out = str.slice(0, disp);
}
i++;
obj.innerHTML = out.replace(' ', ' ');
timer = setTimeout(function() {scroll(text, 35, obj);}, 500);
}
function updateIE() {
aux.location.href = 'get_track_info.php';
text = aux.getSong();
if (text != oldtext) {
text = text.slice(0, text.indexOf('<'));
if (text.length > 35) text += ' ***** ';
scroll(text, 35, obj);
}
}
var text = ' ';
var newtext = ' ';
var oldtext = ' ';
obj = document.getElementById('song_info');
if (detectIE() == -1) {
setTimeout(function() {
aux.location.href = 'get_track_info.php';
newtext = aux.getSong();
i = 0;
oldtext = newtext;
text = newtext.slice(0, newtext.indexOf('<'));
if (text.length > 35) text += ' ***** ';
scroll(text, 35, obj);}, 400);
setInterval(function() {
aux.location.href = 'get_track_info.php';
newtext = aux.getSong();
if (newtext != oldtext) {
i = 0;
oldtext = newtext;
text = newtext.slice(0, newtext.indexOf('<'));
if (text.length > 35) text += ' ***** ';
scroll(text, 35, obj);
}}, 8000);
} else {
setTimeout(function() {
text = aux.getSong();
oldtext = text;
text = text.slice(0, text.indexOf('<'));
if (text.length > 35) text += ' ***** ';
scroll(text, 35, obj);}, 400);
}
</script>
|
Пробовал src вместо location.href - вроде не помогло.
Итог такой: строка 75 явно не функционирует как надо, а код из строки 57 похоже тоже портит картину, правда, ещё раз повторюсь, доказательств, что именно он, у меня нет. Строки 80 и 87 удаляют из ответа мусор, а 81 и 88 - делают текст бегущей строки более удобочитаемым (альтернатива введению <pre></pre>, а иначе множественные пробелы браузер объединяет в один). Переменные newtext и oldtext создавались как раз для того, чтобы знать, когда нам надо перезапускать прокрутку, а когда нет; более того, в случае кривых рук это могло замедлить стремительное нарастание скорости прокрутки. Но к счастью, в этом нет нужды, ибо в начале scroll() стоит clearTimeout(). И самое смешное, что почему-то для Mozilla и IE это аргумент, то есть они его обрабатывают как надо, а Опера чего-то не хочет) Иначе бы никаких проблем с двиганием мыши туда-сюда не было - ведь при запуске нового экземпляра предыдущий таймер сбрасывается. |
А, виноват, всех запутал. В IE тоже не пашет clearTimeout(), тоже ускоряется при каждом наведении. Я просто проверял на коротких названиях песен, они не прокручиваются вовсе, поэтому и не заметил. Как бы это побороть?
Добавил спустя 2 минуты: Ой! И в Мозилле та же беда! Неужели придётся убирать этот обработчик? А ведь как славно было: песню дослушал, мышь навёл, и оно обновилось... |
Всё! Проблему номер 2 решил, почитав справку на форуме. Что-то я ступил с clearTimeout(). Сейчас переделал вот, теперь всё работает как нужно. Как быть с первым вопросом?
|
Всем спасибо, вопрос решён. В Опере всё прекрасно обновляется в автоматическом режиме. Значит, дело было в чём-то другом. Ура! Надеюсь, мой код кому-нибудь пригодится :victory:
|
Со всеми бы так.)
|
| Часовой пояс GMT +3, время: 11:27. |