2010-12-11 2 views
2

У меня есть следующий фрагмент кода:Как получить «Content-Length» через javascript?

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, который может просто вернуть размер изображения, поэтому вам не нужно передавать его по сети, чтобы знать его размер, но вопрос остается в силе как упражнение –

ответ

3

Это потому, что функция возвращает значение перед ответом возвращается и size установлен. Это выполняется асинхронно. Вы хотите передать функцию обратного вызова и применить ее с аргументом size.

+0

Я думал об этом ... Использование объектов даты У меня была функция, подождите 5 секунд до возвращения. Все еще вернулся неопределенный. – srcspider

+0

@srcspider Не возвращайте 'size' (там всегда будет неопределено). Вместо этого передайте обратный вызов getImageSize, который * вызывается из обратного вызова AJAX *, где вы читаете длину содержимого. Передайте размер в качестве аргумента для обратного вызова. Другим подходом является использование * синхронного * AJAX-запроса, но это * обычно нецелесообразно *, поскольку оно блокирует и может привести к очень безответственному решению. – 2010-12-11 01:09:02

+2

@srcspider: вы можете найти [jQuery] (http://jquery.com) интересным. Познакомьтесь подробнее с функцией [jQuery.ajax()] (http://api.jquery.com/jQuery.ajax/). Существует опция «success», в которой вы можете передать функцию обратного вызова, которая будет выполнена, когда ответ будет возвращен. jQuery предлагает больше преимуществ. Пойдите, проверьте это :) – BalusC

1

У вас там проблемы с кодом, этот код не синхронный, он асинхронный.

Обратный вызов происходит в будущем, тогда как возвращение происходит сразу.

Причина, по которой ее отладка в Firebug приводит к правильному возврату, замедляет код, достаточно долго, чтобы обратный вызов выполнялся до того, как вы вернетесь к возврату.

Смежные вопросы