From 4ce77d8c851fdc8856226ae43844079d00d888a8 Mon Sep 17 00:00:00 2001
From: Diego Carrion
Date: Sat, 19 Feb 2011 23:46:58 -0200
Subject: [PATCH 01/17] refactored element.attr('data-x') to element.data('x')
---
src/rails.js | 18 +++++++++---------
1 file changed, 9 insertions(+), 9 deletions(-)
diff --git a/src/rails.js b/src/rails.js
index 17c0b371..723a725b 100644
--- a/src/rails.js
+++ b/src/rails.js
@@ -36,7 +36,7 @@
// Submits "remote" forms and links with ajax
function handleRemote(element) {
var method, url, data,
- dataType = element.attr('data-type') || ($.ajaxSettings && $.ajaxSettings.dataType);
+ dataType = element.data('type') || ($.ajaxSettings && $.ajaxSettings.dataType);
if (element.is('form')) {
method = element.attr('method');
@@ -49,7 +49,7 @@
element.data('ujs:submit-button', null);
}
} else {
- method = element.attr('data-method');
+ method = element.data('method');
url = element.attr('href');
data = null;
}
@@ -79,7 +79,7 @@
// Delete
function handleMethod(link) {
var href = link.attr('href'),
- method = link.attr('data-method'),
+ method = link.data('method'),
csrf_token = $('meta[name=csrf-token]').attr('content'),
csrf_param = $('meta[name=csrf-param]').attr('content'),
form = $(''),
@@ -97,7 +97,7 @@
form.find('input[data-disable-with]').each(function() {
var input = $(this);
input.data('ujs:enable-with', input.val())
- .val(input.attr('data-disable-with'))
+ .val(input.data('disable-with'))
.attr('disabled', 'disabled');
});
}
@@ -110,7 +110,7 @@
}
function allowAction(element) {
- var message = element.attr('data-confirm');
+ var message = element.data('confirm');
return !message || (fire(element, 'confirm') && confirm(message));
}
@@ -126,17 +126,17 @@
var link = $(this);
if (!allowAction(link)) return false;
- if (link.attr('data-remote') != undefined) {
+ if (link.data('remote') != undefined) {
handleRemote(link);
return false;
- } else if (link.attr('data-method')) {
+ } else if (link.data('method')) {
handleMethod(link);
return false;
}
});
$('form').live('submit.rails', function(e) {
- var form = $(this), remote = form.attr('data-remote') != undefined;
+ var form = $(this), remote = form.data('remote') != undefined;
if (!allowAction(form)) return false;
// skip other logic when required values are missing
@@ -158,7 +158,7 @@
var name = button.attr('name'), data = name ? {name:name, value:button.val()} : null;
button.closest('form').data('ujs:submit-button', data);
});
-
+
$('form').live('ajax:beforeSend.rails', function(event) {
if (this == event.target) disableFormElements($(this));
});
From 0748cac800f43dbe73ae010bb96a14d7358bbdc7 Mon Sep 17 00:00:00 2001
From: Diego Carrion
Date: Sat, 19 Feb 2011 23:47:42 -0200
Subject: [PATCH 02/17] removed optional operator
---
src/rails.js | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/rails.js b/src/rails.js
index 723a725b..5536faaa 100644
--- a/src/rails.js
+++ b/src/rails.js
@@ -28,7 +28,7 @@
// Triggers an event on an element and returns the event result
function fire(obj, name, data) {
- var event = new $.Event(name);
+ var event = $.Event(name);
obj.trigger(event, data);
return event.result !== false;
}
From ca5b4b6a37f43b7771d7f36f985d5db2b5e04d65 Mon Sep 17 00:00:00 2001
From: Diego Carrion
Date: Sat, 19 Feb 2011 23:49:41 -0200
Subject: [PATCH 03/17] refactored commented code to a function
---
src/rails.js | 8 ++++++--
1 file changed, 6 insertions(+), 2 deletions(-)
diff --git a/src/rails.js b/src/rails.js
index 5536faaa..994bc1b3 100644
--- a/src/rails.js
+++ b/src/rails.js
@@ -122,6 +122,11 @@
return missing;
}
+ function register(button) {
+ var name = button.attr('name'), data = name ? {name:name, value:button.val()} : null;
+ button.closest('form').data('ujs:submit-button', data);
+ }
+
$('a[data-confirm], a[data-method], a[data-remote]').live('click.rails', function(e) {
var link = $(this);
if (!allowAction(link)) return false;
@@ -155,8 +160,7 @@
var button = $(this);
if (!allowAction(button)) return false;
// register the pressed submit button
- var name = button.attr('name'), data = name ? {name:name, value:button.val()} : null;
- button.closest('form').data('ujs:submit-button', data);
+ register(button);
});
$('form').live('ajax:beforeSend.rails', function(event) {
From 0aa142f83a52861ac1cd25dfdd580c470939b266 Mon Sep 17 00:00:00 2001
From: Diego Carrion
Date: Sat, 19 Feb 2011 23:31:06 -0300
Subject: [PATCH 04/17] dryed .live('x.rails') with .on(x)
---
src/rails.js | 14 +++++++++-----
1 file changed, 9 insertions(+), 5 deletions(-)
diff --git a/src/rails.js b/src/rails.js
index 994bc1b3..7d65efba 100644
--- a/src/rails.js
+++ b/src/rails.js
@@ -127,7 +127,11 @@
button.closest('form').data('ujs:submit-button', data);
}
- $('a[data-confirm], a[data-method], a[data-remote]').live('click.rails', function(e) {
+ $.fn.on = function(name, fn) {
+ $(this).live(name + '.rails', fn);
+ }
+
+ $('a[data-confirm], a[data-method], a[data-remote]').on('click', function(e) {
var link = $(this);
if (!allowAction(link)) return false;
@@ -140,7 +144,7 @@
}
});
- $('form').live('submit.rails', function(e) {
+ $('form').on('submit', function(e) {
var form = $(this), remote = form.data('remote') != undefined;
if (!allowAction(form)) return false;
@@ -156,18 +160,18 @@
}
});
- $('form input[type=submit], form button[type=submit], form button:not([type])').live('click.rails', function() {
+ $('form input[type=submit], form button[type=submit], form button:not([type])').on('click', function() {
var button = $(this);
if (!allowAction(button)) return false;
// register the pressed submit button
register(button);
});
- $('form').live('ajax:beforeSend.rails', function(event) {
+ $('form').on('ajax:beforeSend', function(event) {
if (this == event.target) disableFormElements($(this));
});
- $('form').live('ajax:complete.rails', function(event) {
+ $('form').on('ajax:complete', function(event) {
if (this == event.target) enableFormElements($(this));
});
})( jQuery );
From 55a5c221676d2e92a0cfb2dc6ba698a4dc5f2e08 Mon Sep 17 00:00:00 2001
From: Diego Carrion
Date: Sat, 19 Feb 2011 23:35:47 -0300
Subject: [PATCH 05/17] dryed 's ajax:beforeSend and ajax:complete
---
src/rails.js | 15 ++++++++-------
1 file changed, 8 insertions(+), 7 deletions(-)
diff --git a/src/rails.js b/src/rails.js
index 7d65efba..c16fc96f 100644
--- a/src/rails.js
+++ b/src/rails.js
@@ -131,6 +131,12 @@
$(this).live(name + '.rails', fn);
}
+ $.fn.ifTargetOn = function(name, fn) {
+ $(this).on(name, function(event) {
+ if (this == event.target) fn($(this));
+ });
+ }
+
$('a[data-confirm], a[data-method], a[data-remote]').on('click', function(e) {
var link = $(this);
if (!allowAction(link)) return false;
@@ -167,11 +173,6 @@
register(button);
});
- $('form').on('ajax:beforeSend', function(event) {
- if (this == event.target) disableFormElements($(this));
- });
-
- $('form').on('ajax:complete', function(event) {
- if (this == event.target) enableFormElements($(this));
- });
+ $('form').ifTargetOn('ajax:beforeSend', disableFormElements);
+ $('form').ifTargetOn('ajax:complete', enableFormElements);
})( jQuery );
From ce01aadd15ff69d4f65a183db14566b7a75fdf5e Mon Sep 17 00:00:00 2001
From: Diego Carrion
Date: Sat, 19 Feb 2011 23:36:31 -0300
Subject: [PATCH 06/17] removed forgotten comment
---
src/rails.js | 1 -
1 file changed, 1 deletion(-)
diff --git a/src/rails.js b/src/rails.js
index c16fc96f..b151d12b 100644
--- a/src/rails.js
+++ b/src/rails.js
@@ -169,7 +169,6 @@
$('form input[type=submit], form button[type=submit], form button:not([type])').on('click', function() {
var button = $(this);
if (!allowAction(button)) return false;
- // register the pressed submit button
register(button);
});
From 60117d642bd56fbfcd04e90e830527451aa46cec Mon Sep 17 00:00:00 2001
From: Diego Carrion
Date: Sat, 19 Feb 2011 23:42:29 -0300
Subject: [PATCH 07/17] changed return false in favor of event.preventDefault,
as what we really want is to prevent the default event of the elements and
not to stop the event chain
---
src/rails.js | 51 +++++++++++++++++++++++++++------------------------
1 file changed, 27 insertions(+), 24 deletions(-)
diff --git a/src/rails.js b/src/rails.js
index b151d12b..fa44e8e9 100644
--- a/src/rails.js
+++ b/src/rails.js
@@ -139,37 +139,40 @@
$('a[data-confirm], a[data-method], a[data-remote]').on('click', function(e) {
var link = $(this);
- if (!allowAction(link)) return false;
-
- if (link.data('remote') != undefined) {
- handleRemote(link);
- return false;
- } else if (link.data('method')) {
- handleMethod(link);
- return false;
- }
+ if (allowAction(link)) {
+ if (link.data('remote') != undefined) {
+ handleRemote(link);
+ e.preventDefault();
+ } else if (link.data('method')) {
+ handleMethod(link);
+ e.preventDefault();
+ }
+ } else {
+ e.preventDefault();
+ }
});
$('form').on('submit', function(e) {
var form = $(this), remote = form.data('remote') != undefined;
- if (!allowAction(form)) return false;
-
- // skip other logic when required values are missing
- if (requiredValuesMissing(form)) return !remote;
-
- if (remote) {
- handleRemote(form);
- return false;
- } else {
- // slight timeout so that the submit button gets properly serialized
- setTimeout(function(){ disableFormElements(form) }, 13);
- }
+ if (allowAction(form)) {
+ // skip other logic when required values are missing
+ if (requiredValuesMissing(form)) return !remote;
+
+ if (remote) {
+ handleRemote(form);
+ e.preventDefault();
+ } else {
+ // slight timeout so that the submit button gets properly serialized
+ setTimeout(function(){ disableFormElements(form) }, 13);
+ }
+ } else {
+ e.preventDefault();
+ }
});
- $('form input[type=submit], form button[type=submit], form button:not([type])').on('click', function() {
+ $('form input[type=submit], form button[type=submit], form button:not([type])').on('click', function(event) {
var button = $(this);
- if (!allowAction(button)) return false;
- register(button);
+ allowAction(button) ? register(button) : event.preventDefault();
});
$('form').ifTargetOn('ajax:beforeSend', disableFormElements);
From af56c2dd1c1346389a776503e26aa3155328c853 Mon Sep 17 00:00:00 2001
From: Diego Carrion
Date: Sat, 19 Feb 2011 23:49:34 -0300
Subject: [PATCH 08/17] dryed code that execute an action if the event is
allowed
---
src/rails.js | 55 ++++++++++++++++++++++++----------------------------
1 file changed, 25 insertions(+), 30 deletions(-)
diff --git a/src/rails.js b/src/rails.js
index fa44e8e9..07e79df2 100644
--- a/src/rails.js
+++ b/src/rails.js
@@ -137,44 +137,39 @@
});
}
- $('a[data-confirm], a[data-method], a[data-remote]').on('click', function(e) {
- var link = $(this);
- if (allowAction(link)) {
- if (link.data('remote') != undefined) {
- handleRemote(link);
- e.preventDefault();
- } else if (link.data('method')) {
- handleMethod(link);
- e.preventDefault();
- }
- } else {
- e.preventDefault();
+ $.fn.ifAllowedOn = function(name, fn) {
+ $(this).on(name, function(event) {
+ var element = $(this);
+ allowAction(element) ? fn(element, event) : event.preventDefault();
+ });
+ }
+
+ $('a[data-confirm], a[data-method], a[data-remote]').ifAllowedOn('click', function(link, event) {
+ if (link.data('remote') != undefined) {
+ handleRemote(link);
+ event.preventDefault();
+ } else if (link.data('method')) {
+ handleMethod(link);
+ event.preventDefault();
}
});
- $('form').on('submit', function(e) {
- var form = $(this), remote = form.data('remote') != undefined;
- if (allowAction(form)) {
- // skip other logic when required values are missing
- if (requiredValuesMissing(form)) return !remote;
-
- if (remote) {
+ $('form').ifAllowedOn('submit', function(form, event) {
+ if (form.data('remote') != undefined) {
+ // skip other logic when required values are missing
+ if (requiredValuesMissing(form)) {
+ event.preventDefault();
+ } else {
handleRemote(form);
- e.preventDefault();
- } else {
- // slight timeout so that the submit button gets properly serialized
- setTimeout(function(){ disableFormElements(form) }, 13);
- }
+ event.preventDefault();
+ }
} else {
- e.preventDefault();
+ // slight timeout so that the submit button gets properly serialized
+ setTimeout(function(){ disableFormElements(form) }, 13);
}
});
- $('form input[type=submit], form button[type=submit], form button:not([type])').on('click', function(event) {
- var button = $(this);
- allowAction(button) ? register(button) : event.preventDefault();
- });
-
+ $('form input[type=submit], form button[type=submit], form button:not([type])').ifAllowedOn('click', register)
$('form').ifTargetOn('ajax:beforeSend', disableFormElements);
$('form').ifTargetOn('ajax:complete', enableFormElements);
})( jQuery );
From b36c7d90df158a38536321633e549217998a04de Mon Sep 17 00:00:00 2001
From: Diego Carrion
Date: Sun, 20 Feb 2011 14:16:56 -0300
Subject: [PATCH 09/17] removed some ifs, instead of selecting a lot of
elements and then verifying the kind to know what behaviour to apply, select
the elements of an specific kind and then apply the behaviour
---
src/rails.js | 38 +++++++++++++++++++-------------------
1 file changed, 19 insertions(+), 19 deletions(-)
diff --git a/src/rails.js b/src/rails.js
index 07e79df2..da794fe3 100644
--- a/src/rails.js
+++ b/src/rails.js
@@ -144,31 +144,31 @@
});
}
- $('a[data-confirm], a[data-method], a[data-remote]').ifAllowedOn('click', function(link, event) {
- if (link.data('remote') != undefined) {
- handleRemote(link);
- event.preventDefault();
- } else if (link.data('method')) {
- handleMethod(link);
- event.preventDefault();
- }
+ $('a[data-remote]').ifAllowedOn('click', function(link, event) {
+ handleRemote(link);
+ event.preventDefault();
+ });
+
+ $('a[data-method]:not([data-remote])').ifAllowedOn('click', function(link, event) {
+ handleMethod(link);
+ event.preventDefault();
});
- $('form').ifAllowedOn('submit', function(form, event) {
- if (form.data('remote') != undefined) {
- // skip other logic when required values are missing
- if (requiredValuesMissing(form)) {
- event.preventDefault();
- } else {
- handleRemote(form);
- event.preventDefault();
- }
+ $('form[data-remote]').ifAllowedOn('submit', function(form, event) {
+ // skip other logic when required values are missing
+ if (requiredValuesMissing(form)) {
+ event.preventDefault();
} else {
- // slight timeout so that the submit button gets properly serialized
- setTimeout(function(){ disableFormElements(form) }, 13);
+ handleRemote(form);
+ event.preventDefault();
}
});
+ $('form:not([data-remote])').ifAllowedOn('submit', function(form, event) {
+ // slight timeout so that the submit button gets properly serialized
+ setTimeout(function(){ disableFormElements(form) }, 13);
+ });
+
$('form input[type=submit], form button[type=submit], form button:not([type])').ifAllowedOn('click', register)
$('form').ifTargetOn('ajax:beforeSend', disableFormElements);
$('form').ifTargetOn('ajax:complete', enableFormElements);
From 5f29cdbcb3fcaed46c6e7ae4181876ae728ff0a5 Mon Sep 17 00:00:00 2001
From: Diego Carrion
Date: Sun, 20 Feb 2011 14:41:34 -0300
Subject: [PATCH 10/17] moved event.preventDefault to handleRemote and
handleMethod, as this go together always
---
src/rails.js | 20 +++++++-------------
1 file changed, 7 insertions(+), 13 deletions(-)
diff --git a/src/rails.js b/src/rails.js
index da794fe3..c23b8fc7 100644
--- a/src/rails.js
+++ b/src/rails.js
@@ -34,7 +34,7 @@
}
// Submits "remote" forms and links with ajax
- function handleRemote(element) {
+ function handleRemote(element, event) {
var method, url, data,
dataType = element.data('type') || ($.ajaxSettings && $.ajaxSettings.dataType);
@@ -73,11 +73,12 @@
element.trigger('ajax:error', [xhr, status, error]);
}
});
+ event.preventDefault();
}
// Handles "data-method" on links such as:
// Delete
- function handleMethod(link) {
+ function handleMethod(link, event) {
var href = link.attr('href'),
method = link.data('method'),
csrf_token = $('meta[name=csrf-token]').attr('content'),
@@ -91,6 +92,7 @@
form.hide().append(metadata_input).appendTo('body');
form.submit();
+ event.preventDefault();
}
function disableFormElements(form) {
@@ -144,23 +146,15 @@
});
}
- $('a[data-remote]').ifAllowedOn('click', function(link, event) {
- handleRemote(link);
- event.preventDefault();
- });
-
- $('a[data-method]:not([data-remote])').ifAllowedOn('click', function(link, event) {
- handleMethod(link);
- event.preventDefault();
- });
+ $('a[data-remote]').ifAllowedOn('click', handleRemote);
+ $('a[data-method]:not([data-remote])').ifAllowedOn('click', handleMethod);
$('form[data-remote]').ifAllowedOn('submit', function(form, event) {
// skip other logic when required values are missing
if (requiredValuesMissing(form)) {
event.preventDefault();
} else {
- handleRemote(form);
- event.preventDefault();
+ handleRemote(form, event);
}
});
From 86f09008d70d801e2f64ebd313faa18a5c4c384d Mon Sep 17 00:00:00 2001
From: Diego Carrion
Date: Sun, 20 Feb 2011 14:43:21 -0300
Subject: [PATCH 11/17] dryied code
---
src/rails.js | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/src/rails.js b/src/rails.js
index c23b8fc7..710ffcc7 100644
--- a/src/rails.js
+++ b/src/rails.js
@@ -134,7 +134,7 @@
}
$.fn.ifTargetOn = function(name, fn) {
- $(this).on(name, function(event) {
+ $(this).on('ajax:' + name, function(event) {
if (this == event.target) fn($(this));
});
}
@@ -164,6 +164,6 @@
});
$('form input[type=submit], form button[type=submit], form button:not([type])').ifAllowedOn('click', register)
- $('form').ifTargetOn('ajax:beforeSend', disableFormElements);
- $('form').ifTargetOn('ajax:complete', enableFormElements);
+ $('form').ifTargetOn('beforeSend', disableFormElements);
+ $('form').ifTargetOn('complete', enableFormElements);
})( jQuery );
From 0524d7ae91ab5eb321d35ae3d40d3579761e8517 Mon Sep 17 00:00:00 2001
From: Diego Carrion
Date: Sun, 20 Feb 2011 15:36:20 -0300
Subject: [PATCH 12/17] refactored disableFormElements and enableFormElements,
removed .each in favor of .val
---
src/rails.js | 16 ++++++----------
1 file changed, 6 insertions(+), 10 deletions(-)
diff --git a/src/rails.js b/src/rails.js
index 710ffcc7..e44dc2c7 100644
--- a/src/rails.js
+++ b/src/rails.js
@@ -96,19 +96,15 @@
}
function disableFormElements(form) {
- form.find('input[data-disable-with]').each(function() {
- var input = $(this);
- input.data('ujs:enable-with', input.val())
- .val(input.data('disable-with'))
- .attr('disabled', 'disabled');
- });
+ form.find('input[data-disable-with]').attr('disabled', 'disabled').val(function(index, value) {
+ return $(this).data('ujs:enable-with', value).data('disable-with');
+ });
}
function enableFormElements(form) {
- form.find('input[data-disable-with]').each(function() {
- var input = $(this);
- input.val(input.data('ujs:enable-with')).removeAttr('disabled');
- });
+ form.find('input[data-disable-with]').removeAttr('disabled').val(function() {
+ return $(this).data('ujs:enable-with');
+ });
}
function allowAction(element) {
From b593e719929664a5036d4d33cf50d326048ff7e9 Mon Sep 17 00:00:00 2001
From: Diego Carrion
Date: Sun, 20 Feb 2011 15:48:34 -0300
Subject: [PATCH 13/17] dryed code by chained two methods
---
src/rails.js | 7 +++----
1 file changed, 3 insertions(+), 4 deletions(-)
diff --git a/src/rails.js b/src/rails.js
index e44dc2c7..f66eb2c4 100644
--- a/src/rails.js
+++ b/src/rails.js
@@ -126,11 +126,11 @@
}
$.fn.on = function(name, fn) {
- $(this).live(name + '.rails', fn);
+ return $(this).live(name + '.rails', fn);
}
$.fn.ifTargetOn = function(name, fn) {
- $(this).on('ajax:' + name, function(event) {
+ return $(this).on('ajax:' + name, function(event) {
if (this == event.target) fn($(this));
});
}
@@ -160,6 +160,5 @@
});
$('form input[type=submit], form button[type=submit], form button:not([type])').ifAllowedOn('click', register)
- $('form').ifTargetOn('beforeSend', disableFormElements);
- $('form').ifTargetOn('complete', enableFormElements);
+ $('form').ifTargetOn('beforeSend', disableFormElements).ifTargetOn('complete', enableFormElements);
})( jQuery );
From cbc01d013d090d9ad100fe3c44e427bb9ceca1c1 Mon Sep 17 00:00:00 2001
From: Diego Carrion
Date: Sun, 20 Feb 2011 16:07:21 -0300
Subject: [PATCH 14/17] refactored code that validates if required fields are
missing
---
src/rails.js | 19 +++++--------------
1 file changed, 5 insertions(+), 14 deletions(-)
diff --git a/src/rails.js b/src/rails.js
index f66eb2c4..04521fd1 100644
--- a/src/rails.js
+++ b/src/rails.js
@@ -112,19 +112,15 @@
return !message || (fire(element, 'confirm') && confirm(message));
}
- function requiredValuesMissing(form) {
- var missing = false;
- form.find('input[name][required]').each(function() {
- if (!$(this).val()) missing = true;
- });
- return missing;
- }
-
function register(button) {
var name = button.attr('name'), data = name ? {name:name, value:button.val()} : null;
button.closest('form').data('ujs:submit-button', data);
}
+ function isMissing() {
+ return !$(this).val();
+ }
+
$.fn.on = function(name, fn) {
return $(this).live(name + '.rails', fn);
}
@@ -146,12 +142,7 @@
$('a[data-method]:not([data-remote])').ifAllowedOn('click', handleMethod);
$('form[data-remote]').ifAllowedOn('submit', function(form, event) {
- // skip other logic when required values are missing
- if (requiredValuesMissing(form)) {
- event.preventDefault();
- } else {
- handleRemote(form, event);
- }
+ form.find('input[required]').filter(isMissing).length > 0 ? event.preventDefault() : handleRemote(form, event);
});
$('form:not([data-remote])').ifAllowedOn('submit', function(form, event) {
From 0cff3094af0c2f4623534fe0f9e1da518d7681f3 Mon Sep 17 00:00:00 2001
From: Diego Carrion
Date: Sun, 20 Feb 2011 17:24:24 -0300
Subject: [PATCH 15/17] removed if by dividing handleRemote into
handleRemoteForm and handleRemoteLink, as each one has a different behaviour
---
src/rails.js | 82 +++++++++++++++++++++++++---------------------------
1 file changed, 39 insertions(+), 43 deletions(-)
diff --git a/src/rails.js b/src/rails.js
index 04521fd1..708d89fb 100644
--- a/src/rails.js
+++ b/src/rails.js
@@ -33,49 +33,45 @@
return event.result !== false;
}
- // Submits "remote" forms and links with ajax
- function handleRemote(element, event) {
- var method, url, data,
- dataType = element.data('type') || ($.ajaxSettings && $.ajaxSettings.dataType);
-
- if (element.is('form')) {
- method = element.attr('method');
- url = element.attr('action');
- data = element.serializeArray();
- // memoized value from clicked submit button
- var button = element.data('ujs:submit-button');
- if (button) {
- data.push(button);
- element.data('ujs:submit-button', null);
- }
- } else {
- method = element.data('method');
- url = element.attr('href');
- data = null;
- }
-
- $.ajax({
- url: url, type: method || 'GET', data: data, dataType: dataType,
- // stopping the "ajax:beforeSend" event will cancel the ajax request
- beforeSend: function(xhr, settings) {
- if (settings.dataType === undefined) {
- xhr.setRequestHeader('accept', '*/*;q=0.5, ' + settings.accepts.script);
- }
- return fire(element, 'ajax:beforeSend', [xhr, settings]);
- },
- success: function(data, status, xhr) {
- element.trigger('ajax:success', [data, status, xhr]);
- },
- complete: function(xhr, status) {
- element.trigger('ajax:complete', [xhr, status]);
- },
- error: function(xhr, status, error) {
- element.trigger('ajax:error', [xhr, status, error]);
- }
- });
- event.preventDefault();
+ function handleRemoteLink(link, event) {
+ ajax(link, link.attr('href'), link.data('method'), null, event);
}
+ function handleRemoteForm(form, event) {
+ var data = form.serializeArray();
+ // memoized value from clicked submit button
+ var button = form.data('ujs:submit-button');
+ if (button) {
+ data.push(button);
+ form.data('ujs:submit-button', null);
+ }
+ ajax(form, form.attr('action'), form.attr('method'), data, event);
+ }
+
+ function ajax(element, url, method, data, event) {
+ var dataType = element.data('type') || ($.ajaxSettings && $.ajaxSettings.dataType);
+ $.ajax({
+ url: url, type: method || 'GET', data: data, dataType: dataType,
+ // stopping the "ajax:beforeSend" event will cancel the ajax request
+ beforeSend: function(xhr, settings) {
+ if (settings.dataType === undefined) {
+ xhr.setRequestHeader('accept', '*/*;q=0.5, ' + settings.accepts.script);
+ }
+ return fire(element, 'ajax:beforeSend', [xhr, settings]);
+ },
+ success: function(data, status, xhr) {
+ element.trigger('ajax:success', [data, status, xhr]);
+ },
+ complete: function(xhr, status) {
+ element.trigger('ajax:complete', [xhr, status]);
+ },
+ error: function(xhr, status, error) {
+ element.trigger('ajax:error', [xhr, status, error]);
+ }
+ });
+ event.preventDefault();
+ }
+
// Handles "data-method" on links such as:
// Delete
function handleMethod(link, event) {
@@ -138,11 +134,11 @@
});
}
- $('a[data-remote]').ifAllowedOn('click', handleRemote);
+ $('a[data-remote]').ifAllowedOn('click', handleRemoteLink);
$('a[data-method]:not([data-remote])').ifAllowedOn('click', handleMethod);
$('form[data-remote]').ifAllowedOn('submit', function(form, event) {
- form.find('input[required]').filter(isMissing).length > 0 ? event.preventDefault() : handleRemote(form, event);
+ form.find('input[required]').filter(isMissing).length > 0 ? event.preventDefault() : handleRemoteForm(form, event);
});
$('form:not([data-remote])').ifAllowedOn('submit', function(form, event) {
From 3f60112fef850401354882f0a9c231e2cdccfed9 Mon Sep 17 00:00:00 2001
From: Diego Carrion
Date: Sun, 20 Feb 2011 17:42:03 -0300
Subject: [PATCH 16/17] refactored code, validating if the form is ok is part
of handleRemoteForm
---
src/rails.js | 22 +++++++++++-----------
1 file changed, 11 insertions(+), 11 deletions(-)
diff --git a/src/rails.js b/src/rails.js
index 708d89fb..b0314567 100644
--- a/src/rails.js
+++ b/src/rails.js
@@ -38,14 +38,17 @@
}
function handleRemoteForm(form, event) {
- var data = form.serializeArray();
- // memoized value from clicked submit button
- var button = form.data('ujs:submit-button');
- if (button) {
- data.push(button);
- form.data('ujs:submit-button', null);
+ if (form.find('input[required]').filter(isMissing).length == 0) {
+ var data = form.serializeArray();
+ // memoized value from clicked submit button
+ var button = form.data('ujs:submit-button');
+ if (button) {
+ data.push(button);
+ form.data('ujs:submit-button', null);
+ }
+ ajax(form, form.attr('action'), form.attr('method'), data, event);
}
- ajax(form, form.attr('action'), form.attr('method'), data, event);
+ event.preventDefault();
}
function ajax(element, url, method, data, event) {
@@ -136,10 +139,7 @@
$('a[data-remote]').ifAllowedOn('click', handleRemoteLink);
$('a[data-method]:not([data-remote])').ifAllowedOn('click', handleMethod);
-
- $('form[data-remote]').ifAllowedOn('submit', function(form, event) {
- form.find('input[required]').filter(isMissing).length > 0 ? event.preventDefault() : handleRemoteForm(form, event);
- });
+ $('form[data-remote]').ifAllowedOn('submit', handleRemoteForm);
$('form:not([data-remote])').ifAllowedOn('submit', function(form, event) {
// slight timeout so that the submit button gets properly serialized
From fa139fd2203a893a4c3a0ca92a6a9c3192a85fa8 Mon Sep 17 00:00:00 2001
From: Diego Carrion
Date: Sun, 20 Feb 2011 18:04:34 -0300
Subject: [PATCH 17/17] dryed some code
---
src/rails.js | 16 +++++++---------
1 file changed, 7 insertions(+), 9 deletions(-)
diff --git a/src/rails.js b/src/rails.js
index b0314567..874ffd5b 100644
--- a/src/rails.js
+++ b/src/rails.js
@@ -51,6 +51,10 @@
event.preventDefault();
}
+ function trigger(element, name) {
+ return function() element.trigger('ajax:' + name, arguments);
+ }
+
function ajax(element, url, method, data, event) {
var dataType = element.data('type') || ($.ajaxSettings && $.ajaxSettings.dataType);
$.ajax({
@@ -62,15 +66,9 @@
}
return fire(element, 'ajax:beforeSend', [xhr, settings]);
},
- success: function(data, status, xhr) {
- element.trigger('ajax:success', [data, status, xhr]);
- },
- complete: function(xhr, status) {
- element.trigger('ajax:complete', [xhr, status]);
- },
- error: function(xhr, status, error) {
- element.trigger('ajax:error', [xhr, status, error]);
- }
+ success: trigger(element, 'success'),
+ complete: trigger(element, 'complete'),
+ error: trigger(element, 'error')
});
event.preventDefault();
}