Подтвердить что ты не робот

Параметр jQuery ajax() - xhr

В jQuery ajax есть опция xhr. Кто-нибудь знает более подробную информацию, удобство использования или выборку этого параметра?

4b9b3361

Ответ 1

Фактически кто-то знает.

Параметр xhr позволяет вам определить свой собственный обратный вызов для создания объекта XMLHttpRequest, который будет использоваться за кулисами в вызове ajax(). В большинстве случаев вам не нужно указывать эту опцию.

Ответ 2

Я знаю, что это старый, старый вопрос, но я просто искал это и хочу опубликовать его, чтобы следующий человек понял, что происходит.

Для этой функции вы хотите вернуть соответствующий объект XHR для своего браузера. По умолчанию используется использование XMLHTTPRequest или эквивалент IE. Здесь поведение по умолчанию:

jQuery.ajaxSettings.xhr = window.ActiveXObject ?
/* Microsoft failed to properly
 * implement the XMLHttpRequest in IE7 (can't request local files),
 * so we use the ActiveXObject when it is available
 * Additionally XMLHttpRequest can be disabled in IE7/IE8 so
 * we need a fallback.
 */
function() {
    return !this.isLocal && createStandardXHR() || createActiveXHR();
} :
// For all other browsers, use the standard XMLHttpRequest object
createStandardXHR;

Эти два метода создания createStandardXHR и createActiveXHR по существу называют основными методами создания XHR, которые мы все знаем и любим годами. Здесь createStandardXHR:

function createStandardXHR() {
try {
    return new window.XMLHttpRequest();
} catch( e ) {}
}

Итак, если вы хотите переопределить это, вы можете просто передать свою собственную функцию, которая возвращает объект new XMLHttpRequest().

Зачем вам это нужно? Скажем, вам нужно сделать HTTP-запрос кросс-домена и использовать IFIMAME-прокладку, чтобы заставить его работать, используя document.domain для работы в рамках тех же правил происхождения. Это хороший способ, чтобы ваш javascript загружал объект XHR из правильного кадра в зависимости от того, в каком домене вы хотите поговорить.

Twitter.com использует эту технику.

JavaScript работает на http://twitter.com/, но данные находятся на http://api.twitter.com. Они создают IFRAME, указывающие на api.twitter.com, который просто устанавливает document.domain в "twitter.com". Они также устанавливают document.domain на "twitter.com" на главной странице.

Затем их JS при выполнении HTTP-запросов просто создает его из IFRAME вместо главной страницы. Получает их с помощью политики одного и того же происхождения.

Вы можете сделать это с помощью параметра xhr в $.ajax(). Вот фрагмент (представьте, что этот код работает на странице http://myapp.com):

$.ajax({url: "http://api.myapp.com", xhr: function(){
  return new ($('#my_api_iframe')[0].contentWindow.XMLHttpRequest)();
}, success: function(html) {
    // format and output result
   }
});

Это будет работать до тех пор, пока и главная страница, и iframe устанавливают их document.domain на одно и то же значение. (Это хакерский пример: он не будет работать в некоторых версиях IE, потому что я обманул и использовал только стандартный объект XMLHttpRequest - вам нужно исправить.)

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

(отредактировано для добавления: это метод, необходимый для старых браузеров - поддержка CORS в большинстве современных браузеров сделает это ненужным)

Sujal

Ответ 3

Еще один поздний ответ, но приведенный ниже код - отличный пример того, что вы можете сделать, когда переопределите параметр xhr. Это взято из блога Ben Nolan Это позволяет отслеживать ход получения xhr. Я использовал это, чтобы создать индикатор выполнения при загрузке большого набора данных json, точно так же, как он его создал. Это помогло мне на тонну.

interval = null

$.ajax {
  url : "endpoint.json"

  dataType : 'json'

  xhr : () =>
    xhr = jQuery.ajaxSettings.xhr()

    interval = setInterval( =>
      if xhr.readyState > 2
        total = parseInt(xhr.getResponseHeader('Content-length'))
        completed = parseInt(xhr.responseText.length)
        percentage = (100.0 / total * completed).toFixed(2)

        console.log "Completed #{percentage}%"
    , 50)

    xhr

  complete: ->
    clearInterval(interval)

  success : (data) =>
    alert(data)
}

Ответ 4

http://api.jquery.com/ - ваш друг. С этого сайта при поиске команды ajax():

xhr (Функция): Обратный вызов для создания объекта XMLHttpRequest. По умолчанию для объекта ActiveXObject, если он доступен (IE), XMLHttpRequest в противном случае. Переопределите, чтобы предоставить свою собственную реализацию для XMLHttpRequest или усовершенствований для factory. Он недоступен в jQuery 1.2.6 и в любой ранней версии.

Как правило, если вы не знаете, что делаете, вы действительно не будете использовать эту функцию функции $.ajax()