Anders Wegge Keller wrote:
> Stig Johansen <
wop...@gmail.com> writes:
>
>> Intentionen var at følge readystate fra 0 til 4 med forskellige
>> eventhandlers, men jeg opgav, da det kun var 4 der var implementeret
>> i de browsere jeg brugte (dengang).
>
> Det ender vel med at jeg bliver nødt til at klytte noget sammen, så
> vi kan få et overblik over hvilke browsere der kan håndtere en
> ukomplet overførsel.
Vi har alle forskellige coding styles, men her er min implementering af
Ajax.
Bemærk at jeg undgår brugen af closures, da det medfører memory overflow (i
visse browsere - nævner ikke navnet;-))
Den er renset for states andet end 4, da det (dengang ikke virkede), men er
struktureret som:
1) prolog
2) XMLHTTPrequest
3) epilog
I javascript overrides funktioner ved at erklære dem sidst.
// --------------- Global call ------------------------ //
function
callXMLHTTPRequest(getpost,URI,URIdata,Bodydata,callBackfunction,callBackdata,async,toAnsi,headers)
{
var cXMLHTTPRequest ;
try { cXMLHTTPRequest = new XMLHttpRequest(); }
catch (e) {
try { cXMLHTTPRequest = new ActiveXObject("Msxml2.XMLHTTP"); }
catch (e) {
try { cXMLHTTPRequest = new ActiveXObject("Microsoft.XMLHTTP");
}
catch (e) {
alert ('Error: unable to create XMLHTTPRequest!');
return false;
}
}
}
for (var i=0; i<URIdata.length; i++) URIdata[i] =
encodeURIComponent(URIdata[i]) ;
for (var i=0; i<Bodydata.length; i++) Bodydata[i] =
encodeURIComponent(Bodydata[i]) ;
// conver to Ansi ?
if ( toAnsi == true ) {
for (var i=0; i<URIdata.length; i++) URIdata[i] = uriutf8toansi
(URIdata[i],0) ;
for (var i=0; i<Bodydata.length; i++) Bodydata[i] = uriutf8toansi
(Bodydata[i],0) ;
}
// make an uri from array
var fullURI = URI ;
for (var i=0; i<URIdata.length; i++) {
if ( i % 2 == 0 ) fullURI = fullURI + ((i==0) ? '?':'&') +
URIdata[i] ; else fullURI = fullURI + '=' + URIdata[i] ;
}
// make body data from array
var urlencodedBodydata ='';
for (var i=0; i<Bodydata.length; i++) {
if ( i % 2 == 0 ) urlencodedBodydata += ((i==0) ? '':'&') +
Bodydata[i] ; else urlencodedBodydata += '=' + Bodydata[i] ;
}
var oldKonqueror = '' ; // "=true&"; // just dummy
urlencodedBodydata = oldKonqueror + urlencodedBodydata + '
'; // filler to extra header length
cXMLHTTPRequest.open( getpost, fullURI , async); //+ (debug ?
'?/&debug='+debug:'') , async); /////// <---- to here
// open skal kaldes før resdystate sættes, da IE sletter den tidligere ved
open.
if ( !async && window.navigator.appName.indexOf( 'Netscape') > -1 ) {
cXMLHTTPRequest.onload = function () {
if ( cXMLHTTPRequest.readyState == 4 ) {
callBackfunction(cXMLHTTPRequest.responseText,
callBackdata,callBackProlog (cXMLHTTPRequest),cXMLHTTPRequest);
callBackEpilog (cXMLHTTPRequest);
}
}
} else {
cXMLHTTPRequest.onreadystatechange = function () {
if ( cXMLHTTPRequest.readyState == 4 ) {
callBackfunction(cXMLHTTPRequest.responseText,
callBackdata,callBackProlog (cXMLHTTPRequest),cXMLHTTPRequest);
callBackEpilog (cXMLHTTPRequest);
}
}
}
// ------> moved up cXMLHTTPRequest.open( getpost, fullURI
+'&debug='+debug , async);
for (var i=0; i<headers.length / 2 ; i++) {
cXMLHTTPRequest.setRequestHeader( headers[i*2],headers[i*2+1]);
}
if (getpost == 'post') {
cXMLHTTPRequest.setRequestHeader("Content-type",
"application/x-www-form-urlencoded;");
// cXMLHTTPRequest.setRequestHeader("Content-length",
urlencodedBodydata.length ); // 'patch gammel konq
}
cXMLHTTPRequest.send(urlencodedBodydata);
return true;
}
function callBackProlog (lXMLHTTPRequest) {
if ( lXMLHTTPRequest.status != 200 && lXMLHTTPRequest.status != 100 &&
lXMLHTTPRequest.status != 304 ) {
if (confirm( 'Error XMLHTTPRequest ' + lXMLHTTPRequest.status +
'\r\nOpen debug window?')){
var debugWindow = window.open('','Debug_data');
debugWindow.document.open("text/html", "replace");
debugWindow.document.write(lXMLHTTPRequest.responseText);
debugWindow.document.close();
}
return false ;
}
return true ;
}
function callBackEpilog (lXMLHTTPRequest) {
lXMLHTTPRequest = null ;