我有以下内容:
var ImageArray = [];
var Images = $('#ImageSelection').children('img');
var i = 0;
Images.each(function() {
var ImageSource = $(this).attr('src');
var ImageTitle = $(this).attr('alt');
var ImageHeight;
getImageDimensions(ImageSource, function(data) {
ImageHeight = data.height;
alert(typeof ImageHeight + ' ' + ImageHeight);
});
alert(typeof ImageHeight + ' ' + ImageHeight);
$(this).attr('id', i);
ImageArray[i] = {
'src': ImageSource,
'title': ImageTitle,
'height': ImageHeight,
'id': i
};
i++;
});
运行此代码后,ImageArray[0].height
未定义,但回调函数中的警报显示高度正常,而不在回调中的警报显示为unfind。
getImageDimensions:
function getImageDimensions(path, callback) {
var img = new Image();
img.onload = function() {
callback({
height: img.height
});
}
img.src = path;
}
答案 0 :(得分:2)
代码var ImageArray = [];
不会使ImageArray
全局化;恰恰相反!由于您指定了var
,因此该变量将是定义它的范围的本地变量。
您可能已将代码包装在$(document).load(function(){ ... })
中,这可以解释行为。
解决方案:摆脱var
并为任何{}
之外的变量分配值:
<script type="text/javascript">ImageArray = [];</script>
答案 1 :(得分:1)
似乎是一个同步问题。在查询ImageHeight时,回调没有设置它。你应该在回调函数中设置ImageArray [i]。
以下代码应该有效:
var Images = $('#ImageSelection').children('img');
var ImageArray = [];
var i = 0;
Images.each(function() {
$(this).attr('id', i);
getImageDimensions($(this), function(data) {
var ImageHeight = data.height;
alert(typeof ImageHeight + ' ' + ImageHeight);
ImageArray[data.id] = {
'src': data.src,
'title': data.title,
'height': data.height,
'id': data.id
};
});
i++;
});
function getImageDimensions($img, callback) {
var img = new Image();
img.onload = function() {
callback({
id: $img.attr('id'),
height: img.height,
src: $img.attr('src'),
title: $img.attr('alt')
})
};
img.src = $img.attr('src');
};
答案 2 :(得分:1)
这是一个异步问题。
尝试重现您的代码行为。假设我们在Images数组中有一个图像。
在不久的将来,将调用图像的onload回调,并初始化您的变量。但为时已晚:你的每个功能都已经完成了。
你需要:
希望它有所帮助!
答案 3 :(得分:1)
我已经完善了跟踪图像加载的代码,并在准备好时调用processAfterLoading
var Images = $('#ImageSelection').children('img');
// new introduced Image-Load-Counter
var ImagesToLoad=Images.length;
var ImageArray = [];
var i = 0;
Images.each(function() {
$(this).attr('id', i);
getImageDimensions($(this), function(data) {
var ImageHeight = data.height;
alert(typeof ImageHeight + ' ' + ImageHeight);
ImageArray[data.id] = {
'src': data.src,
'title': data.title,
'height': data.height,
'id': data.id
};
// Keep track of the amount of images to load before working with ImageArray
ImagesToLoad--;
if (ImagesToLoad<1) processAfterLoading()
});
i++;
});
function getImageDimensions($img, callback) {
var img = new Image();
img.onload = function() {
callback({
id: $img.attr('id'),
height: img.height,
src: $img.attr('src'),
title: $img.attr('alt')
})
};
img.src = $img.attr('src');
};
function processAfterLoading() {
// Do ALL the things with ImageArray
}
答案 4 :(得分:0)
试试这个:
var ImageArray = [];
var Images = $('#ImageSelection').children('img');
var i = 0;
Images.each(function() {
var ImageSource = $(this).attr('src');
var ImageTitle = $(this).attr('alt');
var ImageHeight;
getImageDimensions(ImageSource, function(data) {
ImageHeight = data.height;
window.ImageArray[i] = {
'src': ImageSource,
'title': ImageTitle,
'height': ImageHeight,
'id': i
};
});
$(this).attr('id', i);
i++;
});