Veo muy bien la clase. En particular me gustan los "eventos" para el progreso y el final de la operación. Si no te parece mal, creo que puedo complementar tu clase con mi función
parseForm que toma como parámetro un formulario HTML y devuelve el
query que requiere tu método HttpRequest (o casi). Hace tiempo que no lo reviso y me parece que faltan cosas, pero ahí está la idea.
Primero, tenemos la clase
HttpParams que básicamente es una lista de parámetros y valores:
Código PHP:
/**************************************************************************
Clase HttpParams
Almacena pares [key, value] para ser enviados en una petición HTTP
***************************************************************************/
function HttpParams()
{
this.items = new Array();
}
// Agrega un par a la lista
//
HttpParams.prototype.add = function(key, value)
{
this.items[this.items.length] = [key, value];
}
// Construye la cadena a ser enviada
//
HttpParams.prototype.getQueryString = function()
{
var result = '';
for (var i = 0; i < this.items.length; i++)
{
var item = this.items[i];
if (result)
{
result += '&';
}
result += item[0] + '=' + item[1];
}
return encodeURI(result);
}
El método getQuery es el que regresa la cadena ya lista para ser enviada por Ajax.
La función parseForm:
Código PHP:
/**************************************************************************
Función parseForm
Extrae la información de un formulario y la coloca en un objeto HttpParams
**************************************************************************/
function parseForm(form)
{
var elements = form.elements;
var params = new HttpParams();
var element;
for (var i = 0; i < elements.length; i++)
{
element = elements.item(i);
if (!element.name)
{
continue;
}
switch (element.type.toLowerCase())
{
case 'text': case 'password': case 'hidden': case 'textarea': case 'button':
params.add(element.name, element.value);
break;
case 'select-one':
if (element.value)
{
params.add(element.name, element.value);
}
break;
case 'select-multiple':
options = element.options;
for (j = 0; j < options.length; j++)
{
option = options.item(j);
if (option.selected)
{
params.add(element.name, option.value);
}
}
break;
case 'radio': case 'checkbox':
if (element.checked)
{
params.add(element.name, element.value);
}
break;
}
}
return params;
}
Un ejemplo de uso está
aquí, en donde los datos del formulario a la izquierda se envían vía la clase de
dec. El script php que procesa los resultados, simplemente muestra los valores.
// Saludos