1 | <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> |
2 | <html> |
3 | <head> |
4 | <script type="text/javascript"> |
5 | <!-- |
6 | // Mozilla only implementation! |
7 | |
8 | // Constructor for generic HTTP client |
9 | function HTTPClient() {}; |
10 | |
11 | // Add methods and properties as array |
12 | HTTPClient.prototype = { |
13 | url: null, |
14 | |
15 | // Instance of XMLHttpRequest |
16 | xmlhttp: null, |
17 | |
18 | // Used to make sure multiple calls are not placed |
19 | // with the same client object while another in progress |
20 | callinprogress: false, |
21 | |
22 | // The user defined handler - see MyHandler below |
23 | userhandler: null, |
24 | |
25 | init: function(url) { |
26 | this.url = url; |
27 | this.xmlhttp = new XMLHttpRequest(); |
28 | }, |
29 | |
30 | // handler argument is a user defined object to be called |
31 | asyncGET: function (handler) { |
32 | |
33 | // Prevent multiple calls |
34 | if (this.callinprogress) { |
35 | throw "Call in progress"; |
36 | }; |
37 | |
38 | this.userhandler = handler; |
39 | |
40 | // Open an async request - third argument makes it async |
41 | this.xmlhttp.open(‘GET‘,this.url,true); |
42 | |
43 | // Have to assign "this" to a variable - not sure why can‘t use directly |
44 | var self = this; |
45 | |
46 | // Assign a closure to the onreadystatechange callback |
47 | this.xmlhttp.onreadystatechange = function() { |
48 | self.stateChangeCallback(self); |
49 | } |
50 | |
51 | // Send the request |
52 | this.xmlhttp.send(null); |
53 | }, |
54 | |
55 | stateChangeCallback: function(client) { |
56 | switch (client.xmlhttp.readyState) { |
57 | |
58 | // Request not yet made |
59 | case 1: |
60 | try { |
61 | client.userhandler.onInit(); |
62 | } catch (e) { /* Handler method not defined */ } |
63 | break; |
64 | |
65 | // Contact established with server but nothing downloaded yet |
66 | case 2: |
67 | try { |
68 | // Check for HTTP status 200 |
69 | if ( client.xmlhttp.status != 200 ) { |
70 | client.userhandler.onError( |
71 | client.xmlhttp.status, |
72 | client.xmlhttp.statusText |
73 | ); |
74 | |
75 | // Abort the request |
76 | client.xmlhttp.abort(); |
77 | |
78 | // Call no longer in progress |
79 | client.callinprogress = false; |
80 | } |
81 | } catch (e) { |
82 | /* Handler method not defined */ |
83 | } |
84 | break; |
85 | |
86 | // Called multiple while downloading in progress |
87 | case 3: |
88 | // Notify user handler of download progress |
89 | try { |
90 | // Get the total content length |
91 | // -useful to work out how much has been downloaded |
92 | try { |
93 | var contentLength = |
94 | client.xmlhttp.getResponseHeader("Content-Length"); |
95 | } catch (e) { |
96 | var contentLength = NaN; |
97 | } |
98 | |
99 | // Call the progress handler with what we‘ve got |
100 | client.userhandler.onProgress( |
101 | client.xmlhttp.responseText, |
102 | contentLength |
103 | ); |
104 | |
105 | } catch (e) { /* Handler method not defined */ } |
106 | break; |
107 | |
108 | // Download complete |
109 | case 4: |
110 | try { |
111 | client.userhandler.onLoad(client.xmlhttp.responseText); |
112 | } catch (e) { |
113 | /* Handler method not defined */ |
114 | } finally { |
115 | // Call no longer in progress |
116 | client.xmlhttp.callinprogress = false; |
117 | } |
118 | break; |
119 | } |
120 | } |
121 | } |
122 | |
123 | // A user defined handler to response to the XMLHTTPRequest |
124 | var MyHandler = { |
125 | onInit: function() { |
126 | echo("About to send request<br>"); |
127 | }, |
128 | onError: function(status,statusText) { |
129 | echo("Error: "+status+": "+statusText+"<br>"); |
130 | }, |
131 | onProgress: function(responseText,length) { |
132 | echo("Downloaded "+responseText.length+" of "+length+"<br>"); |
133 | }, |
134 | onLoad: function(result) { |
135 | echo("<pre>"+result+"</pre>"); |
136 | }, |
137 | } |
138 | |
139 | // Just a function to help display results |
140 | function echo(string) { |
141 | document.getElementById("results").innerHTML += string; |
142 | } |
143 | |
144 | // Invoke the client |
145 | function getPage() { |
146 | // Modify this to some page |
147 | var url = "http://localhost/test/test.txt"; |
148 | var client = new HTTPClient(); |
149 | client.init(url); |
150 | |
151 | try { |
152 | client.asyncGET(MyHandler); |
153 | } catch (e) { |
154 | alert(e); |
155 | } |
156 | echo("Async request so still able to do stuff here<br>"); |
157 | } |
158 | </script> |
159 | </head> |
160 | <body> |
161 | <a href="javascript:getPage();">getPage</a> |
162 | <div id="results"> |
163 | </div> |
164 | </body> |
165 | </html> |