$(function(){ $(document).on('submit', 'form[validate=true]', validate); $(document).on('click', 'input[formaction]', function(e){ var form = $(e.target).parents('form'); $(form).attr('action', $(e.target).attr('formaction')); }); }); function validate(e){ var form = $(e.target); $(form).find('[type=submit]').attr('disabled', 'disabled'); if(form.data('validated') === true){ return true; } $.post(form.attr('action') + '/validate', $(e.target).serialize(), function(data){ $(form).find('[type=submit]').removeAttr('disabled'); // clear all error messages $('.error').text(''); if($.isEmptyObject(data)){ form.data('validated', true); form.submit(); form.data('validated', false); } else { form.data('validated', false); displayErrors(data, form); } }, 'json'); return false; } function displayErrors(data){ $.each(data, function(key, value){ $('#error-' + key.split(".").join("_")).text(value); }); }