2010-12-11 31 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中調試它的原因導致返回是正確的,這會使代碼減慢足夠長的時間,以便在返回之前執行回調。