Código PHP:
var obj;
var i;
var secs = 0;
function send()
{
form = document.getElementById('uploader');
form.target = "iframe";
obj = new HttpRequest();
obj.setResponseType(3);
obj.oncomplete = function(){
json = obj.getResponse();
if ( json )
{
switch ( json.stat )
{
case 'copying':
document.getElementById('progress').innerHTML = json.value + ' Transfer Rate: ' + json.transfer_rate;
break;
case 'finished':
clearInterval(i);
document.getElementById('progress').innerHTML = 'Finished';
break;
case 'cancel':
document.getElementById('progress').innerHTML = 'Aborted by user';
break;
default:
document.getElementById('progress').innerHTML = 'Loading...';
}
}
}
document.getElementById('progress').innerHTML = 'loading...';
form.submit();
i = setInterval(update,1000);
}
function update()
{
secs += 1;
obj.loadAsync('progress.php');
}
Error: uncaught exception: [Exception... "Component returned failure code: 0xc1f30001 (NS_ERROR_NOT_INITIALIZED) [nsIXMLHttpRequest.send]" nsresult: "0xc1f30001 (NS_ERROR_NOT_INITIALIZED)" location: "JS frame :: javascript: eval(__firebugTemp__); :: anonymous :: line 1" data: no]
Transcurrido un par de segundos este error desaparece. Una posible solución es establecer un intervalo cada 3 segundos, pero el chequeo del upload se debe hacer cada un segundo, por lo tanto esta solución no es una opción. Otra forma de solucionarlo es ubicar todo el código correspondiente al objeto ajax dentro de la función update(). Así es como quedaría el código:
Código PHP:
var obj;
var i;
var secs = 0;
function send()
{
form = document.getElementById('uploader');
form.target = "iframe";
document.getElementById('progress').innerHTML = 'loading...';
form.submit();
i = setInterval(update,1000);
}
function update()
{
secs += 1;
obj = new HttpRequest();
obj.setResponseType(3);
obj.oncomplete = function(){
json = obj.getResponse();
if ( json )
{
switch ( json.stat )
{
case 'copying':
document.getElementById('progress').innerHTML = json.value + ' Transfer Rate: ' + json.transfer_rate;
break;
case 'finished':
clearInterval(i);
document.getElementById('progress').innerHTML = 'Finished';
break;
case 'cancel':
document.getElementById('progress').innerHTML = 'Aborted by user';
break;
default:
document.getElementById('progress').innerHTML = 'Loading...';
}
}
}
obj.loadAsync('progress.php');
}