JS ждет загрузки фонового изображения CSS

Легко заставить javascript ждать загрузки некоторых изображений, если это классические HTML-изображения.

Но я не могу понять, как сделать то же самое, если изображение загружается как CSS backuground-image!

Является ли это возможным?

Метод jQuery .load(), похоже, не применяется... и мне не хватает идей


person Valentino    schedule 28.01.2012    source источник
comment
Первое, что приходит на ум, — предварительно кэшировать изображение в реальном элементе img, который можно скрыть. Что-то вроде: technosophos.com/content/. Хотя, вероятно, есть лучшие решения.   -  person mowwwalker    schedule 28.01.2012
comment
Вы можете проверить этот ответ: stackoverflow.com/questions/3489270/   -  person Jason Gennaro    schedule 28.01.2012
comment
Я не пробовал это, но, возможно, вы могли бы выполнить предварительную загрузку изображения из JS/jQuery (например, для ролловеров изображений старой школы), проверить статус загрузки изображения, а затем после его загрузки назначить свойство фона CSS к тому же изображению, прежде чем переходить к любому другому JS, который вы хотите сделать, когда изображение будет готово?   -  person nnnnnn    schedule 28.01.2012
comment
поэтому фоновая загрузка не вызывает никаких событий.. очень плохо. Тогда, думаю, мне удастся заставить его работать с предварительным загрузчиком. спасибо за подсказку ребята   -  person Valentino    schedule 28.01.2012
comment
вы можете использовать AJAX для этого, после успешного завершения вашего запроса ваше ожидание.   -  person Ali U    schedule 28.01.2012
comment
Я думал об этом, но как только я получил свое изображение внутри объекта js, как я могу использовать его в качестве фона css?   -  person Valentino    schedule 28.01.2012


Ответы (4)


Он ищет элементы с атрибутом src или css-свойством backgroundImage и вызывает функцию действия при загрузке их изображений.

/**
 * Load and wait for loading images.
 */
function loadImages(images, action){
    var loaded_images = 0;
    var bad_tags = 0;        

    $(images).each(function() {
    //alert($(this).get(0).tagName+" "+$(this).attr("id")+" "+$(this).css("display"));
        var image = new Image();
        var src = $(this).attr("src");
        var backgroundImage = $(this).css("backgroundImage");            
        // Search for css background style
        if(src == undefined && backgroundImage != "none"){
            var pattern = /url\("{0,1}([^"]*)"{0,1}\)/;                
            src = pattern.exec(backgroundImage)[1];                
        }else{
            bad_tags++;
        }
        // Load images
        $(image).load(function() {
            loaded_images++;                
            if(loaded_images == ($(images).length - bad_tags))
                action();
        })
        .attr("src", src);
    });
}
person Arkadiusz Cieśliński    schedule 21.12.2012

Одним из альтернативных подходов может быть получение данных изображения через AJAX в виде файла png в кодировке base64 и применение их к свойству background-image элемента.

Например:

$.get('/getmyimage', function(data) {
    // data contains base64 encoded image
    // for ex: data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHElEQVQI12P4//8/w38GIAXDIBKE0DHxgljNBAAO9TXL0Y4OHwAAAABJRU5ErkJggg==

    $('#yourElement').css('background-image', 'url("' + data + '")');
});

Вам также понадобится скрипт на стороне сервера, который читает изображение, преобразует его в закодированный в base64 png (и, возможно, кеширует его) и возвращает то же самое.

person techfoobar    schedule 21.12.2012

это непроверенный код, но попробуйте следующее:

$(document).ready(
 function() 
 {
   var imgSrc = $('theTargerElement').css('background-image');
   var imgTag = $('<img>').attr('src',imgSrc).appendTo( 'body' );
 }
);

$(document)
 .load( 
   function() 
   {
     // do stuff
   } 
  );
person Shaheer    schedule 28.01.2012

Попробуй это...

Это jQuery-плагин, который дает вам возможность ждать загрузки изображений.

Главная страница проекта

Thread @ SO Официальный способ попросить jQuery дождаться загрузки всех изображений перед выполнением чего-либо

Ответ @ SO (ShortLink)

person DerDu    schedule 29.05.2012
comment
На самом деле это не ответ - все, что вы делаете, это ссылаетесь на другой пост на сайте ... С небольшим количеством повторений вы сможете оставить такую ​​​​помощь в комментарии ... - person Lix; 29.05.2012
comment
Да, я знаю, но я не хочу публиковать душу дважды, поэтому не голосуйте за нее только потому, что это ссылка ... это решение ;-) отлично сработало для меня по этому вопросу .. [сделал небольшое редактирование ] - person DerDu; 29.05.2012
comment
Вы не получите никакой репутации, размещая ссылки на ответы других людей... Если хотите, я опубликую это как комментарий для вас. В любом случае, если существует ответ на другой вопрос, который также отвечает на этот вопрос, это означает, что этот вопрос является дубликатом, и он не должен существовать вообще... Я удалю свой отрицательный голос, но, пожалуйста, не публикуйте по ссылке только ответы... - person Lix; 29.05.2012
comment
Хорошо, я делаю все возможное :-) спасибо, и если хотите, добавьте это как комментарий к вопросу. - person DerDu; 29.05.2012