File Under: Ajax

Ajax Drop-down Menu

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>