This code, which was written by Adam Duvander, will create a simple Ajax drop-down menu.
First, the JavaScript. Copy this code and save is as request.js
/*
XmlHttpRequest Wrapper
Version 1.2.2
29 Jul 2005
adamv.com/dev/
*/
var Http = {
ReadyState: {
Uninitialized: 0,
Loading: 1,
Loaded:2,
Interactive:3,
Complete: 4
},
Status: {
OK: 200,
Created: 201,
Accepted: 202,
NoContent: 204,
BadRequest: 400,
Forbidden: 403,
NotFound: 404,
Gone: 410,
ServerError: 500
},
Cache: {
Get: 1,
GetCache: 2,
GetNoCache: 3,
FromCache: 4
},
Method: {Get: "GET", Post: "POST", Put: "PUT", Delete: "DELETE"},
enabled: false,
logging: false,
_get: null, // Reference to the XmlHttpRequest object
_cache: new Object(),
Init: function(){
Http._get = Http._getXmlHttp()
Http.enabled = (Http._get != null)
Http.logging = (window.Logging != null);
},
_getXmlHttp: function(){
/*@cc_on @*//*@if (@_jscript_version >= 5)
try { return new ActiveXObject("Msxml2.XMLHTTP"); }
catch (e) {}
try { return new ActiveXObject("Microsoft.XMLHTTP"); }
catch (e) {}
@end @*/
try { return new XMLHttpRequest();}
catch (e) {}
return null;
},
/*
Params:
url: The URL to request. Required.
cache: Cache control. Defaults to Cache.Get.
callback: onreadystatechange function, called when request is completed. Optional.
method: HTTP method. Defaults to Method.Get.
*/
get: function(params, callback_args){
if (!Http.enabled) throw "Http: XmlHttpRequest not available.";
var url = params.url;
if (!url) throw "Http: A URL must be specified";
var cache = params.cache || Http.Cache.Get;
var method = params.method || Http.Method.Get;
var callback = params.callback;
if ((cache == Http.Cache.FromCache) || (cache == Http.Cache.GetCache))
{
var in_cache = Http.from_cache(url, callback, callback_args)
if (Http.logging){
Logging.log(["Http: URL in cache: " + in_cache]);
}
if (in_cache || (cache == Http.Cache.FromCache)) return in_cache;
}
if (cache == Http.Cache.GetNoCache)
{
var sep = (-1 < url.indexOf("?")) ? "&" : "?"
url = url + sep + "__=" + encodeURIComponent((new Date()).getTime());
}
// Only one request at a time, please
if ((Http._get.readyState != Http.ReadyState.Uninitialized) &&
(Http._get.readyState != Http.ReadyState.Complete)){
this._get.abort();
if (Http.logging){
Logging.log(["Http: Aborted request in progress."]);
}
}
Http._get.open(method, url, true);
Http._get.onreadystatechange = function() {
if (Http._get.readyState != Http.ReadyState.Complete) return;
if (Http.logging){
Logging.log(["Http: Returned, status: " + Http._get.status]);
}
if ((cache == Http.Cache.GetCache) && (Http._get.status == Http.Status.OK)){
Http._cache[url] = Http._get.responseText;
}
if (callback_args == null) callback_args = new Array();
var cb_params = new Array();
cb_params.push(Http._get);
for(var i=0;i<callback_args.length;i++)
cb_params.push(callback_args[i]);
callback.apply(null, cb_params);
}
if(Http.logging){
Logging.log(["Http: StartedntURL: " + url + "ntMethod: " + method + "; Cache: " + Hash.keyName(Http.Cache,cache)])
}
Http._get.send(params.body || null);
},
from_cache: function(url, callback, callback_args){
var result = Http._cache[url];
if (result != null) {
var response = new Http.CachedResponse(result)
var cb_params = new Array();
cb_params.push(response);
for(var i=0;i<callback_args.length;i++)
cb_params.push(callback_args[i]);
callback.apply(null, cb_params);
return true
}
else
return false
},
clear_cache: function(){
Http._cache = new Object();
},
is_cached: function(url){
return Http._cache[url]!=null;
},
CachedResponse: function(response) {
this.readyState = Http.ReadyState.Complete
this.status = Http.Status.OK
this.responseText = response
}
}
Http.Init()
function json_response(response){
var js = response.responseText;
try{
return eval(js);
} catch(e){
if (Http.logging){
Logging.logError(["json_response: " + e]);
}
else{
alert("Error: " + e + "n" + js);
}
return null;
}
}
function getResponseProps(response, header){
try {
var s = response.getResponseHeader(header || 'X-Ajax-Props');
if (s==null || s=="")
return new Object()
else
return eval("o="+s)
} catch (e) { return new Object() }
}
Next, save each of these three bits of text as their own txt files.
Save this one as France.txt
|Valery Giscard d'Estaing|Francois Mitterrand|Jacques Chirac
Save this one as Germany.txt
|Helmut Kohl|Gerhard Schroder|Angela Merke
And save this one as Spain.txt
|Felipe Gonzalez Marquez|Jose Maria Aznar Lopez|Jose Luis Rodriguez Zapatero
Finally, the HTML to tie it all together. Copy and paste this code and save it as an HTML document, then place all five files into the same directory and run the HTML file in your browser to see it work.
<html>
<head>
<script src="request.js"></script>
<script>
function handleOnChange(dd1)
{
var idx = dd1.selectedIndex;
var val = dd1[idx].text;
var par = document.forms["frmSelect"];
var parelmts = par.elements;
var prezsel = parelmts["prez"];
var country = val;
if (country != "Select country")
{
Http.get({
url: "./" + country + ".txt",
callback: fillPrez,
cache: Http.Cache.Get
}, [prezsel]);
}
}
function fillPrez(xmlreply, prezelmt)
{
if (xmlreply.status == Http.Status.OK)
{
var prezresponse = xmlreply.responseText;
var prezar = prezresponse.split("|");
prezelmt.length = 1;
prezelmt.length = prezar.length;
for (o=1; o < prezar.length; o++)
{
prezelmt[o].text = prezar[o];
}
}
else
{
alert("Cannot handle the AJAX call.");
}
}
</script>
</head>
<body>
<form name="frmSelect">
<p>
<select name="country" onChange="handleOnChange(this);">
<option>Select country</option>
<option>France</option>
<option>Germany</option>
<option>Spain</option>
</select>
</p><p>
<select name="prez">
<option>Select head of government</option>
</select>
</p>
</form>
</body>
</html>

Browse Our Tutorials
Cheat Sheets
Color Charts
Cut & Paste Code