2013-03-17 117 views
0

我遇到了获取图像尺寸的问题。我想知道图像的宽度和高度,而无需将其加载到文档中。目前我有代码如下:获取图像尺寸

function getImageSize (path) { 
    var image = new Image(); 
    image.name = path; 
    var d = image.onload = function() { 
    var w = this.width; 
    var h = this.height; 
    return {width : w, height : h}; 
    }(); 
    image.src = path; 
    return d; 
} 

如果我调用该函数,我得到对象在两个索引含有未定义的(W,H)。我试过不通过排除括号(8行)来调用onload处理程序,但我得到的是函数代码。

请注意,如果我在onload处理程序体内调用alert(w),我可以看到图片的宽度,但不在其外部。

有人知道如何解决这个问题吗?我如何获得图像尺寸?

回答

6

此块

var d = image.onload = function() { 
    var w = this.width; 
    var h = this.height; 
    return {width : w, height : h}; 
}(); 

看起来非常可疑。这实际上是执行功能立即和分配对象{width : w, height : h}image.onloaddwh将包含窗口的宽度和高度,因为this将参考window

您必须将函数分配给image.onload,而不是执行它。您必须分配函数的原因是,加载图像需要时间,并且图像加载后会调用回调。整个过程是异步。这也意味着你不能返回图像的尺寸从getImageSize。您必须使其接受回拨,您必须拨打load回拨。

例如:

function getImageSize (path, callback) { 
    var image = new Image(); 
    image.name = path; 
    image.onload = function() { 
    callback({width : this.width, height : this.height}; 
    } 
    image.src = path; 
}; 

,并呼吁与

getImageSize('path/to/image', function(dim) { 
    // do something with dim.width, dim.height 
}); 

功能看一看的my answer here第一部分了解的同步和异步代码的差异,回调的作用。

+0

我试过回调但仍然无法返回值。 – 2013-03-17 12:29:34

+0

正如我所说,你不能返回尺寸。引用自己:*“这也意味着你**不能**从'getImageSize' * *返回图像的尺寸。所有需要访问维度的代码都必须从回调中调用。 – 2013-03-17 12:42:02

0

onload是一个异步调用,不能返回任何有用的调用函数。

您将不得不使用全局变量和计时器检查来等待函数完成,然后访问这些值。