95
95
} ;
96
96
97
97
/* calculate error message position relative to the input */
98
- function getPosition ( trigger , el , conf ) {
98
+ function getPosition ( trigger , el , conf ) {
99
+
100
+ // Get the first element in the selector set
101
+ el = $ ( el ) . first ( ) || el ;
99
102
100
103
// get origin top/left position
101
- var top = trigger . offset ( ) . top ,
102
- left = trigger . offset ( ) . left ,
103
- pos = conf . position . split ( / , ? \s + / ) ,
104
- y = pos [ 0 ] ,
105
- x = pos [ 1 ] ;
104
+ var top = trigger . offset ( ) . top ,
105
+ left = trigger . offset ( ) . left ,
106
+ pos = conf . position . split ( / , ? \s + / ) ,
107
+ y = pos [ 0 ] ,
108
+ x = pos [ 1 ] ;
106
109
107
110
top -= el . outerHeight ( ) - conf . offset [ 0 ] ;
108
111
left += trigger . outerWidth ( ) + conf . offset [ 1 ] ;
256
259
return p . test ( el . val ( ) ) ;
257
260
} ) ;
258
261
262
+ v . fn ( ":radio" , "Please select an option." , function ( el ) {
263
+ var checked = false ;
264
+ var els = $ ( "[name=" + el . attr ( "name" ) + "]" ) . each ( function ( i , el ) {
265
+ if ( $ ( el ) . is ( ":checked" ) ) {
266
+ checked = true ;
267
+ }
268
+ } ) ;
269
+ return ( checked ) ? true : false ;
270
+ } ) ;
259
271
260
272
function Validator ( inputs , form , conf ) {
261
273
262
274
// private variables
263
275
var self = this ,
264
- fire = form . add ( self ) ;
276
+ fire = form . add ( self ) ;
265
277
266
278
// make sure there are input fields available
267
279
inputs = inputs . not ( ":button, :image, :reset, :submit" ) ;
388
400
389
401
els = els || inputs ;
390
402
els = els . not ( ":disabled" ) ;
403
+
404
+ // filter duplicate elements by name
405
+ var names = { } ;
406
+ els = els . filter ( function ( ) {
407
+ var name = $ ( this ) . attr ( "name" ) ;
408
+ if ( ! names [ name ] ) {
409
+ names [ name ] = true ;
410
+ return $ ( this ) ;
411
+ }
412
+ } ) ;
413
+
391
414
if ( ! els . length ) { return true ; }
392
415
393
416
e = e || $ . Event ( ) ;
401
424
var errs = [ ] ;
402
425
403
426
// loop trough the inputs
404
- els . not ( ":radio:not(:checked)" ) . each ( function ( ) {
427
+ els . each ( function ( ) {
405
428
406
429
// field and it's error message container
407
430
var msgs = [ ] ,
545
568
} ) ;
546
569
}
547
570
548
- // checkboxes, selects and radios are checked separately
571
+ // checkboxes and selects are checked separately
549
572
inputs . filter ( ":checkbox, select" ) . filter ( "[required]" ) . bind ( "change.V" , function ( e ) {
550
573
var el = $ ( this ) ;
551
574
if ( this . checked || ( el . is ( "select" ) && $ ( this ) . val ( ) ) ) {
552
575
effects [ conf . effect ] [ 1 ] . call ( self , el , e ) ;
553
576
}
554
- } ) ;
555
-
556
- var radios = inputs . filter ( ":radio" ) . change ( function ( e ) {
557
- self . checkValidity ( radios , e ) ;
577
+ } ) ;
578
+
579
+ // get radio groups by name
580
+ inputs . filter ( ":radio[required]" ) . bind ( "change.V" , function ( e ) {
581
+ var els = $ ( "[name=" + $ ( e . srcElement ) . attr ( "name" ) + "]" ) ;
582
+ if ( ( els != null ) && ( els . length != 0 ) ) {
583
+ self . checkValidity ( els , e ) ;
584
+ }
558
585
} ) ;
559
586
560
587
// reposition tooltips when window is resized
561
588
$ ( window ) . resize ( function ( ) {
562
589
self . reflow ( ) ;
563
590
} ) ;
591
+
564
592
}
565
593
566
594
593
621
594
622
} ;
595
623
596
- } ) ( jQuery ) ;
597
-
598
-
624
+ } ) ( jQuery ) ;
0 commit comments