| [ Index ] |
PHP Cross Reference of JPSpan 0.4 (beta) |
[Summary view] [Print] [Text view]
1 // $Id: pseudoxmlhttp.js,v 1.1 2004/11/17 15:55:03 harryf Exp $ 2 // Status: right now - hopelessly flawed - do not use 3 // Many ideas taken from JSRS: http://www.ashleyit.com/rs/ 4 5 function PseudoXmlHttpRequest() { 6 7 if (!document.createElement) { 8 throw "document.createElement not supported by "+navigator.userAgent; 9 }; 10 11 this.__browser = this.__getBrowser(); 12 13 this.__initContainer(); 14 15 16 }; 17 18 PseudoXmlHttpRequest.prototype = { 19 20 onreadystatechange: function() { 21 return; 22 }, 23 24 readyState: 1, 25 26 responseText: '', 27 28 status: '200', 29 30 statusText: 'OK', 31 32 abort: function() { 33 window.clearInterval(this.__responsePollId); 34 window.clearTimeout(this.__timeoutId); 35 }, 36 37 addEventListener: function() { 38 throw "addEventListener not supported by PseudoXmlHttpRequest"; 39 }, 40 41 dispatchEvent: function() { 42 throw "dispatchEvent not supported by PseudoXmlHttpRequest"; 43 }, 44 45 getAllResponseHeaders: function () { 46 return this.__responseHeaders; 47 }, 48 49 getResponseHeader: function(name) { 50 return this.__responseHeaders[name.toLowerCase()]; 51 }, 52 53 open: function(method, url, callType) { 54 55 this.readyState = 1; 56 this.responseText = ''; 57 58 method = method.toUpperCase(); 59 60 if ( method == 'GET' || method == 'POST' ) { 61 this.__method = method; 62 } else { 63 throw "HTTP method "+method+" not supported"; 64 }; 65 66 this.__url = url; 67 68 if ( callType == false ) { 69 throw "PseudoXmlHttpRequest does not support synchronous calls"; 70 }; 71 72 }, 73 74 overrideMimeType: function() { 75 throw "overrideMimeType not supported by PseudoXmlHttpRequest"; 76 }, 77 78 removeEventListener: function() { 79 throw "removeEventListener not supported by PseudoXmlHttpRequest"; 80 }, 81 82 send: function(body) { 83 84 this.readyState = 1; 85 this.responseText = ''; 86 87 var form = ''; 88 89 // Need to check request headers here for Content-Type: application/x-www-form-urlencoded 90 if ( this.__method == 'POST' ) { 91 var args = this.__encodedStringToArgs(body); 92 form = this.__createRequestForm(args); 93 } else { 94 form = this.__createRequestForm(); 95 }; 96 97 var requestDoc = (this.__browser == "IE" ) 98 ? this.__requestFrame.document : this.__requestFrame.contentDocument; 99 100 requestDoc.open(); 101 requestDoc.write(form); 102 requestDoc.close(); 103 requestDoc.forms['PseudoXmlHttpForm'].submit(); 104 105 var responseDoc = (this.__browser == "IE" ) 106 ? this.__responseFrame.document : this.__responseFrame.contentDocument; 107 var self = this; 108 109 this.__responsePollId = window.setInterval(function() { 110 try { 111 if ( responseDoc.firstChild.innerText.length > 0 ) { 112 self.__handleResponse(self,responseDoc.firstChild.innerText); 113 } 114 } catch(e) {} 115 }, 200); 116 117 this.__timeoutId = window.setTimeout(function() { 118 window.clearInterval(self.__responsePollId) 119 }, 30000); // Timeout should be configurable 120 121 }, 122 123 setRequestHeader: function(name, value) { 124 this.__requestHeaders[name.toLowerCase()] = value; 125 }, 126 127 //---------------------------------------------------------------------------------------- 128 129 __url: null, 130 131 __method: 'GET', 132 133 __requestHeaders: new Object(), 134 135 __responseHeaders: new Object(), 136 137 __browser: null, 138 139 __requestFrame: null, 140 141 __responseFrame: null, 142 143 __responsePollId: null, 144 145 __timeoutId: null, 146 147 __getBrowser: function() { 148 149 if (document.layers) return "NS"; 150 if (document.all) { 151 // But is it really IE? 152 // convert all characters to lowercase to simplify testing 153 var agt=navigator.userAgent.toLowerCase(); 154 var is_opera = (agt.indexOf("opera") != -1); 155 var is_konq = (agt.indexOf("konqueror") != -1); 156 if(is_opera) { 157 return "OPR"; 158 } else { 159 if(is_konq) { 160 return "KONQ"; 161 } else { 162 // Really is IE 163 return "IE"; 164 } 165 } 166 } 167 if (document.getElementById) return "MOZ"; 168 return "OTHER"; 169 }, 170 171 __initContainer: function() { 172 switch( this.__browser ) { 173 174 // ------------------------------------------------------------------------------- 175 case 'NS': 176 this.__requestFrame = new Layer(100); 177 this.__requestFrame.name = 'PseudoXmlHttpRequestFrame'; 178 this.__requestFrame.visibility = 'hidden'; 179 this.__requestFrame.clip.width = 100; 180 this.__requestFrame.clip.height = 100; 181 182 this.__responseFrame = new Layer(100); 183 this.__responseFrame.name = 'PseudoXmlHttpResponseFrame'; 184 this.__responseFrame.visibility = 'hidden'; 185 this.__responseFrame.clip.width = 100; 186 this.__responseFrame.clip.height = 100; 187 break; 188 189 // ------------------------------------------------------------------------------- 190 case 'IE': 191 document.body.insertAdjacentHTML( 'afterBegin', 192 '<span id="PseudoXmlHttpSpan"></span>' ); 193 var span = document.all['PseudoXmlHttpSpan']; 194 var reqFrame = '<iframe name="PseudoXmlHttpRequestFrame" src=""></iframe>'; 195 var resFrame = '<iframe name="PseudoXmlHttpResponseFrame" src=""></iframe>'; 196 span.innerHTML = reqFrame; 197 span.innerHTML += resFrame; 198 span.style.display = 'none'; 199 this.__requestFrame = window.frames['PseudoXmlHttpRequestFrame']; 200 this.__responseFrame = window.frames['PseudoXmlHttpResponseFrame']; 201 break; 202 203 // ------------------------------------------------------------------------------- 204 case 'MOZ': 205 case 'OPR': 206 case 'KONQ': 207 208 var span = document.createElement('SPAN'); 209 span.id = "PseudoXmlHttpSpan"; 210 span.style.visibility = 'hidden'; 211 212 var reqFrame = document.createElement('IFRAME'); 213 reqFrame.name = 'PseudoXmlHttpRequestFrame'; 214 reqFrame.id = 'PseudoXmlHttpRequestFrame'; 215 216 var resFrame = document.createElement('IFRAME'); 217 resFrame.name = 'PseudoXmlHttpResponseFrame'; 218 resFrame.id = 'PseudoXmlHttpResponseFrame'; 219 resFrame.onLoad = 'alert("Got here");'; 220 221 if ( this.__browser == 'OPR' ) { 222 223 reqFrame.width = 0; 224 reqFrame.height = 0; 225 resFrame.width = 0; 226 resFrame.height = 0; 227 228 } else if ( this.__browser == 'KONQ' ) { 229 230 span.style.display = none; 231 reqFrame.style.display = none; 232 reqFrame.style.visibility = hidden; 233 reqFrame.height = 0; 234 reqFrame.width = 0; 235 resFrame.style.display = none; 236 resFrame.style.visibility = hidden; 237 resFrame.height = 0; 238 resFrame.width = 0; 239 240 } 241 242 document.body.appendChild( span ); 243 244 span.appendChild(reqFrame); 245 span.appendChild(resFrame); 246 247 this.__requestFrame = reqFrame; 248 this.__responseFrame = resFrame; 249 250 break; 251 } 252 }, 253 254 __createRequestForm: function() { 255 256 var params = new Object(); 257 258 if ( arguments[0] ) { 259 params = arguments[1]; 260 } 261 262 var form = ''; 263 form += '<html><body>'; 264 form += '<form name="PseudoXmlHttpForm" action="'+this.__url+'"'; 265 form += ' method="'+this.__method+'" target="PseudoXmlHttpResponseFrame"'; 266 if ( this.__requestHeaders['accept'] ) { 267 form += ' accept="'+this.__requestHeaders['accept']+'"'; 268 } 269 if ( this.__requestHeaders['accept-charset'] ) { 270 form += ' accept-charset="'+this.__requestHeaders['accept-charset']+'"'; 271 } 272 if ( this.__method == 'POST' && this.__requestHeaders['content-type'] ) { 273 form += ' enctype="'+this.__requestHeaders['content-type']+'"'; 274 } 275 form += '>'; 276 277 for ( prop in params ) { 278 if ( prop == 'var_dump' || prop == 'toPHP' ) { 279 continue; 280 }; 281 form += '<input type="hidden" name="'+prop+'"'; 282 form += 'value="'+params[prop].replace(/'"'/g, '\\"')+'">'; 283 } 284 285 form += '</form></body></html>'; 286 287 return form; 288 }, 289 290 __encodedStringToArgs: function(string) { 291 var fields = string.split('&'); 292 var args = new Object(); 293 for (var i=0;i<fields.length;i++) { 294 var arg = fields[i].split('='); 295 args[arg[0]] = arg[1]; 296 }; 297 return args; 298 }, 299 300 __handleResponse: function(self, response) { 301 window.clearInterval(self.__responsePollId); 302 window.clearTimeout(self.__timeoutId); 303 if ( self.__responseFrame.lastModified ) { 304 self.__responseHeaders['last-modified'] = self.__responseFrame.lastModified; 305 } 306 self.__responseHeaders['content-length'] = response.length; 307 self.readyState = 4; 308 self.responseText = response; 309 self.onreadystatechange(); 310 } 311 312 }
title
Description
Body
title
Description
Body
title
Description
Body
title
Body
| Generated: Fri Nov 26 11:42:46 2004 | Cross-referenced by PHPXref 0.6 |