jquery跨域ajax请求 - IE8和IE9 - YouTube API v3 - 仅限jsonp?

时间:2014-04-16 19:24:09

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

我只是重新考虑了一堆代码来连接到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的最佳方法吗?

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

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

请注意,如果XDomainRequest失败,则不会提供任何理由。 onerror回调函数不会传递任何参数。