11
(function (send) { 

    XMLHttpRequest.prototype.send = function() { 

     this.addEventListener('readystatechange', function() { 

      console.log('readyState changed'); 

     }, false); 

     send.apply(this, arguments); 
    }; 

})(XMLHttpRequest.prototype.send); 

Questo funziona, ma sembra interessare altri framework (come jQuery). Quando uso il codice sopra, le mie chiamate jQuery ajax non sono complete (IE7 + IE8).AJAX readystatechange listener per IE7 + 8

C'è un modo per dare all'evento un nuovo alias in modo che non causi conflitti (sto solo supponendo che questo sia il problema)?

E non è possibile utilizzare this.onreadystatechange, poiché jQuery lo sovrascrive (vedere Fiddle).

Non appena eseguo il binding del listener di eventi, il codice sembra non funzionare correttamente, quindi non è possibile utilizzare la console per eseguire il debug.

Fiddle

Compare in ie8 vs ie9 mode and notice that the console is empty in ie8

Il motivo per cui ho bisogno di questo è che io voglio un gestore ajax globale per un altro quadro (GWT). Io uso jQuery solo per testarlo ora.

Modifica: Sembra che solo ie9 supporti addEventListener. Tuttavia, attachEvent non sembra esistere sull'oggetto XHR in ie7-8.

+0

i'm cieco dispiace per quella risposta cerco di trovare problema, non so perché? ... è stato sostituito XMLHttpRequest.send e siete ultima persona che cambiano onreadystatechange e nessuno potrebbe cambiarlo dopo di te .. !! ma come tu spieghi non ha funzionato .. cambio onload ed è vero e funziona .. e controllo jquery source, jquery non sovrascrive onreadystatechange e sovrascrive solo onload & onerror di XHR –

+0

@MehdiYeganeh jQuery lo imposta su '$ .noop' ​​che in una funzione vuota. http://api.jquery.com/jQuery.noop/ – Johan

+0

sì ho trovato la linea e ho riscontrato un problema, il problema è quando si invia una richiesta da jquery, si verifica il timeout e si imposta onreadystatechange su noop (jquery.basis.js, riga 5240): setTimeout (function() {// Verificare se la richiesta è ancora accadendo if (! XHR && requestDone) { onreadystatechange ("timeout");} }, s.timeout); e se si imposta il timeout su 0 si risolve problema in jquery: D –

risposta

1

Abbiamo riscontrato un problema simile con jquery in errore su IE8. Suppongo che tu stia facendo una richiesta interdominio. Jquery esegue ajax tramite XMLHttpRequest, ma IE8 ha sostituito l'oggetto XMLHttpRequest con XDomainRequest e jquery non lo supporta. Pertanto, per IE8, è necessario modificare il codice per utilizzare XDomainRequest con jquery.

vedere i link

Using jquery ajax for IE8

+0

Grazie, ma jQuery dovrebbe gestirlo internamente ora. Inoltre, 'XMLHttpRequest' è supportato fino a IE7. – Johan

+1

Inoltre, come ho detto sopra; Non sto cercando una soluzione jQuery. Sto usando GWT. Ho appena usato jQuery per lo scopo della Demonstation. – Johan

+0

jquery non lo gestirà internamente. Non hanno intenzione di supportare IE8, vedere questo bug report -> http://bugs.jquery.com/ticket/8283 – cherit