2015-04-21 2 views
1

У меня есть ситуация, когда я должен ждать Конкретное изображение для загрузки, а затем либо поменять его src, либо найти следующее изображение и скрыть/показать его.Функция JQuery не срабатывает при начальной загрузке

Что мне нужно, чтобы показать изображение-заполнитель (силуэт), пока его основное изображение не будет готово, а затем спрятать силуэт и показать основное изображение. Очень распространенный материал.

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

CSS: 
.staffImage1, .staffImage2, .staffImage3, .staffImage4, .staffImage5 { display: none; } 

Jquery: 
$('.staffImage1, .staffImage2,.staffImage3,.staffImage4, .staffImage5') 
    .load(function() { 
     $(this).next('.sillhouette').hide(); 
     $(this).show(); 
     console.log("function fired") 
    }) 

Я получаю сообщение журнала только после обновления.

Что-то нужно знать о том, что я использую метод «Первый 14k» для увеличения скорости страницы, поэтому, возможно, jquery просто не готов, когда изображения загружаются в первый раз, но кэшируются и работают после f5?

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

Любые советы оценили, спасибо

+1

Я думаю, потому что вы назначаете 'display: none' для всех изображений –

+0

Хм, я изначально использовал jquery для .hide(), но понял, что это была пустая трата, когда css может делать то же самое. Это также создало ту же ошибку обновления. Я также предполагаю, что .show() - это просто jquery, изменяющее правило CSS для блокировки. В любом случае, спасибо, но скрывая изображения с помощью .hide(), он по-прежнему требует обновления. – Benji40

+0

Я думаю, что Амит прав.Браузер не загружает изображения, если они не отображаются в соответствии с CSS. Поскольку вы используете jQuery, возможно, вы можете заглянуть в плагин загрузчика изображений, например [этот] (http://beatak.github.io/jquery-imageloader/). – djskinner

ответ

1

Эта структура:

$('.staffImage1, .staffImage2,.staffImage3,.staffImage4, .staffImage5').load(...) 

не работает, чтобы уведомить вас, когда все изображения были загружены. .load() работает только на одном изображении за раз. И, если изображения будут кэшироваться, они, возможно, уже закончили загрузку, прежде чем ваш jQuery даже запустится, чтобы вы полностью пропустили событие загрузки.

Простейшие Обходной использовать событие окна загрузки, когда все ресурсы страницы завершения загрузки:

$(window).load(function() { 
    // all images are loaded here 
}); 

Это также возможно контролировать только те 5 изображений, но это больше работы. Я написал код, чтобы сделать это раньше, поэтому я посмотрю, смогу ли я найти этот предыдущий код.


Здесь представлена ​​функция плагина jQuery, которая контролирует только определенные изображения. Он будет называть его обратного вызова, когда все изображения в объекте JQuery загружаются:

// call the callback when all images have been loaded 
// if all images are already loaded or there were no images in the jQuery 
// object, then the callback will be called immediately 
jQuery.fn.imgsLoaded = function(fn) { 
    var cntRemaining = 0; 
    function checkDone() { 
     if (cntRemaining === 0) { 
      fn(); 
     } 
    } 

    function imgDone() { 
     --cntRemaining; 
     checkDone(); 
     // remove event handlers to kill closure when done 
     $(this).off("load error abort", imgDone); 
    } 

    this.each(function() { 
     if (!this.tagName.toLowerCase() === "img" && !this.complete && this.src) { 
      ++cntRemaining; 
      $(this).on("load error abort", imgDone); 
     } 
    }); 
    checkDone(); 
    return this; 
} 

Вы могли бы использовать его как это:

$('.staffImage1, .staffImage2,.staffImage3,.staffImage4, .staffImage5').imgsLoaded(function() { 
    $(this).next('.sillhouette').hide(); 
    $(this).show(); 
    console.log("function fired") 
}); 

Работа демо: http://jsfiddle.net/jfriend00/zaoweyoo/

+0

О, я предположил, что каждое из изображений приведет к запуску новой функции, когда каждая будет загружена полностью? Когда я получаю 5 сообщений журнала в консоли. Мне нужна новая функция для каждого изображения, которое загружается отдельно. – Benji40

+0

@ Benji40 - возможно, '$ (window) .load (...)' может быть самым простым вариантом. – jfriend00

+0

Хм, это может сработать, но поскольку я фокусируюсь на скорости страницы, я не хочу ждать, пока загрузится весь документ (только каждое изображение конкретно в слайдере), следовательно, используя первый метод 14k для содержимого выше складки. Но если нет другого пути, я буду использовать это и отметить его как правильно. – Benji40

0

Написать код JQuery ' $ (document) .ready (function() { // ваш код }); '

+0

Тем не менее код не срабатывает, пока я не обновляюсь, но спасибо – Benji40

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