jQuery AJAX выбирает только заголовки и решает, получить ли контент - PullRequest
0 голосов
/ 14 июля 2011

Я делаю 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 НЕ является одним из них.

Ответы [ 3 ]

9 голосов
/ 17 июня 2015

Используя тип 'HEAD', jQuery не будет загружать контент, а будет выбирать только заголовки.

Затем вы можете получить их по имени, используя getResponseHeader для возвращенного объекта XHR.

$.ajax({
        type: 'HEAD',
        url: 'http://example.com/api.php',
        complete: function(xhr) {
            var contentLength = xhr.getResponseHeader('Content-Length');
        }
});

Вы также можете получить список всех заголовков ответов с помощью:

xhr.getAllResponseHeaders()
4 голосов
/ 14 июля 2011

Возможно, вам придется взломать JQuery. Я не знаю, как это сделать подробно, но ...

jQuery использует XMLHttpRequest () для загрузки данных. Если вы посмотрите здесь (обратите внимание, где будет прокручиваться страница)

http://en.wikipedia.org/wiki/XMLHttpRequest#The_onreadystatechange_event_listener

вы обнаружите, что каким-то образом можно подключить прослушиватель, который прослушивает загружаемые заголовки. Затем данные будут продолжать загружаться, но с помощью функции abort () вы можете прервать ее. Если вы посмотрите в исходный код jQuery:

http://www.google.com/codesearch#LARMQtWqu54/trunk/spec/support/jquery-1.4.4.js&q=xmlhttprequest%20package:jQuery&type=cs

и ищите xhr.send (1 совпадение) и window.XMLHttpRequest (2 совпадения), вы увидите, что эти параметры не используются в jQuery изначально (обратите внимание, что xhr является XMLHttpRequest). Однако в первом совпадении window.XMLHttpRequest в комментариях указано, что вы можете переопределить этот объект. Тем не менее, во втором матче комментария нет, поэтому я не уверен, будет ли он также переопределен (следовательно, вам может понадобиться взломать, чтобы он работал во всех браузерах). Вам нужно будет расширить XMLHttpRequest и изменить конструктор и / или метод send для вызова его родителя. Передайте этот объект в jQuery так, как это указано в комментариях.

Надеюсь, вы знаете, как работают слушатели и как работает объектная ориентация в javascript.

0 голосов
/ 14 июля 2011

Я думаю, если, например, вы укажете:

contentType: "text/html; charset=utf-8"

в вашем запросе ajax, если отправленные данные не соответствуют указанному вами типу MIME, запрос не удастся, и я думаю, что это то, что вы можете сделатьо том, как справиться с этим.

Для получения дополнительной информации обратитесь к этому разделу документации jQuery

Также, возможно, вы можете использовать параметр beforeSend:

    $.ajax({
  url: 'http://fiddle.jshell.net/favicon.png',
  beforeSend: function( xhr ) {
    xhr.overrideMimeType( 'text/html; charset=x-user-defined' );
  },
  success: function( data ) {
    if (console && console.log){
      console.log( 'Sample of data:', data.slice(0,100) );
    }
  }
});

Надеюсь, это поможет.

...