我有一个代码发布到一个php脚本,它读取文件夹中的所有文件并返回它们,所有这些都是img,jquery解析信息,var是一个数组,每个图像都保存为img对象使用src,width,height和attr,在成功时,我想检查每个图像是否已加载,然后最终完成触发另一个函数并删除div。但我不知道如何检查图像是否已完全加载,我一直在使用.complete,但它似乎永远不会加载,函数调用itsef直到img加载然后返回true以便它可以保持去。这是代码,它有点乱,可能不是很好的编码。
var gAllImages = [];
function checkFed()
{
var leni = gAllImages.length;
for (var i = 0; i < leni; i++) {
if (!gAllImages[i].complete) {
var percentage = i * 100.0 / (leni);
percentage = percentage.toFixed(0).toString() + ' %';
console.log(percentage);
// userMessagesController.setMessage("loading... " + percentage);
checkFed();
return;
}
//userMessagesController.setMessage(globals.defaultTitle);
}
}
if($('slideshow')){
var topdiv = '<div id="loading"><div class="centered"><img src="/karlaacosta/templates/templatename/images/ajax-loader.gif" /></div> </div>';
$('#overall').append(topdiv);
//console.log('alerta');
var jqxhr = $.post('http://localhost/karlaacosta/templates/templatename/php/newtest.php', function(data){
var d = $.parseJSON(data);
//console.log(d[1]);
if(typeof(d) == 'object' && JSON.parse){
var len = d.length;
//console.log(len);
for(var i = 0; i < len; i++){
var theImage = new Image();
var element = d[i].split('"');
// console.log(element);
// console.log(element[4]);
theImage.src = '/karlaacosta/images/Fotografia/TODO'+element[0];
theImage.width = element[2];
theImage.height = element[4];
theImage.atrr = element[6];
gAllImages.push(theImage);
}
// console.log(html);
}else{
console.log('error');
}
}).success(function (){
setTimeout('checkFed', 150);
}).error(function(){
var err = '<div id="error"><h2>Error: Lo sentimos al parecer no se pueden cargar las imagenes</h2></div>';
$('#loading').append(err);
}).complete(
function(){
var len = gAllImages.length;
var html = '<ul class="slides">'
for(var i = 0; i < len; i++){
html += '<li><img src="'+gAllImages[i].src+'" width="'+gAllImages[i].width+'" height="'+gAllImages[i].height+'" attr="'+gAllImages[i].attr+'" /></li>';
}
html += '</ul>';
$('#slideshow').append(html);
}
);
jqxhr.complete(function(){
//
imageSlide();
$('#loading').remove();
//
console.log('completed');
});
}
如果我取出checkFed()的递归显然脚本完成,当图像放在html上时它们被加载得很好而且快速,是否在缓存中从未被加载?对代码其他部分的任何其他描述也受到欢迎。
答案 0 :(得分:6)
我想检查每个图像是否已加载,然后最终完成另一个函数并删除div。但我不知道如何检查图像是否已完全加载
从根本上说,检查图像加载成功很简单:
var theImage = new Image();
var element = d[i].split('"');
$(theImage).load(function() {
// The image has loaded (from cache, or just now)
// ...do something with the fact the image loaded...
});
theImage.src = '/karlaacosta/images/Fotografia/TODO'+element[0];
上面的关键是在设置load
之前挂钩src
事件。如果您先设置src
,并且图片位于缓存中,load
事件可能会在下一行代码挂钩之前触发,您将会错过它。
HTML:
<img src="http://www.gravatar.com/avatar/ca3e484c121268e4c8302616b2395eb9?s=32&d=identicon&r=PG">
<p>When you see the image above,
<input type="button" id="theButton" value="Click Me"></p>
JavaScript的:
jQuery(function($) {
$("#theButton").click(function() {
var img = document.createElement('img');
$(img).load(function() {
display("Image <code>load</code> event received");
});
img.src = "http://www.gravatar.com/avatar/ca3e484c121268e4c8302616b2395eb9?s=32&d=identicon&r=PG";
document.body.appendChild(img);
});
function display(msg) {
$("<p>").html(msg).appendTo(document.body);
}
});
正如您所看到的,我在每种情况下都使用相同的img src
。在我尝试的每个浏览器上都可靠,我做接收load
事件。
答案 1 :(得分:1)
由于浏览器缓存和事件模型的怪异,它在没有插件的情况下以可靠的跨浏览器方式无法实现。尝试imagesLoaded或waitForImages。