我目前正在开发一个jQuery解决方案,其中我想从Flickr的RSS源加载图像。但是,我对来自源的默认大小不满意,我希望我加载的图像等于或高于我显示它们的包装器元素的高度。(宽度在这里不是问题。)
根据他们的API文档,Flickr有一个图像大小系统,如下所示:
这意味着没有保证的高度 - 我需要检查我想要加载的每个图像的高度。例如:如果一张图片是全景图并且我加载了大尺寸,那么高度可能仍然不足以填满我的包装器元素。这是因为最长的一边将是宽度,它将是1024。
更复杂的是,包装器的高度可以变化 - 不是在页面加载后动态变化,而是从页面到页面。在某些页面上,它是300像素,而在其他页面上,它是100像素等等。
据我所知,获取图像文件的高度的唯一方法是实际加载它。因此,我编写了一些递归代码,加载图像,查看其高度,如果不足,则再次调用自身以加载下一个大小。在当前版本中,它从最小尺寸开始,并一直向上工作,直到找到合适的图像或最大的可能图像。
以下是代码:
根据他们的API文档,Flickr有一个图像大小系统,如下所示:
s small square 75x75
t thumbnail, 100 on longest side
m small, 240 on longest side
- medium, 500 on longest side
z medium 640, 640 on longest side
b large, 1024 on longest side*
o original image, either a jpg, gif or png, depending on source format
* Before May 25th 2010 large photos only exist for very large original images
这意味着没有保证的高度 - 我需要检查我想要加载的每个图像的高度。例如:如果一张图片是全景图并且我加载了大尺寸,那么高度可能仍然不足以填满我的包装器元素。这是因为最长的一边将是宽度,它将是1024。
更复杂的是,包装器的高度可以变化 - 不是在页面加载后动态变化,而是从页面到页面。在某些页面上,它是300像素,而在其他页面上,它是100像素等等。
据我所知,获取图像文件的高度的唯一方法是实际加载它。因此,我编写了一些递归代码,加载图像,查看其高度,如果不足,则再次调用自身以加载下一个大小。在当前版本中,它从最小尺寸开始,并一直向上工作,直到找到合适的图像或最大的可能图像。
以下是代码:
$.getJSON(ajaxContentURL, function(data) {
var flickrImages = [];
// An array of object with data pertaining Flickr's image sizes
var flickrImageSizes = [{ size: "small square", pixels: 75, letter: "_s" },
{ size: "thumbnail", pixels: 100, letter: "_t" },
{ size: "small", pixels: 240, letter: "_m" },
{ size: "medium", pixels: 500, letter: "" },
{ size: "medium 640", pixels: 640, letter: "_z" },
{ size: "large", pixels: 1024, letter: "_b"}];
$.each(data.items, function(index, item) {
flickrImages.push(loadFlickrImage(item, 0));
});
function loadFlickrImage(item, sizeIndex) {
var path = item.media.m;
var imgSrc = path.replace("_m", flickrImageSizes[sizeIndex].letter);
var tempImg = $("<img />").attr("src", imgSrc);
tempImg.load(function() {
// Is it still smaller? Load next size
if (this.height < el.data("scrollableAreaHeight")) {
// Load a bigger image, if possible
if ((sizeIndex + 1) < flickrImageSizes.length) {
loadFlickrImage(item, sizeIndex + 1);
} else {
return this;
}
else {
return this;
}
});
}
});
这个方法可行,但是加载那么多版本的图像似乎很浪费?你有什么改进的建议吗?我想首先猜测最合适的尺寸并加载它。然后它会查看是否适合或者它太小或太大,然后加载尺寸范围内的前一个或后一个图像。这样你就可以减少加载图像的数量以获得正确的尺寸。
更好的办法是:有没有一种方法可以在不加载实际图像文件的情况下找出图像的大小?请记住我没有完整的Flickr API访问权限 - 我只是访问JSON-feed,就像这个链接。
我希望能得到任何反馈!
先谢谢了!