Я использую свою собственную пользовательскую библиотеку AJAX (меня не интересует использование jQuery и т. Д.), Которая безупречно работает в следующих браузерах:
- Firefox 7
- Chrome 14
- IE 8
- IE 8 (режим совместимости)
Используя мою пользовательскую библиотеку AJAX в вышеупомянутых браузерах, я могу сделать столько запросов AJAX, сколько захочу, в любом порядке, используя методы GET и / или POST, и все они работают безупречно. Поскольку для каждого запроса создается новый объект AJAX (см. Код ниже), я могу даже успешно выполнить несколько запросов AJAX одновременно.
Однако в Safari 5 запрос AJAX POST передает данные POST на сервер только в том случае, если это первый запрос AJAX, который необходимо выполнить. Даже если я выполняю один и тот же запрос AJAX POST дважды подряд, данные POST передаются на сервер только во время первого запроса. Вот JavaScript в моей пользовательской библиотеке AJAX:
if (!Array.indexOf)
{
Array.prototype.indexOf = function(obj) { for (var i = 0; i < this.length; i++) { if (this[i] == obj) { return i; } } return -1; };
}
function ajaxObject()
{
if (window.ActiveXObject)
{
var activexmodes = ["Msxml2.XMLHTTP", "Microsoft.XMLHTTP"];
for (var i = 0; i < activexmodes.length; i++)
{
try
{
return new ActiveXObject(activexmodes[i]);
}
catch (e)
{
}
}
}
else if (window.XMLHttpRequest)
{
return new XMLHttpRequest();
}
else
{
return false;
}
}
function ajaxRequest(aURI, aContainerId, aPostData, aResponseType, aAvoidBrowserCache)
{
// Initialize
var xmlhttp = new ajaxObject();
xmlhttp.onreadystatechange = function() {
if (xmlhttp.readyState == 4 && xmlhttp.status == 200)
{
if (aResponseType != "eval" && aResponseType != "EVAL")
{
// Show HTML for response
document.getElementById(aContainerId).innerHTML = xmlhttp.responseText;
}
else
{
// Parse & execute JavaScript for response
var responseText = xmlhttp.responseText;
var startPos, endPos;
for (var i = 0; i < responseText.length; i++)
{
if (responseText.substring(i, i + 6) == "<eval>")
{
startPos = i + 6;
break;
}
}
for (var i = startPos; i < responseText.length; i++)
{
if (responseText.substring(i, i + 7) == "</eval>")
{
endPos = i;
break;
}
}
textToEval = responseText.substring(startPos, endPos);
eval(textToEval);
}
}
else
{
try
{
if (xmlhttp.status != 0 && xmlhttp.status != 200)
{
alert('Error ' + xmlhttp.status);
}
}
catch (e)
{
// Handle IE8 debug "unknown error"
}
}
}
if (aAvoidBrowserCache != false)
{
// Combat browser caching:
aURI = aURI + (aURI.indexOf("?") == -1 ? "?" : "&");
theTime = new Date().getTime();
aURI = aURI + theTime + "=" + theTime;
}
// Make request
if (typeof aPostData == "undefined" || aPostData == null || aPostData == "")
{
// GET request
xmlhttp.open("GET", aURI, true);
xmlhttp.send();
}
else
{
// POST request
var parameters = "";
if (aPostData.constructor.toString().indexOf("Array") != -1)
{
// Use parameters passed as array
for (var postCount = 0; postCount < aPostData.length; postCount++)
{
if (parameters != "")
{
parameters = parameters + "&";
}
parameters = parameters + aPostData[postCount][0] + "=" + encodeURIComponent(aPostData[postCount][1]);
}
}
else
{
// Use parameters passed as string
parameters = aPostData;
}
xmlhttp.open("POST", aURI, true);
xmlhttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
xmlhttp.send(parameters);
}
}
Так, например, любой из следующих запросов AJAX POST будет передавать данные POST, если они являются абсолютным первым запросом AJAX (GET или POST); в противном случае данные POST не передаются:
ajaxRequest("test.aspx", "", [["name1","value1"],["name2","value2"]], "eval");
или
ajaxRequest("test.aspx", "", "name1=value1&name2=value2", "eval");
Я добавил операторы отладки по всей моей библиотеке AJAX, и параметры POST создаются в переменной «parameters», как и ожидалось, перед каждым запросом POST. Я абсолютно не знаю, почему, только в Safari 5 (из упомянутых браузеров) у меня есть эта проблема. Есть идеи?
Заранее спасибо!
Джесси