2010-12-29 8 views
6

Estoy usando jQuery 1.4.2 y estoy tratando de realizar una simple solicitud de AJAX. La URL objetivo devuelve una cadena JSON (la validé con jslint). La solicitud funciona en Firefox y Chrome, pero no quiere funcionar en IE8, y no puedo determinar por qué. Aquí está la llamada:jQuery AJAX solicita un error en IE8 con el mensaje 'Error: no se puede llamar a este método hasta que se haya llamado al método abierto.'

jQuery.ajax({ 
url: 'http://' + domain + '/' + 'helper/echo/', 
dataType: 'json', 
success: function(data) { 
alert(data); 
}, 
beforeSend: function(request, settings) { 
alert('Beginning ' + settings.dataType + ' request: ' + settings.url); 
}, 
complete: function(request, status) { 
alert('Request complete: ' + status); 
}, 
error: function(request, status, error) { 
alert(error); 
} 
}); 

IE ejecutará la devolución de llamada beforeSend y la devolución de llamada de error. Las alertas de devolución de llamada de error con el mensaje:

Error: This method cannot be called until the open method has been called. 

Mi respuesta cabecera regresa con Content-Type: text/javascript; charset=UTF-8.

¿Qué está pasando con IE? Estoy ejecutando el servidor en localhost, haciendo una solicitud de http://localhost:8080/psx a http://localhost:8080/helper. Tal vez IE está bloqueando esta solicitud? Intenté instalar Fiddler para analizar el tráfico de solicitudes, pero no se ejecutará en mi máquina porque está bloqueado. Firebug me permite, pero todo parece estar bien allí.

Gracias por la ayuda!

+0

Try 'asíncrono: false' e ​​intentarlo de nuevo. –

+0

Eso no tuvo un efecto, desafortunadamente. También debo mencionar que el estado de devolución de llamada de error es nulo. – checker

Respuesta

14

¡Bien, aquí está la solución! La solicitud estaba usando window.XMLHttpRequest(), que no funciona correctamente en IE8 por alguna razón. jQuery no está volviendo a window.ActiveXObject("Microsoft.XMLHTTP") como debería.

Agregue esto a su script en algún lugar antes de que su llamada AJAX (verificado solamente en IE8, no otra IE):

jQuery.ajaxSetup({ 
      xhr: function() { 
        //return new window.XMLHttpRequest(); 
        try{ 
         if(window.ActiveXObject) 
          return new window.ActiveXObject("Microsoft.XMLHTTP"); 
        } catch(e) { } 

        return new window.XMLHttpRequest(); 
       } 
     }); 

Así es como llegué a la solución:

  1. Actualizado a jQuery 1.4 .4 en caso de que el problema fuera un error que se había solucionado.
  2. Pasé por el depurador Firebug y el depurador DevTools hasta que los resultados parecieron ser drásticamente diferentes.
  3. En la línea 5899, la función ajax() crea el objeto XmlHttpRequest con la función xhr(). En Firefox, devolvía buenos datos. En IE, esto era volver con todos los campos de ser Error: This method cannot be called until the open method has been called.
  4. analicé esta función en la línea 5749, return new window.XMLHttpRequest();
  5. Busqué en Google y encontré este page que tiene el mismo problema y sugirió la solución que funciona para mí.
  6. Official jQuery ticket: Configuración de
Cuestiones relacionadas