【问题标题】:Loathing IE and it's refusal to respond to JQuery Post讨厌 IE 拒绝回复 JQuery Post
【发布时间】:2012-06-05 12:28:56
【问题描述】:

女士/男士:

做一个在 Chrome 和 FireFox 中运行良好的 $.post。 IE - 没那么多...成功回调(addTicketAndRender())永远不会被击中:

http://jsfiddle.net/AeQxJ/1/

我读过一些关于需要通过我的 POST 对 IE 执行“缓存清除”的内容,但我对这些东西比较陌生,所以不知道这是否适合尝试,如果是,如何做。

来源:

function addTicketAndRender(incomingTicket) {

    console.log("Add and Render");
    alert(incomingTicket);
}



$(document).ready(function() {

    console.log('ready');

    // variables to feed trusted ticket retrieval
    var trustedURL = "http://tableau.russellchristopher.org/trusted",
        userName = "foo",
        serverURL = "http://tableau.russellchristopher.org/";



    $.post(trustedURL, {
        username: userName,
        server: serverURL,
        client_ip: "",
        target_site: "",
        cache: "false"
    }, function(response) {
        addTicketAndRender(response);
    });

});​

请帮忙?

更新 1: 将其切换为 ajax 帖子:没有区别。在 Chrome 和 Firefox 上仍然很好,在 IE 中仍然死机:

    $.ajax( {
      url : trustedURL,
      type: "POST",
      data : {
        username : userName,
        server : serverURL,
        client_ip : "",
        target_site : "" 
      },    
      cache : false


    } ).done( addTicketAndRender );

更新 2: 集成了额外的缓存清除技术。相同的行为 - Chrome/FF 工作,IE 没有任何东西 - 使用 Fiddler,我可以看到从 http://jsfiddle.net/AeQxJ/3// 运行下面的代码时 POST 出去了。在 IE 中,这永远不会发生。在 jsfiddle 之外测试并看到相同的结果。下一步:通过在我没有触及浏览器设置的盒子上进行测试,排除我愚蠢的 IE 浏览器设置。

function addTicketAndRender(incomingTicket){


    alert(incomingTicket);
}

$(document).ready(function() {
   // variables to feed trusted ticket retrieval

    var trustedURL = "http://tableau.russellchristopher.org/trusted",
        userName = "foo",
        serverURL = "http://tableau.russellchristopher.org/";

var number=Math.floor(Math.random()*1);
$.ajax( {
      url : trustedURL + "?" + number,
      type: "POST",
      data : {
        username : userName,
        server : serverURL,
        client_ip : "",
        target_site : "" 
      },    
      cache : false
     } ).done( addTicketAndRender );

});​

