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);
}
}));
Intenta establecer 'contentType' en' application/json' en tu solicitud '.ajax'. – BrunoLM
Quiero ofrecer 200 puntos por una recompensa por esto, pero no me deja hacerlo por debajo de dos días :( – Walker
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