Ich habe diesen Code im Buch "Ajax in Action" gesehen, und es gibt zwei Dinge, die ich nicht verstehen kann (bedenken Sie, dass ich gerade erst mit der Webprogrammierung begonnen habe und immer noch versuche zu verstehen, wie JavaScript funktioniert).
-
Warum hat der Autor in Zeile 37 oder in der Funktion loadXMLDoc eine lokale Variable "var loader=this;" deklariert und diese dann in dem Aufruf "net.ContentLoader.onReadyState.call(loader);" verwendet, anstatt einfach "net.ContentLoader.onReadyState.call(this);" zu verwenden?
-
Warum hat der Autor "net.ContentLoader.onReadyState.call(loader);" anstelle von "this.onReadyState();" verwendet?
/\* 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()); }