2011-09-30 45 views
2

我用我自己的自定义AJAX库(我不是有意使用jQuery等),这是在以下浏览器的工作完美:AJAX POST请求,只有当工作在Safari 5

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

在上述浏览器中使用我的自定义AJAX库,我可以让麻可以按照任何顺序,使用GET和/或POST方法按照我的需要提供AJAX请求,并且它们都可以完美地工作。由于为每个请求创建了一个新的AJAX对象(请参阅下面的代码),我甚至可以同时获得多个AJAX请求过程并取得成功。

但是,在Safari 5中,如果AJAX POST请求是绝对第一个要执行的AJAX请求,则它只会将POST数据传递给服务器。即使我连续两次执行完全相同的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参数,如预期在每个POST请求之前。我完全不知道为什么,只有在Safari 5中(提到的浏览器之外),我有这个问题。有任何想法吗?

在此先感谢! 杰西

回答

7

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

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

+1

这是一个迟来的回应,但阿兰你是绝对正确的。但是,对于IIS 6,删除协商的说明稍有不同,可在此处找到:http://msdn.microsoft.com/zh-cn/library/cc339532(v=vs.90).aspx。非常感谢你!!! – Jesse

0

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

服务器上运行的是哪个版本的IIS?

+0

在我的公司内部网上已经有好几年从HTML表单接受POST数据的页面可以在Safari 5.x中正常工作。但是,使用我的AJAX库永远不会导致Safari 5.x成功处理POST请求/响应。您和Derek的评论帮助我将问题缩小到IIS 5.x/6.x和Safari 5.x之间的POST相关问题(可能还包括这些产品的其他旧版本),因为这些版本是我的在我的环境中处理。谢谢您的意见! – Jesse

+0

总是很高兴找到其他遇到类似问题的人;因为我正在编写自己的AJAX方法作为新手来理解机制(和JavaScript),所以我确信这个问题是我造成的。花费相当长的时间才能将问题分解为基础知识。感谢您指点我这个主题! – Chris

+1

@Chris看到我的答案 –

0

我可以确认问题似乎与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

谢谢,我对延迟响应表示歉意!我想如果有人回答我的问题,我会通过电子邮件通知;因此延误。我们在各种环境中运行IIS 5.x和6.x,并且自发布此线程以来,我修改了我的AJAX库,但仍发现即使在我们的生产环境中,Safari 5.x也始终存在对这些服务器POST请求的问题。我很高兴你确认问题在你的LAMP服务器上消失了,所以至少我可以让我的团队知道这是浏览器和IIS的问题,而不是代码本身。非常感激! – Jesse

+0

P.S.我会投你一票,但我没有声望呢,对不起:) – Jesse