Я делаю AJAX-скрипт на основе jQuery.ajax()
и пришел к точке, где я должен каким-то образом проверить, является ли ссылка, которую я пытаюсь загрузить, HTML-страницей или чем-то другим, например swf, image или zip.Поэтому мне нужно как-то проверить заголовок типа контента и решить, должен ли я также получать контент (если он html) или выбросить вызов ajax и выполнить window.location = theUrl
.Чего я не хочу, так это получить весь файл, просто чтобы узнать, что это zip-файл размером 100 МБ.
Есть ли способ приостановить (или прервать) запрос, пока он еще выполняется, и прочитать толькозаголовки?HEAD
Вызов не вариант, потому что таким образом мне придется каждый раз делать 2 запроса к серверу.
Может быть, что-то вроде хака с setTimeout
и низкоуровневыми функциями xhr?
Заранее спасибо!:)
РЕДАКТИРОВАТЬ: Попытка получить заголовки из xhr в setTimeout до завершения запроса, но он не заполняет его, пока не будут получены все данные.
РЕДАКТИРОВАТЬ 2:Я взломал способ jquery, который связывает себя с onreadystatechange:
var xhrr = new window.XMLHttpRequest();
$.ajaxSetup({
xhr: function() { return xhrr }
});
...
$.ajax(....);
var theirfunc = xhrr.onreadystatechange;
xhrr.onreadystatechange = function() {
console.log('xhr state: ', xhrr.readyState);
theirfunc();
};
Так что это дало мне состояния 1, 2, 3, 4 по порядку, и я мог получить тип контента и успешно прервать его.Я все еще исследую, почему это не будет работать, когда jquery сам создает объект XMLHttpRequest.Если я пропущу часть ajaxSetup и получу var xhrr = $.ajax(...)
, то свяжу так же, как это не будет работать.Так чем же мой XHR отличается от JQuery?Я вижу, они делают это так:
function createStandardXHR() {
try {
return new window.XMLHttpRequest();
} catch( e ) {}
}
Так что это не должно иметь значения?
РЕДАКТИРОВАТЬ 3: Нашли это!jquery 1.6 возвращает поддельный объект xhr с небольшим количеством свойств, и onreadystatechange
НЕ является одним из них.