【问题标题】:JQuery Ajax post parameters sometimes not sent on IEJQuery Ajax post 参数有时不会在 IE 上发送
【发布时间】:2011-10-19 23:48:08
【问题描述】:

我遇到的问题是,当我使用 jquery ajax 发布时,频率非常低(

当我将呼叫从“post”类型切换到“get”类型时,问题就消失了。

有没有其他人在 IE 上看到过这种奇怪的行为?谢谢!

我已经在各种 ajax 调用中看到过这种情况,但这是一个典型的:

var data= {
    "guess" : "m1",
    "eas" : "hello world"
};

$.ajax({
    url: "http://myco.com/ajaxcall.action",
    data: data,
    type : 'post',
    dataType: 'json',
    success: function(data) {},
    error: function() {}
});

更新:传递“cache: false”并不能解决问题。

【问题讨论】:

  • 虽然IE很奇怪,但是我没遇到过这种情况,请问有没有检查错误状态?它也可能是一个 mod 安全问题,也许检查错误日志是个好主意?
  • 你确定你总是声明用于数据的变量吗?如果 ie 遇到一个与元素同名的未声明的 var,它将假定您的意思是 dom 节点。这是我能预先想到的唯一场景。
  • 我们没有使用 mod 安全性(而且它是零星的)您想到了哪些错误日志?我在 Apache 或 Tomcat 日志中看不到任何内容。此外,在我观察到的情况下,总是声明数据变量。
  • 我在使用 Windows Phone 7 时遇到了同样的问题,但它一直都在失败

标签: javascript ajax internet-explorer jquery


【解决方案1】:

我认为您必须防止在 Internet Explorer 中进行缓存。尝试将选项缓存设置为 false。

例子:

$.ajax({
    url: "http://myco.com/ajaxcall.action",
    data: data,
    type : 'post',
    dataType: 'json',
    success: function(data) {},
    error: function() {},
    cache: false
});

【讨论】:

  • true for gets but posts does not cache "使用 POST 获取的页面永远不会被缓存,因此 jQuery.ajaxSetup() 中的缓存和 ifModified 选项对这些请求没有影响。"
  • 是的,我同意,我知道,但 1 年前我在 Internet Explorer 中缓存时遇到了问题。我通过速记方法 $.post 发布数据,但从未将其发送到服务器。所以我习惯使用 $.ajax 方法并将选项缓存设置为 false 并且它可以工作。
  • 我要试试缓存标志...为了科学!
  • 不幸的是,切换回 post 并将“缓存”标志设置为 false 导致问题再次出现。
【解决方案2】:

直接回答您的问题:是的,我们刚刚遇到这个问题,找不到合理的解释。它只影响 IE 并且频率非常低 - 花了很长时间才得出结论,它是 IE 中零星的 jQuery Ajax 错误。在这种情况下,我们必须通过从服务器返回故障并在延迟 1 秒后重新发布数据来“修复”问题!

Hacky,但似乎是唯一的方法。

绝对没有与 DOM 元素等发生冲突,也没有发生这种情况的逻辑原因,页面可以由用户成功更新多次,但间歇性失败。

一定是个bug。

【讨论】:

  • 你曾经输入过 jQuery 错误报告吗?
  • 不,我认为我没有这样做,只是宣布胜利并继续前进。我想我不太喜欢运动:)
【解决方案3】:

上周我在自己的应用程序(使用 Dojo,而不是 JQuery)中跟踪了一个类似的问题。从您的描述和发生频率来看,我会说这是同一个问题。

当浏览器和服务器之间使用 HTTP 持久连接(默认行为)时,服务器可以随时关闭 HTTP 连接。当浏览器在服务器关闭连接的同时开始发送新请求时,这会产生一个非常小的计时漏洞。大多数浏览器将使用不同的连接或打开新连接并重新发送请求。这是 RFC 2616 第 8.1.4 节中建议的行为:


客户端、服务器或代理可以随时关闭传输连接 时间。例如,客户端可能已经开始发送新请求 同时服务器已经决定关闭“idle” 联系。从服务器的角度来看,连接正在 在空闲时关闭,但从客户端的角度来看, 请求正在进行中。

这意味着客户端、服务器和代理必须能够恢复 来自异步关闭事件。客户端软件应该重新打开 传输连接并重新传输中止的请求序列 只要请求序列是,无需用户交互 幂等(参见第 9.1.2 节)。


Internet explorer 确实在这种情况发生时会尝试重新发送请求,但是当它恰好是一个 POST 时,它会通过发送标头(带有 Content-长度)但没有实际数据。这是一个格式错误的请求,应该总是导致 HTTP 错误(通常在等待永远不会到来的数据超时之后)。

Microsoft 将此错误记录为 KB 895954(请参阅 http://support.microsoft.com/kb/895954)。微软首先在 IE 6 中发现了这个错误。他们提供了一个修补程序,并且似乎已经在包括 IE 9 在内的所有 IE 版本中都提供了这个修补程序。这个修复存在两个问题:

  1. 默认情况下未激活此修补程序。您必须使用 regedit 创建一个非常奇怪的密钥才能激活修复:HKEY_LOCAL_MACHINE\Software\Microsoft\Internet Explorer\Main\FeatureControl\FEATURE_SKIP_POST_RETRY_ON_INTERNETWRITEFILE_KB895954。

  2. 修复并不能真正解决问题。 “固定”行为是当尝试发送请求时关闭连接时,它甚至不会尝试重新发送它。它只是将错误传递给 javascript 应用程序。

看来您必须在代码中添加错误处理程序,并在失败时自行重新发布请求。我正在为我的应用程序寻找这个解决方案。我担心的是我不确定如何判断我得到的错误是由于尝试发送查询失败,还是由于查询而从服务器发回的一些错误(在这种情况下,我不知道想重新发送它)。

我编写了一个 C 程序来模拟 Web 服务器并显式关闭连接以查看浏览器如何处理它。我发现 IE 100% 的时间重现错误行为,而 Firefox、Safari 和 Chrome 通过在另一个连接上正确重新发送 POST 100% 的时间来恢复。也许答案是,“不要使用 IE。”

【讨论】:

    【解决方案4】:

    发送给PHP的参数是在GET中从IE接收的:

    $.ajax ({
         url: "path/to/ajax.php"
        ,method: "POST"
        ,data: {
             var1: "value1"
            ,var2: true
            ,varX: 123123
        }
        ,cache: false
        ,success: function (data) {
            alert (data);
        }
    });
    

    那么在 PHP 上你应该使用 REQUEST 而不是 POST:

    $var1 = $_REQUEST ["var1"]; // value1
    $var2 = $_REQUEST ["var2"]; // true
    $var3 = $_REQUEST ["var3"]; // 123123
    

    这个例子可以使用它来兼容 IE7

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-01
      • 1970-01-01
      • 2016-02-05
      相关资源
      最近更新 更多