【问题标题】:AJAX not passing POST vars in IE7/IE8AJAX 未在 IE7/IE8 中传递 POST 变量
【发布时间】:2011-02-26 17:19:38
【问题描述】:

请注意:“使用 jquery”或“使用(插入知名框架)”的答案没有帮助。诸如 jquery 之类的框架包含很多额外的代码,这对于我正在做的事情来说根本不是必需的。 '但是,你可以包含一个来自谷歌的',是的,可能是这样,但我更喜欢保留我自己的代码。考虑到这一点,让我们继续解决问题......

我有一个 ajax 调用,它不会在 IE7/IE8 上通过 POST vars,但仅在奇数情况下。它似乎是非常随机的,并且大部分时间它确实有效。

我看过 jquery,与这个自定义的相比,它的工作方式没有太大的不同。

这里是ajax函数:

function GetXmlHttpObject(handler){ 
  var objxml = null;
 if(handler==null) {
  handler = function() {}
 }

   var ProgID = ["Msxml2.XMLHTTP.6.0", "Msxml2.XMLHTTP.3.0","Msxml2.XMLHTTP", "Microsoft.XMLHTTP"];              

     try {  
         objxml = new XMLHttpRequest();  
     }  
     catch(e) {  
         for (var i = 0; i < ProgID.length; i++){  
             try {  
                 objxml = new ActiveXObject(ProgID[i]);  
             }  
             catch(e) {  
                 continue;  
            }  
         }  
     } 
 objxml.onreadystatechange=handler;

     return objxml;  
}

调用 Ajax 函数的函数应该是这样的:

function sample_ajax(object_type,object_id) {
 var d = new Date();
 var time = d.getTime();
 var url= MYSITEURL + "my_ajax_script.php?timestamp="+time;

 params = "object_type="+object_type+"&object_id="+object_id;
 xmlHttp_comment_notifyreset = GetXmlHttpObject(sample_ajax_helper);//fails on safari 1
 xmlHttp_comment_notifyreset.open("POST", url , true);

 xmlHttp_comment_notifyreset.setRequestHeader("Cache-Control", "no-cache");
 xmlHttp_comment_notifyreset.setRequestHeader("Cache-Control", "no-store");
 xmlHttp_comment_notifyreset.setRequestHeader("Cache-Control", "must-revalidate");
 xmlHttp_comment_notifyreset.setRequestHeader("Cache-Control", "post-check=0");
 xmlHttp_comment_notifyreset.setRequestHeader("Cache-Control", "pre-check=0");
 xmlHttp_comment_notifyreset.setRequestHeader("If-Modified-Since", "Sat, 1 Jan 2000 00:00:00 GMT");


 xmlHttp_comment_notifyreset.setRequestHeader("Content-Type", "application/x-www-form-URLencoded");
 xmlHttp_comment_notifyreset.setRequestHeader("Content-Length", params.length);
 xmlHttp_comment_notifyreset.setRequestHeader("Connection", "close");

 xmlHttp_comment_notifyreset.send(params);
}

我看过 jquery,与这个自定义的相比,它的工作方式没有太大的不同。

【问题讨论】:

  • 能否请您提供处理函数的代码示例。
  • “If-Modified-Since”是 POST 的有效标头吗?也许您应该删除它。
  • @naikus 是的 if-modified-since 在 Http1.1 规范中 w3.org/Protocols/rfc2616/rfc2616-sec14.html,一个简单的谷歌会为你找到。
  • @David:您的参数是否有可能有时包含需要进行 URL 编码的数据?另外,关于您的问题中有关 jQuery 的注释; jQuery 实际上默认使用 ActiveX 实现而不是原生 XMLHttpRequest 对象。也许这样做可以解决您的问题。
  • @David:您能否将失败的情况与特定的用户、价值观、浏览器版本或代理联系起来?事情很少会变得真正随机。

标签: javascript ajax internet-explorer post


【解决方案1】:

使用The Ultimate Ajax Object。它简洁、不言自明,适用于所有浏览器。

【讨论】:

  • 看过这个,实际发送请求的方式与我现在的方式并没有什么不同。唯一的区别是他们把它放在了一个类中。
【解决方案2】:

帮助不大,但这篇文章似乎很详细:https://developer.mozilla.org/en/AJAX:Getting_Started

【讨论】:

    【解决方案3】:

    如果参数只是有时发送失败,问题可能出在这一行:

    params = "object_type="+object_type+"&object_id="+object_id;
    

    参数没有被转义。试试这个:

    params = "object_type=" +
             encodeURIComponent(object_type) +
             "&object_id=" +
             encodeURIComponent(object_id);
    

    【讨论】:

      【解决方案4】:

      我在使用 jquery 时遇到了类似的问题,其中 post 参数没有通过。这更多地与 asp.net 读取帖子参数的方式有关。 以下文章演示了如何直接从请求的输入流中提取 post 参数。 http://www.bytechaser.com/en/functions/2jxhy5gg7w/read-ajax-post-parameters-in-asp-net.aspx。希望对你有帮助

      【讨论】:

        【解决方案5】:

        我不记得曾经见过像“application/x-www-form-URLencoded”这样的带有大写字符的内容类型,而且我不知道它是否符合规范。然而,我已经看到,由于请求中缺少 Content-Type 标头,PHP 会忽略 POST。 (由于代理决定将其排除在外)

        PHP 会忽略它无法识别的任何内容类型。这可以解决任何问题的可能性很小,但您可以尝试将 URL 更改为 url

        【讨论】:

        • 澄清一下:我并不是说您正在使用 PHP,问题就出在那儿,只是端到端链的几个部分可能会进行一些完整性检查(例如代理)并造成麻烦。
        【解决方案6】:

        试试 http://php.net/manual/en/reserved.variables.httprawpostdata.php 在 php 中获取输入变量,如 ASP.net 家伙

        【讨论】:

          猜你喜欢
          • 2012-05-09
          • 2011-08-04
          • 2014-09-04
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-06-15
          • 1970-01-01
          相关资源
          最近更新 更多