Javascript-форум (https://javascript.ru/forum/)
-   Opera, Safari и др. (https://javascript.ru/forum/css-html-browser/)
-   -   Суровые глюки и кривые руки. Помогите новичку) (https://javascript.ru/forum/css-html-browser/11950-surovye-glyuki-i-krivye-ruki-pomogite-novichku.html)

popov654 22.09.2010 21:52

Суровые глюки и кривые руки. Помогите новичку)
 
Вот у меня есть чудо-код монстрообразного вида. Но код вроде неплохой, и в Mozilla 3.5 и IE свой функционал прекрасно реализует.
Идея такова: есть SHOUTcast радиоканал, там вещается музыка. PHP-скрипт через сокет получает данные о треке, далее основной HTML-файл получает их через IFRAME, подгружая туда серверный скрипт с соответствующей JavaScript функцией. Основной файл периодически перезагружает IFRAME, чтобы обновлять информацию, но в IE этого не происходит из-за щелчков, а вместо этого реализовано обновление поля при наведении мыши.

И всё бы хорошо, но в Опере последней версии меня ждали 2 неудачи:
1) Не перегружается IFRAME, хоть тресни
2) При наведении мыши событие видимо вызывается не один раз, а множество, из-за чего там получается очень неприятная штука с прокруткой на бешенной скорости и рывками. Кстати странно, что от многократных запусков не спасает clearTimeout(), стоящий в начале функции прокрутки.
Но если вторую проблему можно решить заменой наведения на клик, то что делать с первой, я не в курсе.
Более того, у меня какая-то глюкавая версия похоже стоит. Я код обновляю - а результат работы прежний. Нажимаю Обновить - всё равно прежний. Что-то она там кэширует лишнее.

Из-за этой засады я даже не смог понять, помогает ли убрать обработчик на наведение мышки. По логике должно, но у меня проблема не ушла после того, как я эту строчку вырезал. Наверно, причина этому была та, что я выше описал.
пробовал я также делать принудительный выброс из обработчика при идентификации браузера как Опера (правильно, зачем он в Опере-то), но это почему-то тоже результата не дало.
Настроек кэширования я в этом гении программистской мысли также не нашёл. С позиционированием контейнеров в Опере были те же "залипания", изменения только на четвёртый раз появились.

А скрипт должен кроссбраузерным быть по хорошему...
В общем - что мне теперь делать с этим чудом?.. :-?

popov654 22.09.2010 21:53

<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(' ', '&nbsp;');
    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>

popov654 22.09.2010 22:06

Пробовал src вместо location.href - вроде не помогло.
Итог такой: строка 75 явно не функционирует как надо, а код из строки 57 похоже тоже портит картину, правда, ещё раз повторюсь, доказательств, что именно он, у меня нет. Строки 80 и 87 удаляют из ответа мусор, а 81 и 88 - делают текст бегущей строки более удобочитаемым (альтернатива введению <pre></pre>, а иначе множественные пробелы браузер объединяет в один).

Переменные newtext и oldtext создавались как раз для того, чтобы знать, когда нам надо перезапускать прокрутку, а когда нет; более того, в случае кривых рук это могло замедлить стремительное нарастание скорости прокрутки. Но к счастью, в этом нет нужды, ибо в начале scroll() стоит clearTimeout(). И самое смешное, что почему-то для Mozilla и IE это аргумент, то есть они его обрабатывают как надо, а Опера чего-то не хочет) Иначе бы никаких проблем с двиганием мыши туда-сюда не было - ведь при запуске нового экземпляра предыдущий таймер сбрасывается.

popov654 22.09.2010 23:11

А, виноват, всех запутал. В IE тоже не пашет clearTimeout(), тоже ускоряется при каждом наведении. Я просто проверял на коротких названиях песен, они не прокручиваются вовсе, поэтому и не заметил. Как бы это побороть?

Добавил спустя 2 минуты: Ой! И в Мозилле та же беда! Неужели придётся убирать этот обработчик? А ведь как славно было: песню дослушал, мышь навёл, и оно обновилось...

popov654 22.09.2010 23:32

Всё! Проблему номер 2 решил, почитав справку на форуме. Что-то я ступил с clearTimeout(). Сейчас переделал вот, теперь всё работает как нужно. Как быть с первым вопросом?

popov654 22.09.2010 23:44

Всем спасибо, вопрос решён. В Опере всё прекрасно обновляется в автоматическом режиме. Значит, дело было в чём-то другом. Ура! Надеюсь, мой код кому-нибудь пригодится :victory:

Aetae 28.09.2010 17:45

Со всеми бы так.)


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