jquery ajax() option-xhr

na função jquery ajax existe a opção xhr. Alguém sabe mais detalhes, usabilidade ou uso de amostra desta opção?

 17
Author: Vaclav Kohout, 2009-10-29

4 answers

Na verdade, alguém sabe.

A opção xhr permite-lhe definir a sua própria resposta para criar o objecto XMLHttpRequest que será usado nos bastidores da chamada ajax(). Em praticamente todos os casos, você não deve precisar especificar esta opção.

 5
Author: Matt Ball, 2009-10-29 15:14:50
Sei que é uma pergunta antiga, mas estava à procura disto e queria postar isto para que a próxima pessoa percebesse o que se passa.

Para esta função, deseja devolver um objecto XHR apropriado para o seu navegador. O comportamento padrão é usar XMLHTTPRequest ou o equivalente IE. Aqui está o comportamento padrão:

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;
Esses dois criam métodos e basicamente chamam os métodos básicos de criação XHR que todos conhecemos e amamos há anos. Aqui está createStandardXHR:
function createStandardXHR() {
try {
    return new window.XMLHttpRequest();
} catch( e ) {}
}

Então, se você queria anular isso, você pode simplesmente passar em sua própria função que retorna um objeto new XMLHttpRequest().

Porque queres fazer isto? Digamos que você precisa fazer um pedido HTTP de domínio cruzado e está usando um shim IFRAME para fazê-lo funcionar usando document.domain para trabalhar dentro das mesmas regras de origem. Esta é uma boa maneira de fazer o seu javascript carregar o objeto XHR a partir da moldura correta com base em que Domínio você quer falar.

Twitter.com usa esta técnica.

O JavaScript funciona em http://twitter.com / mas os dados estão em http://api.twitter.com . criam uma IFRAME que aponta para api.twitter.com isso simplesmente ajusta document.domain a "twitter.com". Eles ajustaram document.domain para "twitter.com" na página principal, também.

Então, o seu JS, ao fazer pedidos HTTP, apenas o cria a partir do IFRAME em vez da página principal. Faz com que passem pela mesma política de origem.

Pode fazer isto com a opção xhr para $.Forum(). Aqui está um excerto (imagine este código a correr numa página em 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
   }
});

Isso irá funcionar desde que tanto a página principal como o iframe definam o seu document.domain para o mesmo valor. (Este é um exemplo hackish: ele não vai funcionar em algumas versões IE porque eu copiei e só usei o objeto padrão XMLHttpRequest - você vai precisar corrigir.)

Espero que isso ajude.

(editado para adicionar: esta é uma técnica necessária para o Suporte de navegadores-CORS mais antigos na maioria dos navegadores modernos iria torna isto desnecessário.

Sujal

 17
Author: sujal, 2011-12-05 05:18:46

Outra resposta tardia, mas o código abaixo é um grande exemplo do que você pode fazer quando você sobrepõe a opção xhr. Isto é tirado do blog do Ben Nolan.permite-lhe acompanhar o progresso de um programa xhr. Usei isto para criar uma barra de progresso ao carregar um grande conjunto de dados json, exactamente a mesma coisa para que ele o criou. Ajudou-me imenso.

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)
}
 9
Author: Sneaky Wombat, 2012-08-09 17:32:33

Http://api.jquery.com é teu amigo. A partir desse site quando você procura o comando ajax ():

XHR (Function): Callback para criar o objecto XMLHttpRequest. É por omissão o ActiveXObject quando disponível (IE), o XMLHttpRequest caso contrário. Substituir para fornecer a sua própria implementação para XMLHttpRequest ou melhorias para o factory.It não está disponível em Jquery 1.2.6 e em qualquer versão inicial.

Geralmente, a não ser que saibas o que estás a fazer. não vais usar esta função dos $.função ajax ()
 0
Author: Bartek, 2009-10-29 15:14:28