Было бы более разумно использовать фреймворк, такой как jQuery (особенно если вы серьезно хотите поддерживать более старые версии IE (до v6)), но я предполагаю, что есть причина, по которой вы этого не делаете.
Было бы лучше, если бы а) вы не вложили try-catches и б) вы разработали набор функций, а именно одну, чтобы получить объект Xhr, другую, чтобы использовать объект Xhr, чтобы сделать общий запрос ajax и внешняя функция "doAjax", которая выполняет конкретный вызов ajax, который вы хотите сделать: -
function getXHR()
{
var result = null
if (window.XMLHttpRequest)
{
result = new XMLHttpRequest();
}
else
{
try { result = new ActiveXObject("MSXML2.XMLHTTP.3.0") }
catch (e) { }
if (result == null)
{
try { result = new ActiveXObject("Microsoft.XMLHTTP") }
catch (e) { }
}
}
return result;
}
function ajaxRequest(url, data, callBack)
{
var xmlHttpReq = getXHR();
if (xmlHttpReq)
{
xmlHttpReq.open(data != null ? 'GET' : 'POST', url, true);
xmlHttpReq.onreadystatechange = function()
{
if (xmlHttpReq.readyState == 4)
{
//what happens if status is not 200
callBack(xmlHttpReq.responseText);
}
};
xmlHttpReq.send(null);
return true;
}
else
{
return false;
}
}
function doAjax()
{
var result = ajaxRequest('handler.php', null, handleAjaxResponse);
if (!result) alert("Your browser does not support AJAX. Please use an AJAX compatible browser.");
return result;
}
Дальнейшее уточнение заключается в том, чтобы обратный вызов принимал объект XHR, а не базовый responseText. Это даст вам больше гибкости. Если функция обратного вызова просто хочет текст, она может использовать эту функцию: -
function getTextFromXhr(xhr)
{
xhr.onreadystatechange = fnVoid;
if (xhr.status == 200)
{
return xhr.responseText;
}
else
{
throw {number: xhr.status,
description: xhr.statusText,
responseText: xhr.responseText
}
}
}