Запрос AJAX POST работает только один раз в Safari 5 - PullRequest
2 голосов
/ 30 сентября 2011

Я использую свою собственную пользовательскую библиотеку 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 (из упомянутых браузеров) у меня есть эта проблема. Есть идеи?

Заранее спасибо! Джесси

Ответы [ 3 ]

7 голосов
/ 26 апреля 2012

Причиной сбоя вызова является ошибка в Safari при работе с проверкой подлинности Windows под IIS.Зайдите в настройки аутентификации вашего сайта.Щелкните правой кнопкой мыши по аутентификации Windows, выберите поставщиков и удалите Negotiate, в результате чего NTLM работает нормально.Я не проверял Kerberos.

Эта проблема появляется только в определенных сборках Safari.

0 голосов
/ 27 января 2012

Я могу подтвердить, что проблема, похоже, связана с каким-то взаимодействием между Safari и IIS. К счастью, я только разрабатываю и тестирую эту часть кода на Windows. Я переместил его без изменений на промежуточный сервер LAMP (Linux / Apache) (до перехода на наш производственный сервер LAMP), и проблема исчезла. Я видел проблему с Safari 5, IIS 5.1 и ActiveState Perl 5.6 CGI.

В соответствии с RHEL 5, Apache 2.2 и Perl 5.8 его больше нет.

0 голосов
/ 21 ноября 2011

Пришел сюда от темы, которую вы упомянули, может быть, обман. Я никогда не решал нашу проблему, но вы пробовали простую страницу, отправляя запросы? С нашей проблемой это проблема почты, а не проблема AJAX, хотя мы все еще в тупике.

Какую версию IIS вы используете на сервере?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...