jQuery ajax 仅在 IE 调试器打开时在 IE 中有效

Posted

技术标签:

【中文标题】jQuery ajax 仅在 IE 调试器打开时在 IE 中有效【英文标题】:jQuery ajax only works in IE when the IE debugger is open 【发布时间】:2015-01-14 09:20:03 【问题描述】:

我遇到了 IE (11) 的奇怪问题。我有简单的 jQuery 代码:

$("#my-radio").click(function () 
     $.ajax(
        url: "/my-url",
    ).error(function(jqXHR, textStatus, errorThrown) 
        $("#error-summary").text(errorThrown);
    );
);

问题是这段代码在除 IE 之外的所有浏览器中都能完美运行(在我的情况下,除了 IE 11,还没有在早期版本中进行测试)但是,当我打开内置在 javascript 调试器中的 IE 以查看问题所在时- 一切开始正常。 IE 对控制器操作进行 ajax 调用,控制器中的断点被命中。 Action 什么也不返回(它的类型为void),只是计算一些东西。我已经尝试过this thread 提供的插件解决方案,但没有用。

更新:

为了演示这个问题,我发布了简单的 MVC 应用程序here。当您单击图像时,浏览器会对此操作发出 ajax 请求:

public string Hello()

     string ip = Request.ServerVariables["REMOTE_ADDR"];
     string agent = Request.UserAgent;    

     var request = new Request
     
          IP = ip,
          Time = DateTime.UtcNow,
          UserAgent = agent
     ;

     _requestsRepository.Add(request);

     int byIp = _requestsRepository.GetTotalRequestsCountByUser(ip);
     int total = _requestsRepository.TotalRequests;

     string message = string.Format("Hello, 0. This is your 1th request and 2th request in total.", ip, byIp, total);

     return message;
 

使用这个 jQuery 代码:

$(document).ready(function () 
    $("#click-me").click(function () 
        $.ajax(
            url: "/services/hello",
        )

        .success(function (data) 
            alert(data);
        )

        .error(function (jqXHR, textStatus, errorThrown) 
            $("#error-summary").text(errorThrown);
        );
    );
);

如您所见 - 操作返回简单的字符串,成功时发出警报。您可以在 IE 中尝试此页面。您会注意到请求的数量并没有增加,因为 实际上没有发送请求,但仍然会调用 success 事件处理程序并警告消息(这可能是一些旧的缓存消息,经过一些可能一个成功的请求,我不确定)。在任何其他浏览器中,请求的数量都会增加,因为每次单击图像时都会发送它们。如果您打开 IE 调试器 - 也会发送请求。我建议这是某种与 IE 缓存相关的问题。

【问题讨论】:

这是唯一的代码还是你有console.log的地方? @artm,这是唯一几乎准确的代码。没有console.log()s。 我以前经历过这种情况(我认为是 IE9),页面在 IE 中为空,当我打开控制台调试器时它工作正常,结果console.log 抛出未定义的异常,因为控制台没有打开。当您打开控制台时,它可以工作。可能是另一个问题,但可能是相关的。 @VitorCanova,我还没试过提琴手。会看看... 你肯定得到了请求的缓存版本。可能值得尝试设置无缓存标头。类似于这个错误***.com/questions/9234044/… 【参考方案1】:

听起来您可能会收到缓存的响应。开发人员工具可能启用了始终从服务器刷新选项,导致您只有在工具本身打开时才能获得新的响应。

尝试在jQuery AJAX options 对象中添加cache 选项,并将其值设置为false

【讨论】:

谢谢!我遇到了同样的问题,在这个解释之前这看起来真的很奇怪。 也适合我。另一个原因是 console.log。从您的代码中删除 console.log。 这不是很奇怪吗? 这绝对是奇怪的,给我带来了很多时间,每次都在 chrome 中工作而不在 IE 中工作,并且在 IE 调试模式下它正在工作,解释刚刚解决了我的问题。 你在开玩笑吧!!我一直在努力解决这个问题 9 小时!!当客户端坚持使用IE。无法弄清楚为什么它在 Chrome 而不是 IE 中有效。终于偶然发现它在调试打开时有效,但在其他情况下无效。一次简短的谷歌查询后,我发现了这篇文章。谢谢!!

以上是关于jQuery ajax 仅在 IE 调试器打开时在 IE 中有效的主要内容,如果未能解决你的问题,请参考以下文章

JQuery - $.ajax() - 使用 JSONP 的跨域 - 仅在 IE 8 中获取“解析器错误”(在 IE 7 中工作)

jQuery ajax 混合 html/js <script> 避免 <script> 打开时丢失上下文

HKObserverQuery 仅在应用程序重新打开时运行

仅在模态打开时加载 iframe src

如何在打开时仅在模式弹出窗口内限制 Tab 键按下?

AppDelegate 方法仅在应用程序已打开时从通知中调用