更新 4: 排除了我的 IE 副本作为问题。在 POST 中添加了错误捕获代码,并且只有在 IE 中运行时,我才会看到这个抛出:

         error: function(xhr, textStatus, error){
              alert(xhr.statusText);
              alert(textStatus);
              alert(error);

//output:

//    xhr.StatusText: No Transport
//    testSttus: Error
//    error: No Transport

搜索“IE No Transport jquery POST”将我带到这里:

jQuery Call to WebService returns "No Transport" error

帖子表示添加jQuery.support.cors = true;应该可以解决问题,但是当我这样做时,会返回错误:

//output:

//    xhr.StatusText: Error: Access is denied
//    testSttus: Error
//    error: Error: Access is denied

【问题讨论】:

  • 您是否尝试检查 error() 值以查看抛出了什么?
  • 你有没有尝试使用jQuery.ajax函数和错误方法来查看错误信息是什么?由于违反了同源政策,您可能需要使用jsonp
  • 等等,为什么它在 chrome 和 firefox 中都有效?同源政策发生了什么?
  • 哦,顺便说一句,它可以在 IE10 中运行...
  • 我建议在您的 $.ajax 尝试中添加一个错误处理程序,看看返回的异常是什么。

标签: javascript jquery post


【解决方案1】:

改变

$.post( ...
    cache: "false"
    ...

收件人:

$.ajax(...
    cache: false,
    ...

注意,第一个缓存是一个无意义的字符串,而后者是一个布尔假。

【讨论】:

  • 有道理 - 做了,但没有喜悦:jsfiddle.net/AeQxJ/2。我读到的缓存破坏与从字面上附加一个唯一值到 POST 相关 - 比如时间戳或其他东西。这是否为您敲响了警钟和/或听起来合理?
  • @RussellChristopher。是的,这就是它的工作原理。无论如何,您是否在控制台中看到错误?在萤火虫中?
  • 再说一次,对这些东西不熟悉 - 我可以使用 Firebug 来监控我在 IE 中所做的工作吗?看起来我还需要在 $.ajax 调用上做得更快——不像换出 post/ajax 那样简单......等待 5 :)
  • @RussellChristopher。我不能为你调试......你应该read this 并学习如何自己做。告诉我结果是什么。
  • IE8+有一个内置调试器,使用它并使用Fiddler来观察http流量。
【解决方案2】:

如果 cache: false 不适合你,老派的方法是在 url 中添加一个 get 参数,就像一个随机数,所以:

var number=Math.floor(Math.random()*1)
$.ajax( {
      url : trustedURL + "?" + number,
      type: "POST",
      data : {
        username : userName,
        server : serverURL,
        client_ip : "",
        target_site : "" 
      },    
      cache : false


    } ).done( addTicketAndRender );

这也应该有助于您调试(从随机数更改为顺序)。如果仍然不起作用,我删除.done 并使用complete 之类的东西,即

$.ajax( {
      url : trustedURL,
      type: "POST",
      data : {
        username : userName,
        server : serverURL,
        client_ip : "",
        target_site : "" 
      },    
      cache : false,
      complete : function() {
         addTicketAndRender
      }
  });

最后一件事,如果您使用 jsfiddle 页面执行此操作,请确保从代码中删除 console.log(),因为这会导致 IE 崩溃(它不理解 console.log)。

【讨论】:

  • 疯狂。将您的建议添加到jsfiddle.net/AeQxJ/3。它适用于 Chrome/Firefox - 我看到 POST 请求发出。在 IE9 中,什么都没有。 @Alxandr 说它在 IE10 中对他有效。
  • 这会为我弹出一个警告框:jsfiddle.net/P4Xvu,因此它正在完成 ajax 操作。注意我还删除了 .done 并替换为 complete
  • 你是对的。它返回与我的错误处理程序相同的“无传输”状态文本。我发现这个stackoverflow.com/questions/5087549/… 似乎是解决方案。 IE实际上不支持jquery的跨域请求,即使SERVER支持martinkool.com/post/18182537575/…所以,我必须使用这个XDR东西,或者等到IE 10,它将支持我需要的东西。
【解决方案3】:

$.post 只是$.ajax() 的简写版本链接:http://api.jquery.com/jQuery.post/

如果您需要更多控制,我建议您使用$.ajax(),因为您可以使用“本机”方法获得更多选择。链接:http://api.jquery.com/jQuery.ajax/

除了关于 jQuery.ajax() 的一个很好的编码技巧之外,总是将 $.ajax({cache: false}) 设置为默认值,因为 IE 是(令人惊讶的)唯一一个默认使用 cache: true 的浏览器

【讨论】:

    【解决方案4】:

    IE 倾向于使用console.log(''); 语句。尝试将其包装到 Log() 函数中:

    function Log(text) {
        try {
            console.log(text);
        }
        catch (e) {
        }
    }
    

    如果这样可以解决您的问题,您需要在整个项目中使用 this approach to using console.log()

    【讨论】:

    • 谢谢,我删除了那些用于 IE 测试。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-02
    • 2010-11-19
    • 2018-04-18
    • 2012-10-22
    • 2011-03-05
    • 1970-01-01
    相关资源
    最近更新 更多