2014-04-16 79 views
0

我只是重新考慮了一堆連接到YouTube API版本3的代碼,以發現我的ajax調用沒有在IE8和IE9上工作。這與IE的這些版本如何跨域ajax請求(他們使用MS XDomainRequest,這在jquery中不支持)有關。jquery跨域ajax請求 - IE8和IE9 - YouTube API v3 - 僅限jsonp?

我的舊代碼正在發出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的最佳方式?

回答

0

我不明白爲什麼你不能在這種情況下使用XDomainRequest。或者在IE9和IE8中製作跨源Ajax請求(並直接使用XDomainRequest)時忘記jQuery,或者爲jQuery使用XDomainRequest包裝器,例如https://github.com/MoonScript/jQuery-ajaxTransport-XDomainRequest。這裏不需要使用JSONP。

請注意,如果XDomainRequest失敗,則不會提供任何理由。 onerror回調函數不帶/不傳遞任何參數。

+0

我不想讓XDomainRequests沿着我的jquery ajax請求。我試過這個庫,但它不起作用 - 不知道爲什麼,但它確實要求服務器發回一個Access-Control-Allow-Origin頭。也許youtube沒有返回該標題。 – Redtopia

+0

如果您不想直接使用XDomainRequest並且/或者您無法使其工作,那麼您唯一的選擇就是JSONP(假設它受YouTube API支持)。 –

+0

這就是我所害怕的,但我想聽聽一些使用jQuery Ajax集成了youtube api v3的人。 – Redtopia

1

YouTube Data API v3要求您使用HTTPS發出GET請求。它根本無法使用HTTP請求。如果您正在進行GET請求的頁面正在使用HTTP,那麼XDomainRequest實現將不起作用。 XDomainRequest要求協議匹配,所以嘗試實現它是一種毫無意義的練習,除非您的頁面是通過HTTPS提供的。

+0

有趣...我通常不會在我的開發環境中使用SSL,但生產環境都是SSL。我將不得不安裝SSL並進行一些測試。謝謝! – Redtopia

+0

我不確定這是否正確。如果數據類型是jsonp,則它們不使用XDomainRequest-Object,它們使用腳本標記和回調函數。對我來說,這是與一個試圖訪問YT(HTTPS)的HTTP站點合作。我也將crossdomain設置爲true –