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?
4 answers
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.
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()
.
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.)
(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
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)
}
Http://api.jquery.com é teu amigo. A partir desse site quando você procura o comando ajax ():
Geralmente, a não ser que saibas o que estás a fazer. não vais usar esta função dos $.função 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.