AJAX POST请求仅在Safari 5中有效

前端之家收集整理的这篇文章主要介绍了AJAX POST请求仅在Safari 5中有效前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我使用自己的自定义AJAX库(我对使用jQuery不感兴趣等),它在以下浏览器中完美运行:

> Firefox 7
> Chrome 14
> IE 8
> IE 8(兼容模式)

在前面提到的浏览器中使用我的自定义AJAX库,我可以使用GET和/或POST方法以任何顺序制作任意数量的AJAX请求,并且它们都可以完美地工作.由于为每个请求创建了一个新的AJAX对象(参见下面的代码),我甚至可以同时拥有多个AJAX请求进程并成功.

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

  1. if (!Array.indexOf)
  2. {
  3. Array.prototype.indexOf = function(obj) { for (var i = 0; i < this.length; i++) { if (this[i] == obj) { return i; } } return -1; };
  4. }
  5.  
  6. function ajaxObject()
  7. {
  8. if (window.ActiveXObject)
  9. {
  10. var activexmodes = ["Msxml2.XMLHTTP","Microsoft.XMLHTTP"];
  11. for (var i = 0; i < activexmodes.length; i++)
  12. {
  13. try
  14. {
  15. return new ActiveXObject(activexmodes[i]);
  16. }
  17. catch (e)
  18. {
  19.  
  20. }
  21. }
  22. }
  23. else if (window.XMLHttpRequest)
  24. {
  25. return new XMLHttpRequest();
  26. }
  27. else
  28. {
  29. return false;
  30. }
  31. }
  32.  
  33. function ajaxRequest(aURI,aContainerId,aPostData,aResponseType,aAvoidBrowserCache)
  34. {
  35. // Initialize
  36. var xmlhttp = new ajaxObject();
  37. xmlhttp.onreadystatechange = function() {
  38. if (xmlhttp.readyState == 4 && xmlhttp.status == 200)
  39. {
  40. if (aResponseType != "eval" && aResponseType != "EVAL")
  41. {
  42. // Show HTML for response
  43. document.getElementById(aContainerId).innerHTML = xmlhttp.responseText;
  44. }
  45. else
  46. {
  47. // Parse & execute JavaScript for response
  48. var responseText = xmlhttp.responseText;
  49. var startPos,endPos;
  50. for (var i = 0; i < responseText.length; i++)
  51. {
  52. if (responseText.substring(i,i + 6) == "<eval>")
  53. {
  54. startPos = i + 6;
  55. break;
  56. }
  57. }
  58. for (var i = startPos; i < responseText.length; i++)
  59. {
  60. if (responseText.substring(i,i + 7) == "</eval>")
  61. {
  62. endPos = i;
  63. break;
  64. }
  65. }
  66. textToEval = responseText.substring(startPos,endPos);
  67. eval(textToEval);
  68. }
  69. }
  70. else
  71. {
  72. try
  73. {
  74. if (xmlhttp.status != 0 && xmlhttp.status != 200)
  75. {
  76. alert('Error ' + xmlhttp.status);
  77. }
  78. }
  79. catch (e)
  80. {
  81. // Handle IE8 debug "unknown error"
  82. }
  83. }
  84. }
  85. if (aAvoidBrowserCache != false)
  86. {
  87. // Combat browser caching:
  88. aURI = aURI + (aURI.indexOf("?") == -1 ? "?" : "&");
  89. theTime = new Date().getTime();
  90. aURI = aURI + theTime + "=" + theTime;
  91. }
  92. // Make request
  93. if (typeof aPostData == "undefined" || aPostData == null || aPostData == "")
  94. {
  95. // GET request
  96. xmlhttp.open("GET",aURI,true);
  97. xmlhttp.send();
  98. }
  99. else
  100. {
  101. // POST request
  102. var parameters = "";
  103. if (aPostData.constructor.toString().indexOf("Array") != -1)
  104. {
  105. // Use parameters passed as array
  106. for (var postCount = 0; postCount < aPostData.length; postCount++)
  107. {
  108. if (parameters != "")
  109. {
  110. parameters = parameters + "&";
  111. }
  112. parameters = parameters + aPostData[postCount][0] + "=" + encodeURIComponent(aPostData[postCount][1]);
  113. }
  114. }
  115. else
  116. {
  117. // Use parameters passed as string
  118. parameters = aPostData;
  119. }
  120. xmlhttp.open("POST",true);
  121. xmlhttp.setRequestHeader("Content-type","application/x-www-form-urlencoded");
  122. xmlhttp.send(parameters);
  123. }
  124. }

因此,例如,以下任一AJAX POST请求都将传递POST数据,如果它们是绝对的第一个AJAX请求(无论是GET还是POST);否则,POST数据不会传递:

  1. ajaxRequest("test.aspx","",[["name1","value1"],["name2","value2"]],"eval");

要么

  1. ajaxRequest("test.aspx","name1=value1&name2=value2","eval");

我在整个AJAX库中添加了调试语句,并且在每个POST请求之前按照预期在“parameters”变量中创建了POST参数.我完全不知道为什么,只有Safari 5(在上面提到的浏览器中),我才有这个问题.有任何想法吗?

提前致谢!
杰西

呼叫失败的原因是因为在IIS下使用Windows身份验证时Safari中存在错误.转到您网站的身份验证设置.右键单击Windows身份验证,选择提供程序并删除Negotiate,使NTLM正常工作.我还没有测试过Kerberos.

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

猜你在找的Ajax相关文章