diff --git a/src/core.js b/src/core.js index fdb3255f9..1d8f23aac 100644 --- a/src/core.js +++ b/src/core.js @@ -344,9 +344,11 @@ $.extend($.validator, { "[type='number'], [type='search'] ,[type='tel'], [type='url'], " + "[type='email'], [type='datetime'], [type='date'], [type='month'], " + "[type='week'], [type='time'], [type='datetime-local'], " + - "[type='range'], [type='color'] ", + "[type='range'], [type='color'], [type='radio'], [type='checkbox']", "focusin focusout keyup", delegate) - .validateDelegate("[type='radio'], [type='checkbox'], select, option", "click", delegate); + // Support: Chrome, oldIE + // "select" is provided as event.target when clicking a option + .validateDelegate("select, option", "click", delegate); if ( this.settings.invalidHandler ) { $(this.currentForm).bind("invalid-form.validate", this.settings.invalidHandler); diff --git a/test/test.js b/test/test.js index c21c2941a..05b5a3f45 100644 --- a/test/test.js +++ b/test/test.js @@ -311,6 +311,45 @@ test("submitHandler keeps submitting button", function() { $("#userForm").submit(); }); +asyncTest("validation triggered on radio/checkbox when using keyboard", function() { + expect( 1 ); + var input, i, events, triggeredEvents = 0; + + $("#form").validate({ + onfocusin: function() { + triggeredEvents++; + }, + onfocusout: function() { + triggeredEvents++; + }, + onkeyup: function() { + triggeredEvents++; + } + }); + + events = [ + $.Event("focusin"), + $.Event("focusout"), + $.Event("keyup") + ]; + + input = $("#form :radio:first"); + for(i = 0; i < events.length; i++) { + input.trigger(events[i]); + } + + input = $("#form :checkbox:first"); + for(i = 0; i < events.length; i++) { + input.trigger(events[i]); + } + + setTimeout(function() { + // assert all event handlers fired + equal(6, triggeredEvents); + start(); + }, 50); +}); + test("showErrors()", function() { expect( 4 ); var errorLabel = $("#errorFirstname").hide(),