重構(gòu)這個概念在Ajax中尤為重要,好的重構(gòu)可以在大量Javascript代碼的情況下更好的降低代碼的混亂性,使其更加清晰。下面的ContentLoader對象正是一個很好的范例

/**//*
url-loading?object?and?a?request?queue?built?on?top?of?it
*/


/**//*?namespacing?object?*/
var?net=new?Object();

net.READY_STATE_UNINITIALIZED=0;
net.READY_STATE_LOADING=1;
net.READY_STATE_LOADED=2;
net.READY_STATE_INTERACTIVE=3;
net.READY_STATE_COMPLETE=4;



/**//*---?content?loader?object?for?cross-browser?requests?---*/

net.ContentLoader=function(url,onload,onerror,method,params,contentType)
{
??this.req=null;
??this.onload=onload;
??this.onerror=(onerror)???onerror?:?this.defaultError;
??this.loadXMLDoc(url,method,params,contentType);
}


net.ContentLoader.prototype.loadXMLDoc=function(url,method,params,contentType)
{

??if?(!method)
{
????method="GET";
??}

??if?(!contentType?&&?method=="POST")
{
????contentType='application/x-www-form-urlencoded';
??}

??if?(window.XMLHttpRequest)
{
????this.req=new?XMLHttpRequest();

??}?else?if?(window.ActiveXObject)
{
????this.req=new?ActiveXObject("Microsoft.XMLHTTP");
??}

??if?(this.req)
{

????try
{
??????var?loader=this;

??????this.req.onreadystatechange=function()
{
????????net.ContentLoader.onReadyState.call(loader);
??????}
??????this.req.open(method,url,true);

??????if?(contentType)
{
????????this.req.setRequestHeader('Content-Type',?contentType);
??????}
??????this.req.send(params);

????}catch?(err)
{
??????this.onerror.call(this);
????}
??}
}



net.ContentLoader.onReadyState=function()
{
??var?req=this.req;
??var?ready=req.readyState;
??var?httpStatus=req.status;

??if?(ready==net.READY_STATE_COMPLETE)
{

????if?(httpStatus==200?||?httpStatus==0)
{
??????this.onload.call(this);

????}else
{
??????this.onerror.call(this);
????}
??}
}


net.ContentLoader.prototype.defaultError=function()
{
??alert("error?fetching?data!"
????+"\n\nreadyState:"+this.req.readyState
????+"\nstatus:?"+this.req.status
????+"\nheaders:?"+this.req.getAllResponseHeaders());
}



