Ciao a tutti,
tempo fa in un thread è stato sollevato il problema di eseguire il preload di un file diverso da un immagine.
Poichè il classico approccio
obj = new Image()
obj.src = ...
obj.onload = ...
non funziona con tutti i formati di file, vi propongo la mia soluzione, (a dir la verità abbastanza banale, ma non mi sembra che qualcuno l'abbia proposta ancora) che sfrutta ajax per eseguire una richiesta get ad una risorsa.
Un esempio funzionante si trova qui
http://www.fabriziocalderan.it/code/...oad/index.html
in cui si trova un esempio e la spiegazione del codice che ho usato. La classe che ho creato (AJAXPreload) è prelevabile direttamente dal sorgente, Per comodità la riporto anche qui.
Non ho inserito (per ora) la gestione degli errori, aspetto un vostro riscontro sul funzionamento generale del codice applicato a file di diverso tipo (mp3, ra, pdf...)
Inoltre, per via delle limitazione dell'oggetto xmhttprequest il preload è possibile solo su file dello stesso dominio (limite accettabile nella maggior parte dei casi credo...)
codice:
<script type="text/javascript">
// <![CDATA[
function AJAXPreload() {
var id = '';
var uri = '';
var attr = '';
var clss = '';
var XMLHttpReqObj = null;
this.setUri = function(this_uri) {
uri = this_uri;
}
this.setElementOnLoad = function(this_id, this_attr) {
id = this_id;
attr = this_attr;
}
this.setClassOnLoad = function(this_class) {
clss = this_class;
}
this.initPreload = function() {
if (typeof XMLHttpRequest != "undefined") {
XMLHttpReqObj = new XMLHttpRequest();
}
else {
try {
XMLHttpReqObj = new ActiveXObject("Msxml2.XMLHTTP");
} catch (e) {
try {
XMLHttpReqObj = new ActiveXObject("Microsoft.XMLHTTP");
}
catch (e) {
XMLHttpReqObj = null;
}
}
}
if (!XMLHttpReqObj) {
return false;
}
else {
XMLHttpReqObj.open("GET", uri, true);
XMLHttpReqObj.onreadystatechange = function() {
switch (XMLHttpReqObj.readyState) {
case 0: // Uninitialized
case 1: // Loading
case 2: // Loaded
case 3: // Ready
break;
case 4:
switch(XMLHttpReqObj.status) {
case 200:
case 304:
document.getElementById(id).setAttribute(attr, uri);
if (!(clss == '')) {
document.getElementById(id).className = clss;
}
break;
case 0: // wrong protocol
default:
// Catch exception for IE
}
break;
}
} // function onreadystatechange
XMLHttpReqObj.send(null);
delete XMLHttpReqObj;
}
}
}
// ]]>
</script>
Ciao