2010-10-28 4 views
0

В моем наборе я использую jquery, чтобы затухать изображение, изменить его источник на что-то еще, а затем снова увязнуть. Однако иногда при медленных соединениях изображение будет исчезать до того, как источник полностью изменится, поэтому старое изображение будет по-прежнему появляются на короткую секунду до появления новой.jquery .attr() с обратным вызовом?

Есть ли способ получить обратный вызов на attr, так что затухание обратно вызвано только при отражении изменения attr?

$(".img").fadeTo("fast",0,function(){ 
    $(".img").attr({ 
     //some other stuff 
     'src':url 
    }); 
    $(".img").fadeTo("fast",1); 
    //other stuff 
}); 

Я использую fadeTo не fadeIn(), поэтому размер изображения сохраняется.

ответ

2

Привяжите обработчик события к изображению load event и выцведите его в обработчике.

0

Вы хотите проверить, когда изображение загружено? .load() работает.

Примечание: Я никогда не видел его, но я читал, что он может быть вызван преждевременно. Поэтому вы можете проверить высоту изображения.

$(".img").fadeTo("fast",0,function(){ 
    $(this).attr({'src':url}); 
    $(this).load(function(){ 
    $(this).fadeTo("fast",1); 
    $(this).unbind("load"); 
    }); 
}); 
+0

Не будет ли это связывать «нагрузку» с .img, добавляя все больше привязок при каждом запуске этого кода? Может быть безопаснее добавить привязку в глобальную область. –

+0

Да, да. Хороший улов. Я не мог вспомнить, будет ли '.load()' запускаться, если он уже был перезапущен. @Squeegy имеет решение ниже, если это так, это решение, если это не так. Я помню что-то подозрительное, когда я использовал '.load()'. – Jason

+0

Я добавил unbind. Попробуйте сравнить наш код и посмотрите, правильно ли @squeegy. – Jason

0

Вам необходимо предварительно загрузить изображение и обработать событие загрузки при загрузке изображения.

var img = new Image(); 
$(img).load(function() { 
    // Do fading and attr swapping stuff here 
    // The new image is already loaded at this point 
}); 

img.src = myImgUrl; 

При загрузке img ваша функция будет вызвана, и ваше исчезновение произойдет. Изображение теперь кэшируется и готово к использованию и будет отображаться мгновенно.

+0

делает '.load()' на том же элементе, который запускается повторно, если он уже был запущен один раз? – Jason

+0

В этом примере создается новый объект для каждого загружаемого изображения и привязывает событие 'load' ровно один раз к этому объекту. И даже если изображение уже загружено, событие «load» по-прежнему запускается и обрабатывается. Таким образом, здесь нет «одного и того же элемента», поскольку каждый раз его новый объект. –

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