http://perishablepress.com/3-ways-preload-images-css-javascript-ajax/で、ajaxを使用してプリロードするこの手法を見つけました。
window.onload = function() {
setTimeout(function() {
// XHR to request a JS and a CSS
var xhr = new XMLHttpRequest();
xhr.open('GET', 'http://domain.tld/preload.js');
xhr.send('');
xhr = new XMLHttpRequest();
xhr.open('GET', 'http://domain.tld/preload.css');
xhr.send('');
// preload image
new Image().src = "http://domain.tld/preload.png";
}, 1000);
};
この画像の「ajax」プリロードは、実際にはまったくajaxではないことに気づきました。これは、私がすでに何年も使用しているものと同じですが、新しい画像オブジェクトのソースにURLを設定し、ブラウザにそれをキャッシュにロードさせるだけです。
ここで、一定の時間がかかった場合に、実際に画像のプリロードをキャンセルする必要があるアプリケーションがあったと想像してみてください。実際のxhrリクエストのロードを停止するxhr.abort()メソッドとは異なり、画像をsrcに設定するだけでこれを行う良い方法は実際にはありません。
以下のようなことをしても画像がプリロードされず、プリロードリクエストのキャンセルが許可されない理由はありますか?
function preload(url, timeout){
this.canceltimeout = function(){
clearTimeout(this.timeout);
this.loaded = true;
return false;
}
this.abort = function(){
this.xhr.abort();
this.aborted = true;
}
//creates a closure to bind the functions to the right execution scope
this.$_bind = function(method){
var obj = this;
return function (e){ obj[method](e);};
}
//set a default of 10 second timeout
if(timeout == null){
timeout = 10000;
}
this.aborted = false;
this.loaded = false;
this.xhr = new XMLHttpRequest();
this.xhr.onreadystatechange = this.$_bind('canceltimeout');
this.xhr.open('GET', url);
this.xhr.send('');
this.timeout = setTimeout(this.$_bind('abort'), timeout);
}
var llama = new preload('/image.gif');
show_image();
function show_image(){
if(llama.loaded){
var l = new Image();
l.src = '/image.gif';
application.appendChild(l);
}else if(llama.aborted){
var l = document.createElement('p');
l.innerHTML = 'image.gif got cancelled';
application.appendChild(l);
}else{
setTimeout(show_image, 10);
}
return false;
}