Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

jQuery's ajaxSetup - I would like to add default data for GET requests only

Tags:

In a ajax-driven site I have added some default data using the ajaxSetup, ala this:

var revision = '159'; $.ajaxSetup({     dataType: "text json",     contentType: "application/x-www-form-urlencoded; charset=UTF-8",     data: {         r: revision     } }); 

This is to ensure cache-miss when a new revision is deployed and the frontend ask for html templates or json-data from the backend. The backend and frontend share the same revision number for this reason.

The problem is that the backend it somewhat unhappy about getting the parameter 'r' when the frontend does a PUT, POST or DELETE. Is there no way to tell jQuery's ajax that this data should only be used when doing GET requests and not when doing POST, PUT or DELETE requests.

UPDATE:

I tried the beforeSend function first, since I knew it. However changing settings.data was possible, but any change seemed to vanish when beforeSend returned. It may have been my fault... :-)

I have settled on the ajaxPreFilter instead. It was not easy as pie though. The options.data is not an object, but the result of $.param(object), so the first challenge was to un-parameterize it. I ended up with this:

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 })); }); 
like image 440
CodeReaper Avatar asked Aug 09 '11 13:08

CodeReaper


1 Answers

Starting jQuery 1.5, you can handle this much more elegantly via 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 }); }); 
like image 54
Mrchief Avatar answered Oct 23 '22 18:10

Mrchief