您好,并提前感谢您对这个难题的帮助!
我在globalMaxW
功能中设置$.imgpreload()
时遇到问题。
console.log(globalMaxW);
函数之后调用时, 0
会返回$.imgpreload()
,而在$.imgpreload()
函数内部调用时会返回正确的图像宽度。
如何在嵌套函数中设置全局变量globalMaxW
?
谢谢!
var globalMaxW = 0;
function infoWidth() {
$('.swipe-wrap img').each(function(){
var $me = $(this),
mysrc = $me.attr('src');
var newimg = new Image();
newimg.src = mysrc;
$.imgpreload($me, function(){
if(newimg.width > globalMaxW) {
globalMaxW = newimg.width;
}
});
console.log(globalMaxW);
});
$('#info p').css({'width' : globalMaxW});
}
答案 0 :(得分:1)
你的console.log(globalMaxW)在下面的代码完成执行之前发生,是的,那时它确实等于零:
$.imgpreload($me, function(){
if(newimg.width > globalMaxW) {
globalMaxW = newimg.width;
}
});
由于该函数是异步的,它开始运行" imgpreload"并立即继续,而不是等待它完成。 globalMaxW将被设置,但是在console.log()...
之后答案 1 :(得分:0)
我认为这是jquery.imgpreload插件。 imgpreload是异步的,所以你的globalMaxW是设置的,但是只有在你调用的第二个参数调用的回调函数之后才会设置,这只有在以异步方式获取图像后才会发生。我知道你只想在预加载所有图像后才设置css属性。因此,您可以使用jquery延迟对象的集合来实现此目的。
在下面的代码中,将创建jQuery $ .Deferred对象并将其推送到每个imgpreload调用的数组中。一旦imgpreload调用了回调,您就可以看到延迟已解决。
在底部$ .when函数基本上调用完成回调一次,每一个$ .Deferred在promises集合中解析。
function infoWidth() {
var promises = [];
$('.swipe-wrap img').each(function(){
var $me = $(this),
mysrc = $me.attr('src');
var newimg = new Image();
newimg.src = mysrc;
var def = new $.Deferred();
promises.push(def);
$.imgpreload($me, function(){
if(newimg.width > globalMaxW) {
globalMaxW = newimg.width;
}
def.resolve();
});
console.log(globalMaxW);
});
$.when.apply($, promises).done(function(){
// when all of the promises are resolved that means all imgpreload functions invoked the callbacks
// and here your globalMaxW is set.
$('#info p').css({'width' : globalMaxW});
});
}