看来HEAD
我通过 jQuery 的$.ajax({...});
方法发送的请求正在返回给定资源的内容(至少在 Firefox 中...... IE 似乎正常运行),而不仅仅是标题。我试图仅捕获Content-Length
header 属性,以在图像预加载器中使用,尽管似乎仅通过查询Content-Length
,它就下载了内容本身。
这里的操作顺序是:
- 使用 CSS 查找给定页面中的所有元素,并使用 URL
background-image
填充数组 ( )。imageTemp
- 对于每个图像 URL,执行 Ajax
HEAD
请求,以获取URLContent-Length
并将其添加到bytesTotal
数组 (imageData
) 中,并使用 URL 和该图像的Content-Length
.- 同时,启动一个
setInterval
事件处理程序来定期检查是否所有的 AjaxHEAD
请求都已完成。
- 同时,启动一个
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);
这与我通过 Javascript/jQuery 在 Ajax HEAD 请求中提出的问题直接相关,但它肯定不是重复的,因为该问题已从先前解决的问题扩展而来。