I think part of it depends how "quickly" you want to validate. What I mean by that is if you want to validate as the user is using the form, or upon submission. Traditionally I do it on submission because it really simplifies the whole thing and keeps code to a minimum.
For validating as the user types, myself and coworkers have been successful with the 'keyup' event for textareas and text fields. Checkboxes, radio buttons, and selects we have used 'change'. It would be prudent to investigate the subtle nuisances and differences between 'keyup', 'keydown', and 'keypress' as they are all very similar but all have "gotchas". We also made sure to recheck the form upon submission, and then check again on the server-side, which I have no doubt you are doing.
You may also want to take a look at the 'paste' event. If you are restricting for example a phone number field and only accepting numbers, the user would still be able to copy and paste invalid input into the text field. And the pasted text is not standard across browsers, meaning you will have to do some checking to get the proper pasted value (even with jQuery). We have used this in a recent project:
function vendorDebtPaste(event) {
var currentValue = $(this).val();
var pastedValue;
if(window.clipboardData) { // IE
pastedValue = window.clipboardData.getData('Text');
}
else { // Real browsers
pastedValue = event.originalEvent.clipboardData.getData('text');
}
// do what you need to do
}
Lastly, if you don't have to support old browsers (<= IE 9) you can look into HTML5 form validation. There are also two pseudo classes in CSS you can use to style valid and invalid elements, :valid and :invalid.
Hope that helps!