Скрыть загрузку gif после обратного вызова ajax
У меня есть простой вопрос, но я не смог найти чистый ответ. Мне нужно загрузить тяжелые изображения после вызова ajax, и я хочу использовать анимированный gif как предварительный загрузчик. Я использую следующий код:
function loadProducts(url) {
$("#loading").show();
$('#inner').fadeOut(1).load(url + ' .product-list', function() {
$('#inner').fadeIn(1000, function() {
$("#loading").hide();
});
});
}
#loading скрывается при загрузке HTML .load(url + ' .product-list'
. Проблема в том, что тяжелые изображения все еще отображаются на экране, и я хотел бы продолжать показывать анимированный .gif до тех пор, пока рендеринг изображений не будет завершен. Есть ли способ узнать, когда отображаются изображения на экране?.
Спасибо заранее.
Ответы
Ответ 1
Вы можете использовать promises, чтобы проверить, загружены ли все изображения, а затем удалить загрузочный файл.
Это создает обещание, которое разрешается при загрузке изображения, все promises хранятся в массиве, и когда все promises разрешаются, то есть все изображения загружаются, срабатывает обратный вызов.
function loadProducts(url) {
$("#loading").show();
$('#inner').fadeOut(1).load(url + ' .product-list', function() {
var promises = [];
$('#inner').find('img').each(function(_, image) {
var img = new Image(),
def = new $.Deferred();
img.onload = function() {
def.resolve();
}
promises.push( def.promise() );
img.src = image.src;
if (img.complete) img.onload();
});
$.when.apply(undefined, promises).done(function() {
$('#inner').fadeIn(1000, function() {
$("#loading").hide();
});
});
});
}
Ответ 2
Вы можете использовать ImagesLoaded
Использование образца
imagesLoaded( document.querySelector('#container'), function( instance ) {
console.log('all images are loaded');
});
// selector string
imagesLoaded( '#container', function() {...});
// multiple elements
var posts = document.querySelectorAll('.post');
imagesLoaded( posts, function() {...});
Ответ 3
Вы можете попробовать использовать объект Image. Например:
function loadImage(url) {
$("#loading").show();
var img = new Image();
img.src = url;
img.onload = function(e) {
$("#loading").hide();
//ur code to append/show the image
};
}
Ответ 4
Можно добавить/удалить загрузчик как класс? У меня база 64encoded загрузчик, поэтому нет предварительного загрузчика требуется. Это также использует закрытие, чтобы позволить счетчику запомнить его значение.
var imgDiv = document.getElementById("imgDiv");
imgDiv.onclick = (function () {
"use strict";
var count = 0; // init the count to 0
return function () {
count++; //count
if (count === 1) { // do something on first click
$('.img-loader-content').addClass('loader');
$('.imgDiv').load("images/img.jpg", function () {
$('.img-loader-content').removeClass('loader');
});
}
if (count > 1) {
$('.imgDiv').slideToggle(400);
}
};
})
();
Ответ 5
самый подход к этому - использование onLoad
, поэтому в основном после успешного вызова ajax вызовите другой вызов в функцию успеха:
http://www.w3schools.com/jsref/event_onload.asp
onload чаще всего используется внутри элемента для выполнения script после того, как веб-страница полностью загрузила весь контент (включая изображения, script файлы, файлы CSS и т.д.).
или использовать собственное решение следующим образом:
<img src="w3javascript.gif" onload="loadImage()">
http://www.w3schools.com/jsref/event_img_onload.asp
Также последний ответ на этот вопрос очень полезен в вашем случае:
Есть ли что-то похожее на` $(window).load(); `для выполнения функции после того, как вновь вставленное содержимое Ajax закончило загрузку?
Ответ 6
Вы можете легко сделать это с помощью обратного вызова ajaxComplete, здесь посмотрите пример http://www.w3schools.com/jquery/tryit.asp?filename=tryjquery_ajax_ajaxcomplete