Похоже, что запросы HEAD
, которые я отправляю с помощью метода $.ajax({...});
jQuery, возвращают содержимое данного ресурса (по крайней мере, в Firefox... IE работает нормально), а не только заголовки. Я пытаюсь захватить только свойство заголовка Content-Length
для использования в предварительном загрузчике изображений, хотя кажется, что, просто запрашивая Content-Length
, он загружает сам контент.
Порядок работы здесь таков:
- Найдите все элементы на данной странице с помощью CSS
background-image
и заполните массив (imageTemp
) URL-адресами. - For each image URL, perform an Ajax
HEAD
request, to obtain theContent-Length
and add that tobytesTotal
as well as populate the array (imageData
) with both the URL and that image'sContent-Length
.- Simultaneously, start a
setInterval
event handler to periodically check whether or not all of the AjaxHEAD
requests have completed.
- Simultaneously, start a
- Когда запросы
HEAD
будут выполнены, начните загружать изображения в объектыImage()
изimageData
, добавляя связанное значение изображенияContent-Length
к значениюbytesLoaded
.\ - Когда
bytesLoaded == bytesTotal
изображений будут загружены, и предварительный загрузчик завершится.
Вот мой скрипт на данный момент:
(function($){
var callbacks = {
initiate: function(){},
progress: function(percent){},
complete: function(){},
};
var imageTemp = Array();
var imageData = Array();
var imageCurrent = null;
var intervalId = 0;
var bytesLoaded = 0;
var bytesTotal = 0;
$.preloader = function(arguments){
for(var arg in arguments){
callbacks[arg] = arguments[arg];
}
callbacks.initiate();
$('*')
.each(function(index){
if($(this).css('background-image') != 'none'){
imageTemp.push($(this).css('background-image').slice(5, -2));
}
});
intervalId = window.setInterval(function(e){
if(imageData.length == imageTemp.length){
window.clearInterval(intervalId);
for(var i = 0; i < imageData.length; i++){
(function(imageIndex){
currentImage = new Image();
currentImage.src = imageData[imageIndex][0];
currentImage.onload = function(e){
bytesLoaded += parseInt(imageData[imageIndex][1]);
callbacks.progress(bytesLoaded/bytesTotal);
if(bytesLoaded >= bytesTotal){
callbacks.complete();
}
};
})(i);
}
}
}, 1);
for(var i = 0; i < imageTemp.length; i++){
(function(i){
$.ajax({
type: "HEAD",
async: true,
url: imageTemp[i],
success: function(message, text, response){
var bytes = parseInt(response.getResponseHeader('Content-Length'));
bytesTotal += bytes;
imageData.push([imageTemp[i], bytes]);
},
});
})(i);
}
};
})(jQuery);
Это напрямую связано с моим вопросом в запросе Ajax HEAD через Javascript/jQuery , но это точно не дубликат, так как вопрос расширился от ранее решенного вопроса.
initiate
до тех пор, пока он полностью не завершится, а затем переходит кcomplete
, выбрасывает100%
, и предварительный загрузчик готов. Прогресса нет. В то время как в IE он работает нормально; по мере загрузки изображений процент увеличивается. Я полагаю, мне придется попробовать cURL или что-то еще. Любые другие идеи? - person Dan Lugg   schedule 17.01.2011HEAD /image.gif
, если javascript и браузер работают правильно. Имейте в виду, вы увидитеGET /image.gif
, если браузер запрашивает изображение самостоятельно (после того, как он нашел элемент ‹img› или правило css и т. д.), поэтому вы можете увидеть оба типа запросов. - person goat   schedule 18.01.2011console.log()
часть ответа xmlHttp (я забыл, что именно, я немного не смотрел на это) из запросаHEAD
, он выгружает необработанные данные изображения. Это говорит мне о том, что Firefox неправильно интерпретирует мойHEAD
запрос. Я видел статьи, в которых упоминается, что некоторые методы запросов не реализованы в соответствии со стандартами даже в популярных браузерах. Хотя часто это незначительные детали, возможно, это тот случай, когда проблема оказывает влияние. - person Dan Lugg   schedule 19.01.2011