Я хочу установить фоновое изображение для тега body, а затем запустить некоторый код - например, так:
$('body').css('background-image','http://picture.de/image.png').load(function() { alert('Background image done loading'); // This doesn't work });
Как я могу убедиться, что фоновое изображение полностью загружено?
попробуйте это:
$('<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.
У меня есть jQuery-плагин с именем waitForImages, который может определять, когда загружены фоновые изображения.
waitForImages
$('body') .css('background-image','url(http://picture.de/image.png)') .waitForImages(function() { alert('Background image done loading'); // This *does* work }, $.noop, true);
Примерно так:
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(); }); } });
Для CSS-ресурсов нет обратных вызовов JS.
Вот небольшой плагин, который я сделал, чтобы позволить вам сделать именно это, он также работает с несколькими фоновыми изображениями и несколькими элементами:
Прочитайте статью:
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
Я нашел решение, которое работало лучше для меня, и которое имеет преимущество в том, что его можно использовать с несколькими изображениями (случай не показан в этом примере).
Из ответа @ 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();
Если у вас есть элемент с фоновым изображением, как этот
<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();
Я сделал чистый взлом 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; }
https://github.com/alexanderdickson/waitForImages
$('selector').waitForImages({ finished: function() { // ... }, each: function() { // ... }, waitForAll: true });
чистое решение 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; }