Моя компания разработала встраиваемый javascript видеоплеер. Часть процесса начальной загрузки включает использование XMLHttpRequest
для извлечения ресурса с нашего сервера. Это запрос на перекрестный поиск, потому что наш видеопроигрыватель встроен на сайты других людей с помощью тега скрипта. У нас есть наши заголовки CORS настроены правильно, и он работает в Chrome, Firefox, Safari, iOS, Android и других. Это также работает для меня, когда я тестирую в IE 11 и 10.IE 11 XHR Failures
Однако из наших данных аналитики мы видим, что объект xhr
вызывает событие error
около 10% времени в IE 11. Я не смог чтобы воспроизвести проблему самостоятельно.
Может ли кто-нибудь подумать о каких-либо причинах, почему это может произойти? Лучшая теория, которую я имею, - это какие-то корпоративные настройки безопасности IE, которые блокируют наш запрос кросс-происхождения. Но это просто дикие предположения.
Неужели кто-то еще когда-либо испытывал что-то подобное и нашел причину?
Вот код, который я написал для запросов. Я не верю, что делаю что-то неправильно.
function makeRequest(config) {
var xhr = new window.XMLHttpRequest();
var deferred = q.defer();
var url;
function setHeaders(headers) {
var header;
for (header in headers) {
xhr.setRequestHeader(header, headers[header]);
}
}
// toQueryParams() converts an object to URL query params
url = config.url + toQueryParams(config.params);
/*
* This function gets called when the XHR is "loaded". It then fulfills or rejects
* the promise based on the HTTP status code of the response.
*/
function handleResponse() {
var response = {
status: xhr.status,
data: (function() {
try {
return JSON.parse(xhr.responseText);
} catch(e) {
return xhr.responseText;
}
}()),
headers: function() {
return xhr.getAllResponseHeaders();
}
};
var status = response.status,
var success = !(status >= 400 && status < 600);
deferred[success ? 'resolve' : 'reject'](response);
}
/*
* This function gets called when the XHR emits an "error".
*
* There is code elsewhere that sends these errors to our Google Analytics
* account. This is how we know about the IE 11 XHR errors even though I
* can't reproduce them.
*/
function handleError() {
deferred.reject({
status: null,
data: new Error('The XHR request to [' + url + '] has failed...'),
headers: function() {
return null;
}
});
}
xhr.onload = handleResponse;
xhr.onerror = handleError;
xhr.open(config.method, url, true);
xhr.responseType = config.responseType || '';
setHeaders(config.headers);
xhr.timeout = config.timeout || 0;
xhr.send(config.data);
return deferred.promise;
}
Спасибо за любую помощь вы можете предоставить!