HEAD
jQueryのメソッドを介して送信しているリクエストは、$.ajax({...});
ヘッダーだけでなく、指定されたリソースのコンテンツを返しているようです(少なくともFirefoxでは... IEは正常に機能しているようです)。画像プリローダーで使用するために、ヘッダープロパティのみをキャプチャしようとしてContent-Length
いますが、をクエリするだけでContent-Length
、コンテンツ自体がダウンロードされたようです。
ここでの操作の順序は次のとおりです。
- CSSを使用して特定のページのすべての要素を検索し
background-image
、配列(imageTemp
)にURLを入力します。 - 画像のURLごとに、Ajax
HEAD
リクエストを実行して、を取得しContent-Length
て追加しbytesTotal
、配列(imageData
)にURLとその画像の両方を入力しますContent-Length
。- 同時に、イベントハンドラーを開始して、すべてのAjax要求が完了し
setInterval
たかどうかを定期的に確認します。HEAD
- 同時に、イベントハンドラーを開始して、すべてのAjax要求が完了し
- リクエストが完了したら、からオブジェクト
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を介したAjaxHEADリクエストでの私の質問に直接関連していますが、問題が以前に解決された質問から拡張されているため、確かに重複していません。