【问题标题】:AJAX POST Request Only Works Once in Safari 5AJAX POST 请求仅在 Safari 5 中有效一次
【发布时间】:2011-09-30 16:15:13
【问题描述】:

我使用自己的自定义 AJAX 库(我对使用 jQuery 等不感兴趣),它可以在以下浏览器中完美运行:

  • 火狐7
  • 铬 14
  • IE 8
  • IE 8(兼容模式)

在上述浏览器中使用我的自定义 AJAX 库,我可以使用 GET 和/或 POST 方法以任何顺序发出任意数量的 AJAX 请求,并且它们都可以完美运行。由于每个请求都会创建一个新的 AJAX 对象(参见下面的代码),我什至可以同时成功处理多个 AJAX 请求。

但是,在 Safari 5 中,AJAX POST 请求仅在绝对第一个要执行的 AJAX 请求时才将 POST 数据传递给服务器。即使我连续两次执行完全相同的 AJAX POST 请求,POST 数据也只会在第一次请求期间传递给服务器。这是我的自定义 AJAX 库中的 JavaScript:

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(在提到的浏览器中),我有这个问题。有什么想法吗?

提前致谢! 杰西

【问题讨论】:

    标签: ajax post safari


    【解决方案1】:

    调用失败的原因是 Safari 在 IIS 下使用 Windows 身份验证时出现错误。转到您网站的身份验证设置。右键单击 Windows 身份验证,选择提供程序并删除协商,留下 NTLM 工作正常。我还没有测试过 Kerberos。

    此问题仅出现在某些 Safari 版本中。

    【讨论】:

    【解决方案2】:

    从你提到的线程来到这里可能是一个骗子。我从来没有解决过我们的问题,但是您是否尝试过一个简单的页面来发出帖子请求?对于我们的问题,这是一个发布问题,而不是 AJAX 问题,但我们仍然感到困惑。

    您在服务器上运行的是什么版本的 IIS?

    【讨论】:

    • 多年来一直在我公司内部网上接受来自 HTML 表单的 POST 数据的页面在 Safari 5.x 中运行良好。但是,使用我的 AJAX 库永远不会导致 Safari 5.x 成功处理 POST 请求/响应。你和 Derek 的 cmets 帮助我将问题缩小到 IIS 5.x/6.x 和 Safari 5.x(可能还有这些产品的其他旧版本)之间与 POST 相关的问题,因为这些版本就是我的样子在我的环境中处理。感谢您的意见!
    • 总是很高兴找到遇到类似问题的其他人;由于我作为新手编写自己的 AJAX 方法以了解机制(和 javascript),因此我确信问题是我造成的。花了很长时间才将问题简化为基础。谢谢你指点我这个帖子!
    【解决方案3】:

    我可以确认问题似乎与 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 下,它消失了。

    【讨论】:

    • 感谢您,对于延迟回复我深表歉意!我想如果有人回复我的询问,我会通过电子邮件收到通知;因此延迟。我们在各种环境中运行 IIS 5.x 和 6.x,自从发布这个帖子以来,我修改了我的 AJAX 库,但仍然发现 Safari 5.x 对这些服务器的 POST 请求总是存在问题,即使在我们的生产环境中也是如此。我很高兴您确认问题在您的 LAMP 服务器上消失了,所以至少我可以让我的团队知道这是浏览器和 IIS 的问题,而不是代码本身的问题。非常感谢!
    • P.S.我会投票给你,但我还没有声望,对不起:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-06-22
    • 1970-01-01
    • 2017-09-14
    • 2013-09-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多