Как я могу проверить, загружено ли фоновое изображение? - PullRequest
138 голосов
/ 20 февраля 2011

Я хочу установить фоновое изображение для тега body, а затем запустить некоторый код - например, так:

$('body').css('background-image','http://picture.de/image.png').load(function() {
    alert('Background image done loading');
    // This doesn't work
});

Как я могу убедиться, что фоновое изображение полностью загружено?

Ответы [ 9 ]

259 голосов
/ 20 февраля 2011

попробуйте это:

$('<img/>').attr('src', 'http://picture.de/image.png').on('load', function() {
   $(this).remove(); // prevent memory leaks as @benweet suggested
   $('body').css('background-image', 'url(http://picture.de/image.png)');
});

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

23 голосов
/ 12 марта 2013

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

$('body')
  .css('background-image','url(http://picture.de/image.png)')
  .waitForImages(function() {
    alert('Background image done loading');
    // This *does* work
  }, $.noop, true);
15 голосов
/ 15 июня 2012

Примерно так:

var $div = $('div'),
  bg = $div.css('background-image');
  if (bg) {
    var src = bg.replace(/(^url\()|(\)$|[\"\'])/g, ''),
      $img = $('<img>').attr('src', src).on('load', function() {
        // do something, maybe:
        $div.fadeIn();
      });
  }
});
12 голосов
/ 20 февраля 2011

Для CSS-ресурсов нет обратных вызовов JS.

6 голосов
/ 04 ноября 2014

Вот небольшой плагин, который я сделал, чтобы позволить вам сделать именно это, он также работает с несколькими фоновыми изображениями и несколькими элементами:

Прочитайте статью:

http://catmull.uk/code-lab/background-image-loaded/

или перейдите прямо к коду плагина:

http://catmull.uk/downloads/bg-loaded/bg-loaded.js

Так что просто включите плагин и затем вызовите его для элемента:

<script type="text/javascript" src="http://catmull.uk/downloads/bg-loaded/bg-loaded.js"></script>
<script type="text/javascript">
   $('body').bgLoaded();
</script>

Очевидно, загрузите плагин и сохраните его на своем собственном хостинге.

По умолчанию он добавляет дополнительный класс "bg -loaded" к каждому сопоставленному элементу после загрузки фона, но вы можете легко изменить егопередав ему другую функцию, подобную этой:

<script type="text/javascript" src="http://catmull.uk/downloads/bg-loaded/bg-loaded.js"></script>
<script type="text/javascript">
   $('body').bgLoaded({
      afterLoaded : function() {
         alert('Background image done loading');
      }
   });
</script>

Вот кодекс, демонстрирующий его работу.

http://codepen.io/catmull/pen/Lfcpb

3 голосов
/ 16 мая 2018

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

Из ответа @ adeneo на этот вопрос :

Если у вас есть элемент с фоновым изображением, как этот

<div id="test" style="background-image: url(link/to/image.png)"><div>

Вы можете дождаться загрузки фона, получив URL-адрес изображения и использование его для объекта изображения в javascript с обработчиком загрузки

var src = $('#test').css('background-image');
var url = src.match(/\((.*?)\)/)[1].replace(/('|")/g,'');

var img = new Image();
img.onload = function() {
    alert('image loaded');
}
img.src = url;
if (img.complete) img.onload();
2 голосов
/ 09 ноября 2016

Я сделал чистый взлом JavaScript, чтобы сделать это возможным.

<div class="my_background_image" style="background-image: url(broken-image.jpg)">
<img class="image_error" src="broken-image.jpg" onerror="this.parentElement.style.display='none';">
</div>

Или

onerror="this.parentElement.backgroundImage = "url('image_placeHolder.png')";

CSS:

.image_error {
    display: none;
}
1 голос
/ 07 апреля 2015

https://github.com/alexanderdickson/waitForImages

$('selector').waitForImages({
    finished: function() {
       // ...
    },
    each: function() {
       // ...
    },
    waitForAll: true
});
0 голосов
/ 31 января 2019

чистое решение JS, которое добавит предварительный загрузчик, задает background-image, а затем устанавливает его для сбора мусора вместе со слушателем событий :

const imageUrl = "https://www.google.com/images/branding/googlelogo/1x/googlelogo_color_272x92dp.png";
let bgElement = document.querySelector("body");
bgElement.classList.add("loading");
let preloaderImg = document.createElement("img");
preloaderImg.src = imageUrl;

preloaderImg.addEventListener('load', (event) => {
  bgElement.classList.remove("loading");
  bgElement.classList.add("loaded");
  bgElement.style.backgroundImage = `url(${imageUrl})`;
  preloaderImg = null;
});
.loading {
  opacity: 0;
  transition: opacity .4s ease-out;
}

.loaded {
  opacity: 1;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...