Skip to content

Instantly share code, notes, and snippets.

@uestla
Last active December 10, 2015 23:08
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save uestla/4507336 to your computer and use it in GitHub Desktop.
Save uestla/4507336 to your computer and use it in GitHub Desktop.
Nette+jQuery live form validation
(function ($, window) {
if (!window.Nette) {
console.log('Error: Nette form validation not loaded.');
return ;
}
var live;
window.live = live = {
orig: {
validateControl: window.Nette.validateControl,
initForm: window.Nette.initForm
},
events: {
'afterValidate': []
},
on: function (name, callback) {
this.events[name].push( callback );
return this;
},
fire: function (name) {
var args = Array.prototype.slice.call( arguments );
args.shift();
$.each(this.events[name], function (key, val) {
val.apply(null, args);
});
return this;
},
removeError: function (elem) {
elem.removeClass('error').next('p.error').remove();
return this;
},
createErrorElement: function (message) {
return $('<p>', {
'class': 'error',
'text': message
});
},
timeout: null
};
window.Nette.addError = function (elem, message) {
$(elem).addClass('error').after( live.createErrorElement(message) );
};
window.Nette.validateControl = function(elem, rules, onlyCheck) {
var jQel = $(elem);
!onlyCheck && live.removeError( jQel );
var valid = live.orig.validateControl(elem, rules, onlyCheck);
!valid && jQel.closest('form').data('nette-valid', false);
return valid;
};
window.Nette.validateForm = function (sender, onlyCheck) {
onlyCheck = onlyCheck || false;
var form = sender.form || sender, valid = true;
if (!form['nette-submittedBy'] || form['nette-submittedBy'].getAttribute('formnovalidate') === null) {
for (var i = 0; i < form.elements.length; i++) {
var elem = form.elements[i];
if (!(elem.nodeName.toLowerCase() in {input: 1, select: 1, textarea: 1}) ||
(elem.type in {hidden: 1, submit: 1, image: 1, reset: 1}) ||
elem.disabled || elem.readonly
) {
continue;
}
if ($(elem).hasClass('err') || !window.Nette.validateControl(elem, null, onlyCheck)) {
valid = false;
}
}
}
var jQform = $(form);
jQform.data('nette-valid', valid);
live.fire( 'afterValidate', jQform );
return valid;
};
window.Nette.initForm = function (form) {
live.orig.initForm( form );
var handler = function (event) {
window.Nette.validateControl( event.target );
window.Nette.validateForm( form, true );
};
for (var i = 0; i < form.elements.length; i++) {
$(form.elements[i]).on('change.live blur.live', handler)
.on('keydown.live', function (event) {
live.timeout && window.clearTimeout( live.timeout );
live.removeError( el );
})
.on('keyup.live', function (event) {
live.timeout = window.setTimeout( function () { handler(event); }, 320 );
});
}
};
})(jQuery, window);
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment