【问题标题】:jQuery and Ajax with json - fails in IE带有 json 的 jQuery 和 Ajax - 在 IE 中失败
【发布时间】:2011-11-13 12:24:20
【问题描述】:

我正在使用 jQuery (1.7.0) 对 Spotify 进行 json/ajax 调用。以下代码在 Chrome 和 Firefox 中运行良好,但在 IE 中会导致错误(错误:访问被拒绝。)。

 $.ajax({
     url: 'http://ws.spotify.com/lookup/1/.json',    
     type: 'GET',    
     dataType: 'json',    
     cache: true,    
     data: {    
       uri: "someartist",    
       extras: "album"    
     },    
     success: successfn,    
     error:function(xhr, status, errorThrown) {    
       alert("networking error: "+errorThrown+'\n'+status+'\n'+xhr.statusText);    
     }
 });

在 Chrome 和 FF 中调用了成功函数,但在 IE 中调用了错误函数并显示上述消息。我已将 cors 设置为 true:jQuery.support.cors = true;

它在本地和我的服务器上都可以在 Chrome 和 FF 上运行,它可以在本地 IE 中运行,但不能在服务器上运行。更改 cache: false 会导致 spotify 端出现问题 - 不会添加其他参数,因此我收到“错误请求”错误。

感谢任何指点。

谢谢

阿波

【问题讨论】:

    标签: ajax internet-explorer jquery


    【解决方案1】:

    您依靠 spotify url 在其标头中提供 Access-Control-Allow-Origin:* 以允许来自所有域的跨域请求。但是 Internet Explorer 不支持此功能,因此拒绝访问。

    access-control-allow-origin 解释。 (TLDR:服务器可能在其标头中允许跨域 ajax)

    如果您需要它在 IE 中工作,您可以使用 spotify 的 JSONP API(如果他们有的话)或在 flash 中发出 AJAX 请求,该 API 在所有浏览器中都有效,并将请求响应数据传递给您的 javascript。

    【讨论】:

    • 这真的很有用!谢谢。编写一些 php 以使用 curl 获取数据然后将其传递给我的 javascript 是否简单?我从来没有用过 flash,我认为 spotify 没有 jsonp 接口。
    • 您不需要使用 flash(除了在您的页面上嵌入 .swf 之外),您使用 flXHR 的方式与使用 jsXHR 的方式几乎相同,没有跨浏览器差异。阅读他们页面上的一些文档,了解如何使用 API。是的,您可以使用您的服务器作为代理来检索数据,因为它在同一个域中,但这会给您的服务器带来不必要的负载。
    • 在服务器上使用它的方式:1. 对服务器进行 ajax 调用 2. 您的服务器使用 curl 从 spotify 获取数据 3. 您的服务器将数据返回到浏览器
    • 是的——我就是这么想的——应该很简单?
    • 是的,但 flXHR 甚至有 jQuery plugin。我建议这样做,因为代理解决方案中的开销不可忽略:每个请求都会发生 2 个请求。
    【解决方案2】:

    上面关于使用jsonp的回答是正确的;我要补充:

    不要设置

    jquery.support.cors = true;
    

    我不知道为什么这么多问题都是从说明他们采取了这一步开始的。读取此属性以了解浏览器是否支持 CORS。如果您知道不同,您应该只覆盖它,并且根据我的经验,它对于所有主要浏览器都是准确的。将其设置为 true 不会使浏览器使用 CORS,它只会拒绝您提供 CORS 将失败的信息。

    http://api.jquery.com/jQuery.support/

    【讨论】:

      【解决方案3】:

      你能举一个返回数据的例子吗?

      在 /guess/ 处,它要么与文件名“.json”有关,要么返回的 JSON 有一些奇怪的地方。

      【讨论】:

        【解决方案4】:

        我很惊讶它可以在 Chrome 或 Firefox 上运行。您应该无法运行跨域 JSON 请求。

        如果 Spotify API 支持它,您应该使用 JSONP 来访问其他域的资源。

        另见:No response from jQuery ajax call

        【讨论】:

        • 谢谢。 Spotify 似乎不支持 jsonp。大概我可以写一段 php,通过 curl 获取数据,然后在同一个域中返回它?php 我可以
        【解决方案5】:

        我认为这在 FF 中不起作用。您不能进行跨域 Ajax 调用。因此,当您说它在 FF 中有效时,我不确定发生了什么。但我只是在 FF 中尝试了以下操作,但我得到了错误。因此,您所能做的就是在服务器端进行调用,然后将结果包含在您的页面中。

        http://jsfiddle.net/2XWGn/

        【讨论】:

        • 它在 FF(和 Chrome)中工作。在您放入 jsfiddle 的示例中,您复制了组成的 uri 字段!如果您尝试使用真实的(如 spotify:album:4neXRfYbkqqdrw3E9Z4wol)调用成功。
        • 感谢您的回复!我今天学到了一些重要的东西。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-03-22
        • 1970-01-01
        • 1970-01-01
        • 2012-10-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多