2009-05-21 2 views
2

У меня есть следующий код (JavaScript/JQuery), чтобы показать занят индикатор (после задержки) в то время как изображение загрузки:Занят индикатор состояния гонки в Javascript

function imgUpdate(arg) { 
    var loaded = false; 

    $("#image").one("load", function(){ 
     loaded = true; 
     $("#busyIndicator").hide(); 
    }); 

    setTimeout(function(){ 
     if (!loaded) { 
      $("#busyIndicator").show(); 
     } 
    }, 250); 

    $("#image")[0].src = arg; 
} 

Иногда индикатор загорается и остается вверх. Как это возможно, если JavaScript-движок браузера является однопоточным? (Кстати, на Firefox 3).

Одна заметка: похоже, это происходит, когда загружаемое изображение уже кэшировано.

Другое примечание: если я запишусь на консоль firebug, все строки в imgUpdate будут выполнены, но сообщение журнала внутри обработчика onload никогда не будет распечатываться при последующих вызовах imgUpdate.

+0

так что в основном вы пытаетесь реализовать «прогресс загрузки» с JQuery? – TStamper

+0

Да - тот, который не показывает, быстро ли загружается изображение. –

+1

Нет условий гонки - JavaScript однопоточный. Ваша проблема кроется в другом месте. –

ответ

1

Очистка Src тег на изображение, кажется, решить эту проблему:

function imgUpdate(arg) { 
    var loaded = false; 

    $("#image").one("load", function(){ 
     loaded = true; 
     $("#busyIndicator").hide(); 
    }); 

    setTimeout(function(){ 
     if (!loaded) { 
      $("#busyIndicator").show(); 
     } 
    }, 250); 

    $("#image")[0].src = ""; 
    $("#image")[0].src = arg; 
} 
1

Мне трудно воспроизвести это.

Вот реализация того, что вы делаете:

версия с использованием кэширования: http://jsbin.com/uwuho

версия с быть предотвращено кэширование: (использует параметр, чтобы избежать кэширования) http://jsbin.com/oguvi

Хит F5/Ctrl-F5, чтобы увидеть его. (в частности, с версией, которая предотвращает кеширование)

С или без кеширования ни одна из версий не выполняет то, что вы описали.

Ваша проблема возможно лежит в другом месте.

+0

Я тоже не смог реплицировать его, используя ваш код. Но если проблема была чем-то еще, исправление, которое я опубликовал (в ответе здесь), похоже, что это не сработало бы. –

1

Есть еще что javascript на странице, которая разбивается? Если это так, это может быть не состояние гонки - JS может просто прекратить выполнение до того, как busyIndicator снова будет скрыт ...

+0

Nope - firebug показывает, что ошибок нет и что несвязанный запрос ajax все еще выполняется. –

0

Возможно, вы захотите очистить таймаут в своем обратном вызове, чтобы он не срабатывал, если изображение загружается.

var timer = null; 
function imgUpdate(arg) { 
    var loaded = false; 
    timer = setTimeout(function(){ 
     $("#busyIndicator").show(); 
     timer = null; 
    }, 250);   
    $("#image").one("load", function(){ 
     if (timer) { 
      clearTimeout(timer); 
      timer = null; 
     } 
     $("#busyIndicator").hide(); 
    }); 
    $("#image")[0].src = arg; 
} 
+0

Я пробовал это, но он по-прежнему демонстрирует ту же проблему. Я обновил последнюю строку своего вопроса с дополнительной информацией. –

Смежные вопросы