2011-08-09 15 views
20

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 })); 
}); 
+0

parece que es el comportamiento previsto como se explica en http://bugs.jquery.com/ticket/9757 – Ritesh

Respuesta

29

A partir de jQuery 1.5, se puede manejar esto con más deportividad a través Prefilters:

var revision = '159'; 
$.ajaxPrefilter(function (options, originalOptions, jqXHR) { 
    // do not send data for POST/PUT/DELETE 
    if(originalOptions.type !== 'GET' || options.type !== 'GET') { 
     return; 
    } 

    options.data = $.extend(originalOptions.data, { r: revision }); 
}); 
+8

Estoy con jQuery 1.6.4, solo puedo hacer que funcione así: options.data = $ .param ($. ext (originalOptions.data, {r : revisión })); –

+1

@MorganCheng: compruebe si está configurando el indicador 'contentType' y' processData' correcto. jQeury haría la serialización en consecuencia. Si sus datos son una matriz, es posible que desee verificar la configuración 'tradicional '. – Mrchief

+0

Tiene una coma final en su última línea. –

10

Creo que lo que podrías usar es beforeSend.

var revision = '159'; 
$.ajaxSetup({ 
    dataType: "json", 
    contentType: "application/x-www-form-urlencoded; charset=UTF-8", 
    beforeSend: function(jqXHR, settings) { 
     if(settings.type == "GET") 
      settings.data = $.extend(settings.data, { ... }); 
     return true; 
    } 
}); 

jqXHR documentation

BeforeSend documentation as well as your settings available

codifiqué este ciego, así que espero que consigue que va en la dirección correcta.

+1

¿Cuál es la diferencia entre $ .ajaxPrefilter y beforeSend? – svlada

+0

@svlada '$ .ajaxSetup()' - Establece valores predeterminados para futuras solicitudes Ajax. '$ .ajaxPrefilter()' - Modifica las opciones existentes antes de enviar cada solicitud. http://stackoverflow.com/a/29843893/2714931 – WeizhongTu

Cuestiones relacionadas