Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 22.09.2010, 21:52
Профессор
Отправить личное сообщение для popov654 Посмотреть профиль Найти все сообщения от popov654
 
Регистрация: 22.09.2010
Сообщений: 217

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

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

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

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

Последний раз редактировалось popov654, 12.12.2010 в 01:04.
Ответить с цитированием
  #2 (permalink)  
Старый 22.09.2010, 21:53
Профессор
Отправить личное сообщение для popov654 Посмотреть профиль Найти все сообщения от popov654
 
Регистрация: 22.09.2010
Сообщений: 217

<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 в 23:46. Причина: Поправил алгоритм
Ответить с цитированием
  #3 (permalink)  
Старый 22.09.2010, 22:06
Профессор
Отправить личное сообщение для popov654 Посмотреть профиль Найти все сообщения от popov654
 
Регистрация: 22.09.2010
Сообщений: 217

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

Переменные newtext и oldtext создавались как раз для того, чтобы знать, когда нам надо перезапускать прокрутку, а когда нет; более того, в случае кривых рук это могло замедлить стремительное нарастание скорости прокрутки. Но к счастью, в этом нет нужды, ибо в начале scroll() стоит clearTimeout(). И самое смешное, что почему-то для Mozilla и IE это аргумент, то есть они его обрабатывают как надо, а Опера чего-то не хочет) Иначе бы никаких проблем с двиганием мыши туда-сюда не было - ведь при запуске нового экземпляра предыдущий таймер сбрасывается.
Ответить с цитированием
  #4 (permalink)  
Старый 22.09.2010, 23:11
Профессор
Отправить личное сообщение для popov654 Посмотреть профиль Найти все сообщения от popov654
 
Регистрация: 22.09.2010
Сообщений: 217

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

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

Последний раз редактировалось popov654, 22.09.2010 в 23:13.
Ответить с цитированием
  #5 (permalink)  
Старый 22.09.2010, 23:32
Профессор
Отправить личное сообщение для popov654 Посмотреть профиль Найти все сообщения от popov654
 
Регистрация: 22.09.2010
Сообщений: 217

Всё! Проблему номер 2 решил, почитав справку на форуме. Что-то я ступил с clearTimeout(). Сейчас переделал вот, теперь всё работает как нужно. Как быть с первым вопросом?
Ответить с цитированием
  #6 (permalink)  
Старый 22.09.2010, 23:44
Профессор
Отправить личное сообщение для popov654 Посмотреть профиль Найти все сообщения от popov654
 
Регистрация: 22.09.2010
Сообщений: 217

Всем спасибо, вопрос решён. В Опере всё прекрасно обновляется в автоматическом режиме. Значит, дело было в чём-то другом. Ура! Надеюсь, мой код кому-нибудь пригодится
Ответить с цитированием
  #7 (permalink)  
Старый 28.09.2010, 17:45
Аватар для Aetae
Тлен
Отправить личное сообщение для Aetae Посмотреть профиль Найти все сообщения от Aetae
 
Регистрация: 02.01.2010
Сообщений: 6,586

Со всеми бы так.)
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Помогите пожалуйста новичку... knyazsergei Общие вопросы Javascript 2 16.06.2010 23:30
Помогите новичку с выпадающим списком interest Элементы интерфейса 5 19.05.2010 13:15
ССЫЛКИ (Помогите новичку) meggen (X)HTML/CSS 8 30.11.2009 10:51
Замена текста в блоках по клику, помогите новичку) langolier Я не знаю javascript 1 27.05.2009 04:13
Помогите новичку OlexandrI Общие вопросы Javascript 6 07.12.2008 10:17