【问题标题】:JQuery external Ajax call not working in IEJQuery 外部 Ajax 调用在 IE 中不起作用
【发布时间】:2013-05-16 23:29:30
【问题描述】:

我有一个将一些数据发送到外部 URL 的 ajax 脚本。外部 URL 托管在同一台服务器上,但域与 ajax 调用的来源不同。

这在 Firefox 和 Chrome 中运行良好。但是在 IE 中 ajax 调用不通过,Return False 函数也不起作用(一旦 ajax 调用失败)。

下面是我的代码:

 $.get('http://myexternaldomian.com/feedback/save.php', {
            answer: $('#answer').val(),
            page_url: pathname
        });

        // Keeps the user on the page
        return false;

当我尝试从 ajax url 中删除 http:// 时,返回 false 确实有效。

对此的任何帮助将不胜感激。谢谢你

【问题讨论】:

    标签: javascript jquery ajax


    【解决方案1】:

    来自jQuery documentation

    由于浏览器安全限制, 大多数“Ajax”请求都受到 同源政策;请求 无法成功检索数据 来自不同的域、子域或 协议。

    Same Origin Policy on Wiki

    【讨论】:

      【解决方案2】:

      我很惊讶他们中的任何一个都在工作。浏览器通常不允许对当前页面所在域以外的域进行 ajax 调用。

      此规则的主要例外是如果您使用 jsonp(带填充的 json)进行 ajax 调用。您可以使用 jQuery here's how 来做到这一点。查看dataType 选项。

      【讨论】:

      • 根据我所做的一些研究,我认为它不起作用。但它确实在 FF 和 Chrome 中完美运行。我会看看你的链接。再次感谢
      • 请重新阅读我的回答,您可能关注的第一个链接不正确。我将其编辑为正确的链接。
      • jQuery 文档也这么说。它说most 'AJAX' 请求,我不确定这是否意味着all。编辑:知道了,你的答案已经回答了我的问题!
      • 如果您不介意,您能否举例说明如果我使用该方法,我上面的代码会是什么样子?我对 Jquery 非常陌生,所以不太了解该应用程序。
      【解决方案3】:

      (这是我另一个类似答案的复制粘贴)。您可以尝试启用“jQuery.support.cors=true”标志,看看效果如何。我使用 jQuery v1.7.2。

      我必须从本地磁盘“file:///C:/test/htmlpage.html”加载网页,调用“http://localhost/getxml.php”url,并在 IE8+ 和 Firefox12+ 浏览器中执行此操作,使用 jQuery v1.7.2 lib 来最小化样板代码。看了几十篇文章终于弄明白了。这是我的总结。

      • 服务器脚本(.php、.jsp、...)必须返回 http 响应标头 Access-Control-Allow-Origin: *
      • 在使用 jQuery ajax 之前,请在 javascript 中设置此标志:jQuery.support.cors = true;
      • 你可以在使用 jQuery ajax 函数之前设置一次或每次标志
      • 现在我可以在 IE 和 Firefox 中读取 .xml 文档了。我没有测试的其他浏览器。
      • 响应文档可以是纯文本、xml、json 或任何其他格式

      这是一个带有一些调试系统输出的示例 jQuery ajax 调用。

      jQuery.support.cors = true;
      $.ajax({
          url: "http://localhost/getxml.php",
          data: { "id":"doc1", "rows":"100" },
          type: "GET",
          timeout: 30000,
          dataType: "text", // "xml", "json"
          success: function(data) {
              // show text reply as-is (debug)
              alert(data);
      
              // show xml field values (debug)
              //alert( $(data).find("title").text() );
      
              // loop JSON array (debug)
              //var str="";
              //$.each(data.items, function(i,item) {
              //  str += item.title + "\n";
              //});
              //alert(str);
          },
          error: function(jqXHR, textStatus, ex) {
              alert(textStatus + "," + ex + "," + jqXHR.responseText);
          }
      });
      

      【讨论】:

        【解决方案4】:
        【解决方案5】:

        我认为它不应该在 Chrome 或 Firefox 上运行,除非你在 localhost 或类似的东西上进行测试,否则这将违反跨域策略。

        你需要在同一个域内代理它,使用php连接到你需要的目的地并从同一个域调用url。

        save_cross_domain.php -> 通过服务器连接到所需的 url

        然后ajax调用save_cross_domain.php

        【讨论】:

          【解决方案6】:

          你应该添加一个

          callback=?
          

          到您的网址并在服务器端处理此问题。

          我为 java servlet 做过一次,当包含回调参数时,我在 json 响应周围添加了一对额外的 parenteses..

          希望对你有帮助!

          【讨论】:

          • 有趣的想法。问题是,我不想在源域中包含任何其他文件/代码。
          【解决方案7】:

          有几点:

          • 这个问题的答案/对话有点断章取义。实际上,从这个问题来看,它更暗示了如何在 IE 中进行 ajax 调用。 [至少修改题名,否则题目很本土化]

          这个跨域问题的几个解决方案:

          1. CORS[兼容IE7之后]
          2. JSONP [这里实际上浏览器接受输入认为它是一个脚本]
          3. 服务器端编码

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2012-06-07
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多