2010-12-11 266 views
2

我有下面的代码片段:如何通过javascript获取“Content-Length”?

var size; 
function getImageSize(url) 
{ 
    var xhr = new XMLHttpRequest(); 
    xhr.open('HEAD', url, true); 
    xhr.onreadystatechange = function() 
    { 
     if (xhr.readyState == 4) 
     { 
      if (xhr.status == 200) 
      { 
       size = xhr.getResponseHeader('Content-Length'); 
       alert(size); 
      } 
     } 
    }; 
    xhr.send(null); 
    return size; 
} 

功能的目的是返回文件大小(的形象)。

函数内的警报将始终返回正确的值,但函数本身将始终返回undefined。为什么?

Odly,如果我萤火虫调试它,该函数将总是正确返回...

+0

如果可能的话,我会创建一个ajax调用,它可以返回图像的大小,所以您不必通过网络传输它来知道它的大小,但问题仍然是有效的练习 – 2010-12-11 01:36:02

回答

3

这是因为响应之前该函数返回返回和size设置。它是异步执行的。您想要传递回调函数,并将其作为参数与size一起应用。

+0

我想到了...使用日期对象我已经有函数等待5秒钟才返回。仍然返回undefined。 – srcspider 2010-12-11 01:02:15

+0

@srcspider不要返回'size'(在那里总是未定义)。相反,将回调传递给getImageSize,它将在您读取内容长度的AJAX回调*中调用。将大小作为参数传递给回调。另一种方法是使用* synchronous * AJAX请求,但这通常是不可取的,因为它会阻止并可能导致一个非响应式的解决方案。 – 2010-12-11 01:09:02

+2

@srcspider:你可能会发现[jQuery](http://jquery.com)很有趣。仔细看看[jQuery.ajax()](http://api.jquery.com/jQuery.ajax/)函数。有一个'成功'选项,你可以传递一个回调函数,当响应被返回时这个回调函数会被执行。 jQuery也提供了更多的优势。去检查一下:) – BalusC 2010-12-11 01:17:14

1

那么你有一个代码顺序问题那里,代码是不同步的,它是异步的。

回调发生在未来,而回报则直接发生。

在Firebug中调试它的原因导致返回是正确的,这会使代码减慢足够长的时间,以便在返回之前执行回调。