Side navigation
#2734 closed feature (invalid)
Opened April 22, 2008 11:26PM UTC
Closed September 28, 2010 11:53PM UTC
Last modified March 14, 2012 06:23PM UTC
jQuery.ajax({ lock: 'string identifier' }) to prevent duplicate submissions
| Reported by: | jelly-bean | Owned by: | |
|---|---|---|---|
| Priority: | major | Milestone: | 1.2.4 |
| Component: | ajax | Version: | 1.2.3 |
| Keywords: | Cc: | ||
| Blocked by: | Blocking: |
Description
I would like to suggest a new 'lock' parameter for jQuery.ajax. I created one myself and I use it all the time. See below for definition and usage example:
// definition
var myAJAX = {
// AJAX locking system prevents simultaneous/duplicate requests.
ajax_locked: {},
ajax_lock: function(id) {
if (myAJAX.ajax_locked[id]) {
alert('Only click once, please.');
return false; // cannot obtain lock; already locked
}
else {
myAJAX.ajax_locked[id] = true; // lock
return true;
}
},
ajax_unlock: function(id) {
myAJAX.ajax_locked[id] = null;
},
ajax: function(o) {
if (o.lock && !myAJAX.ajax_lock(o.lock)) return;
return jQuery.ajax({
type: 'POST',
url: o.url,
data: o.data,
dataType: o.dataType,
timeout: 30000, // ms
beforeSend: o.beforeSend,
success: o.success,
error: o.error,
complete: o.complete
});
},
}
// usage example
myAJAX.ajax({
lock: 'create_task',
data: jQuery('form').serialize(),
success: function() { alert('yay!'); }
});
// works even better when combined with:
// http://dev.jquery.com/ticket/2688
// like so...
myAJAX.ajax({
lock: 'delete_task',
beforeSend: function() {
return confirm('Are you sure');
},
data: 'id='+id,
success: function() { alert('done.'); }
});
// because then the confirmation dialog doesn't appear if it's already going...
// this assumes you are being nice to the user and displaying some sort of AJAX spinner graphic
Attachments (0)
Change History (3)
Changed April 22, 2008 11:34PM UTC by comment:1
Changed May 11, 2008 11:20PM UTC by comment:2
| component: | core → ajax |
|---|---|
| type: | enhancement → feature |
Changed September 28, 2010 11:53PM UTC by comment:3
| resolution: | → invalid |
|---|---|
| status: | new → closed |
The ajax method is already pretty complex, and this seems best implemented by a plugin.
[17:32] ThrushAAX: jelly-bean: I would simply remove the click or whatever event so its impossible to click again
[17:33] jelly-bean: ThrushAAX: not a bad idea; i've done that before as well as setting the disabled attribute on an element. this just makes it easy because you can limit it on a per-element level or a regional level (e.g. all delete events) or a global level (e.g. all events, assuming you use the same lock identifier)