【问题标题】:jquery cross domain ajax requests - IE8 and IE9 - YouTube API v3 - jsonp only?jquery 跨域 ajax 请求 - IE8 和 IE9 - YouTube API v3 - 仅 jsonp?
【发布时间】:2014-05-31 20:30:07
【问题描述】:

我刚刚重构了一堆代码以连接到 YouTube API 版本 3,发现我的 ajax 调用都没有在 IE8 和 IE9 上运行。这与这些版本的 IE 如何进行跨域 ajax 请求有关(它们使用 MS XDomainRequest,jquery 不支持)。

我的旧代码发出 jsonp 请求,它适用于 IE8 和 IE9。我的新代码正在发出常规的 json 请求,例如:$.ajax({dataType:'json', ...})。我没有意识到这在 IE8 和 IE9 中不起作用。

发出 jsonp 请求的一个缺点是您无法通过 ajax 请求的错误回调捕获超时,因为服务器永远不会响应,这意味着您的回调永远不会被调用。我的处理方式是(有更好的方法吗??):

var timer = setTimeout(function () {
    // a timeout occurred after 30 seconds
}, 30000);

$.ajax({
    url: url + 'https://www.googleapis.com/youtube/v3/... &callback=?',
    type: 'get',
    dataType: 'jsonp',
    success: function (json) {
        clearTimeout(timer);
        // success!
    },
    error: function (xhr) {
        clearTimeout(timer);
        o.fnError(getAjaxError(xhr));
    }
});

我的问题是:这是使用 jquery 和 ajax 调用 YouTube API v3 的最佳方式吗?

【问题讨论】:

    标签: jquery ajax internet-explorer-8 youtube-api cross-domain


    【解决方案1】:

    YouTube 数据 API v3 要求您使用 HTTPS 发出 GET 请求。它根本无法使用 HTTP 请求。如果您发出 GET 请求的页面使用的是 HTTP,那么 XDomainRequest 实现将不起作用。 XDomainRequest 要求协议匹配,因此除非您的页面是从 HTTPS 提供的,否则尝试实现它是毫无意义的练习。

    【讨论】:

    • 有趣...我通常不会在我的开发环境中使用 SSL,但生产环境都是 SSL。我必须设置 SSL 并进行一些测试。谢谢!
    • 我不确定这是否正确。如果数据类型是 jsonp,他们不使用 XDomainRequest-Object,他们使用脚本标签和回调函数。对我来说,这与尝试访问 YT(HTTPS) 的 HTTP 站点一起工作。我还将跨域设置为 true
    【解决方案2】:

    我不明白为什么在这种情况下不能使用 XDomainRequest。要么在 IE9 和 IE8 中进行跨域 ajax 请求时忘记 jQuery(并直接使用 XDomainRequest),要么使用 jQuery 的 XDomainRequest 包装器,例如https://github.com/MoonScript/jQuery-ajaxTransport-XDomainRequest。这里不需要使用 JSONP。

    请注意,如果 XDomainRequest 失败,将不会提供任何原因。 onerror 回调函数不接受/不传递任何参数。

    【讨论】:

    • 我不想在我的 jquery ajax 请求旁边制作 XDomainRequests。我尝试了那个库,但它不起作用——不知道为什么,但它确实需要服务器发回一个 Access-Control-Allow-Origin 标头。也许 youtube 没有返回该标题。
    • 如果您不想直接使用 XDomainRequest 和/或无法使其工作,那么您唯一的选择是 JSONP(假设 YouTube API 支持)。
    • 这就是我害怕的,但我想听听一些使用 jquery ajax 集成了 youtube api v3 的人的意见。
    • MoonScript 仍然不支持从 http 到 https 的调用,因此 moonscript 建议不适用于从 http 调用的 youtube api。 Youtube api 调用必须是 https。
    猜你喜欢
    • 2013-03-11
    • 1970-01-01
    • 2012-07-29
    • 1970-01-01
    • 2013-04-04
    • 1970-01-01
    • 2012-08-17
    • 2011-07-05
    相关资源
    最近更新 更多