Суровые глюки и кривые руки. Помогите новичку)
Вот у меня есть чудо-код монстрообразного вида. Но код вроде неплохой, и в 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, время: 20:16. |