En un sitio-ajax impulsado he añadido algunos datos por defecto utilizando el ajaxSetup, ala este:ajaxSetup de jQuery - Me gustaría añadir datos por defecto para las peticiones GET única
var revision = '159';
$.ajaxSetup({
dataType: "text json",
contentType: "application/x-www-form-urlencoded; charset=UTF-8",
data: {
r: revision
}
});
Esto es para asegurar caché-miss cuando se implementa una nueva revisión y la interfaz solicita plantillas html o datos json desde el back-end. El backend y el frontend comparten el mismo número de revisión por este motivo.
El problema es que la parte trasera no está contento con el parámetro 'r' cuando la interfaz hace un PUT, POST o DELETE. ¿No hay forma de decirle a jQuery's ajax que estos datos solo deben usarse cuando se realizan solicitudes GET y no cuando se realizan solicitudes POST, PUT o DELETE?
ACTUALIZACIÓN:
Probé la función beforeSend primero, ya lo sabía. Sin embargo, cambiar settings.data fue posible, pero cualquier cambio pareció desaparecer cuando BeforeSend regresó. Pudo haber sido mi culpa ... :-)
Me he decidido por el ajaxPreFilter. Sin embargo, no fue fácil como un pastel. El archivo options.data no es un objeto, sino el resultado de $ .param (objeto), por lo que el primer desafío fue des-parametrizarlo. Terminé con esto:
var revision = '159';
$.ajaxPrefilter(function (options, originalOptions, jqXHR) {
// do not send data for POST/PUT/DELETE
if (originalOptions.type !== 'GET' || options.type !== 'GET') {
return;
}
var data = originalOptions.data;
if (originalOptions.data !== undefined) {
if (Object.prototype.toString.call(originalOptions.data) === '[object String]') {
data = $.deparam(originalOptions.data); // see http://benalman.com/code/projects/jquery-bbq/examples/deparam/
}
} else {
data = {};
}
options.data = $.param($.extend(data, { r: revision }));
});
parece que es el comportamiento previsto como se explica en http://bugs.jquery.com/ticket/9757 – Ritesh