2010-08-31 12 views
6

Por alguna razón, IE nos pide que descarguemos un archivo en lugar de ejecutarlo como ajax. Esto funciona en todos los navegadores excepto en IE. Traté de jugar con los encabezados que regresa sin suerte.Error de respuesta Ajax y JSON en Internet Explorer (funciona en todos los demás navegadores)

La función toma los datos y luego los publica, la respuesta es una puede ser una matriz de cualquier cantidad de elementos que se actualizarán en la página.

No se supone que debe ser un archivo, suponga que es solo una respuesta json.

PHP

header('Content-type: application/json'); 

$error = "The Email and Password you entered could not be resolved."; 
$elements[0]['target'] = '.error_report'; 
$elements[0]['action'] = 'inside'; 
$elements[0]['data'] = '<p>'.$error.'</p>'; 
$this->output->set_output(
    json_encode(array("elements" => $elements)) 
); 

Javascript

$(document).ready(function() { 
    jQuery.ajaxSetup({ 
     cache: false, 
     dataType: 'json', 
     error: function() { 
      alert("Request was not successful. Please try again shortly."); 
     } 
    }); 

    $(document).ajaxSuccess(function (e, xhr, settings) { 
     var response = xhr.responseText; 
     if (settings.dataType != 'json') { 
      return; 
     }; 

     try { 
      response = jQuery.parseJSON(response); 
     } catch (e) { 
      alert(e); 
      return; 
     } 

     if (response.elements instanceof Array) { 
      var reqs = ['target', 'action']; 
      var valid = true; 
      for (var i=0;i<response.elements.length;i++) { 
       var cur = response.elements[i]; 
       var sel; 

       for (var j=0;j<reqs.length;j++) { 
        if (typeof cur[reqs[j]] !== "string") { 
         valid = false; 
         break; 
        }; 
       }; 

       if (!valid) { 
        continue; 
       }; 

       sel = $(cur.target); 
       switch (cur.action) { 
        case "inside": 
         sel.html(cur.data); 
        break; 
        case "instead": 
         sel.replaceWith(cur.data); 
        break; 
        case "remove": 
         sel.remove(); 
        break; 
        case "refreshPage": 
         window.location.reload(); 
        default: 
         if (typeof sel[cur.action] === "function") { 
          sel[cur.action](cur.data); 
         }; // else continue 
        break; 
       }; 
      }; 
     }; 


      // Dispatch the AJAX request, and save it to the data object so that 
      // is can be referenced and cancelled if need be. 

      self.data('ajaxify.xhr', jQuery.ajax({ 
       url: this.action, 
       type: 'post', 
       dataType: options.dataType, 
       data: (beforeSubmitIsJquery ? beforeSubmitResult.serialize() 
              : self.serialize()), 
       success: function (/**/) { 
        cleanup(); 

        options.onSuccess.apply(that, arguments); 
       }, 
       error: function (/**/) { 
        cleanup(); 

        options.onError.apply(that, arguments); 
       }, 
       complete: function (/**/) { 
        options.onComplete.apply(that, arguments); 
       } 
      })); 
+0

Intenta establecer 'contentType' en' application/json' en tu solicitud '.ajax'. – BrunoLM

+0

Quiero ofrecer 200 puntos por una recompensa por esto, pero no me deja hacerlo por debajo de dos días :( – Walker

+0

Ya intenté adaptar el tipo de contenido: si cambiamos de encabezado a texto plano o json se carga una nueva página con la respuesta JSON en él, en lugar de descargar la respuesta como lo hace con el encabezado ContentType (ambos son incorrectos). – Walker

Respuesta

2

Bueno, me pregunto porque el comportamiento que describes tiene todas las características de un doble-post causado por un controlador de eventos lanzar una petición ajax seguido por el el formulario de navegador "nativo" se envía. Si yo fuera usted, haría triplemente más seguro de que su controlador de eventos devuelve "falso" o "preventDefault", o tal vez ambos :-) - Puntiagudo hace 1 hora

Mi seguimiento: Desde IE ignora preventDefault, intenta usar return false; after preventDefault ...

Para futuras referencias a otros desarrolladores: la forma en que las bibliotecas comunes tienden a hacer esto es que generalmente codifican un bloque con ambos métodos (preventDefault() y devuelven falso;) porque esto le dice a cada uno los principales navegadores para dejar de trabajar en el evento, según lo que escuchan. Esto es más importante con los navegadores IE heredados.

De todos modos, me alegro de que podamos ayudar.

+0

Acabo de encontrar un problema si puedes ayudar: básicamente lo solucionamos eliminando type = "submit "desde el botón de enviar y luego en el javascript configurándolo para vivir (" clic "en lugar de en vivo (" enviar "(que aparentemente está roto en IE?) – Walker

+0

Oh hombre, disculpa por eso, me atrapaste después de que dejé el trabajo. Pensaré en esto por la mañana. – jcolebrand

+0

Pensé que lo tenías conectado a un envío de entrada con un clic que cancelaba y devolvía falso. ¿Qué sucede cuando lo pones de esa manera? ~~~ Live solo funciona en algunos navegadores, IIRC. Hay una solución para la que pensé cuando Live no funciona, pero estoy un poco retrasado esta mañana, por lo que no puedo buscar los detalles sobre eso. Ciertamente puedo ver en aproximadamente 2 o 3 horas y responde entonces. Espero que esto ayude durante el tiempo b eing. – jcolebrand

0

Tuve este problema con ASP.NET MVC 4. Estaba devolviendo un JSONResult. Pero cambiando el objeto de devolución a this.content solucionó este problema.

[HttpPost] 
public ActionResult Upload(AddNewModel model) 
{ 
    /**...*/ 
    return this.Content(id.ToString()); 
} 

Parece que IE tiene un problema con un objeto json que se devuelve, y se puede solucionar devolviendo una cadena.

Cuestiones relacionadas