(function(){ jQuery.fn.ajax = function(settings){ var jQThis = this; function jQAjaxChain(settings){ if(!(this instanceof arguments.callee)) { return new arguments.callee(settings); } var self = this, combined; this.callbacks = { success: function(){} ,error: function(){} ,complete: function(){} }; combined = $.extend({ beforeSend: function(xhr, settings){ self.settings = settings; } ,success: function(){ self.callbacks.success.apply(self.settings, arguments); } ,error: function(){ self.callbacks.error.apply(self.settings, arguments); } ,complete: function(){ self.callbacks.complete.apply(self.settings, arguments); } }, settings); this.xhr = $.ajax(combined); } jQAjaxChain.prototype.success = function(callback){ this.callbacks.success = callback; return this; } jQAjaxChain.prototype.error = function(callback){ this.callbacks.error = callback; return this; } jQAjaxChain.prototype.complete = function(callback){ this.callbacks.complete = callback; return this; } jQAjaxChain.prototype.exit = function(){ return jQThis; } return new jQAjaxChain(settings); } })(); var test = $('ul li') .ajax({url: '/echo/json'}) .error(function(){ console.log('error', arguments, this); }) .success(function(){ console.log('success', arguments, this); }) .complete(function(){ console.log('complete', arguments, this); }) .exit() .each(function(i){ console.log('element ' + i, this); }); console.log(test);
<ul> <li>Item 1</li> <li>Item 2</li> <li>Item 3</li> </ul>