|
31 | 31 |
|
32 | 32 | // Check if a validator for this form was already created |
33 | 33 | var validator = $.data( this[ 0 ], "validator" ); |
34 | | - |
35 | 34 | if ( validator ) { |
36 | 35 | return validator; |
37 | 36 | } |
|
236 | 235 | // https://jqueryvalidation.org/filled-selector/ |
237 | 236 | filled: function( a ) { |
238 | 237 | var val = $( a ).val(); |
239 | | - |
240 | 238 | return val !== null && !!trim( "" + val ); |
241 | 239 | }, |
242 | 240 |
|
|
258 | 256 | if ( arguments.length === 1 ) { |
259 | 257 | return function() { |
260 | 258 | var args = $.makeArray( arguments ); |
261 | | - |
262 | 259 | args.unshift( source ); |
263 | 260 | return $.validator.format.apply( this, args ); |
264 | 261 | }; |
|
407 | 404 | this.reset(); |
408 | 405 |
|
409 | 406 | var currentForm = this.currentForm, |
410 | | - groups = this.groups = {}, |
| 407 | + groups = ( this.groups = {} ), |
411 | 408 | rules; |
412 | | - |
413 | 409 | $.each( this.settings.groups, function( key, value ) { |
414 | 410 | if ( typeof value === "string" ) { |
415 | 411 | value = value.split( /\s/ ); |
|
424 | 420 | } ); |
425 | 421 |
|
426 | 422 | function delegate( event ) { |
427 | | - var isContentEditable = typeof $( this ).attr( "contenteditable" ) !== "undefined" |
428 | | - && $( this ).attr( "contenteditable" ) !== "false"; |
| 423 | + var isContentEditable = typeof $( this ).attr( "contenteditable" ) !== "undefined" && $( this ).attr( "contenteditable" ) !== "false"; |
429 | 424 |
|
430 | 425 | // Set form expando on contenteditable |
431 | 426 | if ( !this.form && isContentEditable ) { |
|
442 | 437 | var validator = $.data( this.form, "validator" ), |
443 | 438 | eventType = "on" + event.type.replace( /^validate/, "" ), |
444 | 439 | settings = validator.settings; |
445 | | - |
446 | 440 | if ( settings[ eventType ] && !$( this ).is( settings.ignore ) ) { |
447 | 441 | settings[ eventType ].call( validator, this, event ); |
448 | 442 | } |
449 | 443 | } |
450 | 444 |
|
451 | 445 | $( this.currentForm ) |
452 | 446 | .on( "focusin.validate focusout.validate keyup.validate", |
453 | | - ":text, [type='password'], [type='file'], " + |
454 | | - "select, textarea, [type='number'], [type='search'], " + |
455 | | - "[type='tel'], [type='url'], [type='email'], " + |
456 | | - "[type='datetime'], [type='date'], [type='month'], " + |
457 | | - "[type='week'], [type='time'], [type='datetime-local'], " + |
458 | | - "[type='range'], [type='color'], " + |
| 447 | + ":text, [type='password'], [type='file'], select, textarea, [type='number'], [type='search'], " + |
| 448 | + "[type='tel'], [type='url'], [type='email'], [type='datetime'], [type='date'], [type='month'], " + |
| 449 | + "[type='week'], [type='time'], [type='datetime-local'], [type='range'], [type='color'], " + |
459 | 450 | "[type='radio'], [type='checkbox'], [contenteditable], [type='button']", delegate ) |
460 | 451 |
|
461 | 452 | // Support: Chrome, oldIE |
|
480 | 471 | }, |
481 | 472 |
|
482 | 473 | checkForm: function() { |
483 | | - if ($(this.currentForm).find('.bundle').length > 0 |
484 | | - && $(this.currentForm).find('input[type="checkbox"]').length > 0) { |
485 | | - return this.checkBundleForm(); |
486 | | - } |
487 | | - return this.checkDefaultForm(); |
488 | | - }, |
489 | | - |
490 | | - checkBundleForm: function() { |
491 | | - var optionNumber, elements, optionMap, el, option; |
492 | | - |
493 | | - this.prepareForm(); |
494 | | - elements = this.elements(); |
495 | | - optionMap = {}; |
496 | | - for (var i = 0; i < elements.length; i++) { |
497 | | - el = elements[i]; |
498 | | - optionNumber = el.id.split('-')[2]; |
499 | | - if (!optionMap[optionNumber]) { |
500 | | - optionMap[optionNumber] = []; |
501 | | - } |
502 | | - optionMap[optionNumber].push(el); |
503 | | - } |
504 | | - for (option in optionMap) { |
505 | | - if (optionMap.hasOwnProperty(option)) { |
506 | | - this.processOptionGroup(optionMap[option]); |
507 | | - } |
508 | | - } |
509 | | - return this.valid(); |
510 | | - }, |
511 | | - |
512 | | - processOptionGroup: function(group) { |
513 | | - if (group.length > 0) { |
514 | | - this.check(group[0]); |
515 | | - } |
516 | | - }, |
517 | | - |
518 | | - checkDefaultForm: function() { |
519 | 474 | this.prepareForm(); |
520 | | - for (var i = 0, elements = (this.currentElements = this.elements()); elements[i]; i++) { |
521 | | - this.check(elements[i]); |
| 475 | + for ( var i = 0, elements = ( this.currentElements = this.elements() ); elements[ i ]; i++ ) { |
| 476 | + this.check( elements[ i ] ); |
522 | 477 | } |
523 | 478 | return this.valid(); |
524 | 479 | }, |
|
640 | 595 | /* jshint unused: false */ |
641 | 596 | var count = 0, |
642 | 597 | i; |
643 | | - |
644 | 598 | for ( i in obj ) { |
645 | 599 |
|
646 | 600 | // This check allows counting elements with empty error |
|
687 | 641 |
|
688 | 642 | findLastActive: function() { |
689 | 643 | var lastActive = this.lastActive; |
690 | | - |
691 | 644 | return lastActive && $.grep( this.errorList, function( n ) { |
692 | 645 | return n.element.name === lastActive.name; |
693 | 646 | } ).length === 1 && lastActive; |
|
704 | 657 | .not( this.settings.ignore ) |
705 | 658 | .filter( function() { |
706 | 659 | var name = this.name || $( this ).attr( "name" ); // For contenteditable |
707 | | - |
708 | | - var isContentEditable = typeof $( this ).attr( "contenteditable" ) !== "undefined" |
709 | | - && $( this ).attr( "contenteditable" ) !== "false"; |
| 660 | + var isContentEditable = typeof $( this ).attr( "contenteditable" ) !== "undefined" && $( this ).attr( "contenteditable" ) !== "false"; |
710 | 661 |
|
711 | 662 | if ( !name && validator.settings.debug && window.console ) { |
712 | 663 | console.error( "%o has no name assigned", this ); |
|
739 | 690 |
|
740 | 691 | errors: function() { |
741 | 692 | var errorClass = this.settings.errorClass.split( " " ).join( "." ); |
742 | | - |
743 | 693 | return $( this.settings.errorElement + "." + errorClass, this.errorContext ); |
744 | 694 | }, |
745 | 695 |
|
|
896 | 846 | // Return the custom message for the given element name and validation method |
897 | 847 | customMessage: function( name, method ) { |
898 | 848 | var m = this.settings.messages[ name ]; |
899 | | - |
900 | 849 | return m && ( m.constructor === String ? m : m[ method ] ); |
901 | 850 | }, |
902 | 851 |
|
|
965 | 914 |
|
966 | 915 | defaultShowErrors: function() { |
967 | 916 | var i, elements, error; |
968 | | - |
969 | 917 | for ( i = 0; this.errorList[ i ]; i++ ) { |
970 | 918 | error = this.errorList[ i ]; |
971 | 919 | if ( this.settings.highlight ) { |
|
1163 | 1111 |
|
1164 | 1112 | optional: function( element ) { |
1165 | 1113 | var val = this.elementValue( element ); |
1166 | | - |
1167 | 1114 | return !$.validator.methods.required.call( this, val, element ) && "dependency-mismatch"; |
1168 | 1115 | }, |
1169 | 1116 |
|
|
1335 | 1282 | } |
1336 | 1283 |
|
1337 | 1284 | var meta = $.data(element.form, 'validator').settings.meta; |
1338 | | - |
1339 | 1285 | return meta ? |
1340 | 1286 | $(element).metadata()[meta] : |
1341 | 1287 | $(element).metadata(); |
1342 | 1288 | }, |
| 1289 | + |
1343 | 1290 | dataRules: function( element ) { |
1344 | 1291 | var rules = {}, |
1345 | 1292 | $element = $( element ), |
|
1381 | 1328 | } |
1382 | 1329 | if ( val.param || val.depends ) { |
1383 | 1330 | var keepRule = true; |
1384 | | - |
1385 | 1331 | switch ( typeof val.depends ) { |
1386 | 1332 | case "string": |
1387 | 1333 | keepRule = !!$( val.depends, element.form ).length; |
|
1393 | 1339 | if ( keepRule ) { |
1394 | 1340 | rules[ prop ] = val.param !== undefined ? val.param : true; |
1395 | 1341 | } else { |
1396 | | - $.data(element.form, "validator").resetElements($(element)); |
| 1342 | + $.data( element.form, "validator" ).resetElements( $( element ) ); |
1397 | 1343 | delete rules[ prop ]; |
1398 | 1344 | } |
1399 | 1345 | } |
|
1412 | 1358 | } ); |
1413 | 1359 | $.each( [ "rangelength", "range" ], function() { |
1414 | 1360 | var parts; |
1415 | | - |
1416 | 1361 | if ( rules[ this ] ) { |
1417 | 1362 | if ( Array.isArray( rules[ this ] ) ) { |
1418 | 1363 | rules[ this ] = [ Number( rules[ this ][ 0 ] ), Number( rules[ this ][ 1 ] ) ]; |
|
1445 | 1390 | normalizeRule: function( data ) { |
1446 | 1391 | if ( typeof data === "string" ) { |
1447 | 1392 | var transformed = {}; |
1448 | | - |
1449 | 1393 | $.each( data.split( /\s/ ), function() { |
1450 | 1394 | transformed[ this ] = true; |
1451 | 1395 | } ); |
|
1477 | 1421 |
|
1478 | 1422 | // Could be an array for select-multiple or a string, both are fine this way |
1479 | 1423 | var val = $( element ).val(); |
1480 | | - |
1481 | 1424 | return val && val.length > 0; |
1482 | 1425 | } |
1483 | 1426 | if ( this.checkable( element ) ) { |
|
1546 | 1489 | // https://jqueryvalidation.org/minlength-method/ |
1547 | 1490 | minlength: function( value, element, param ) { |
1548 | 1491 | var length = Array.isArray( value ) ? value.length : this.getLength( value, element ); |
1549 | | - |
1550 | 1492 | return this.optional( element ) || length >= param; |
1551 | 1493 | }, |
1552 | 1494 |
|
1553 | 1495 | // https://jqueryvalidation.org/maxlength-method/ |
1554 | 1496 | maxlength: function( value, element, param ) { |
1555 | 1497 | var length = Array.isArray( value ) ? value.length : this.getLength( value, element ); |
1556 | | - |
1557 | 1498 | return this.optional( element ) || length <= param; |
1558 | 1499 | }, |
1559 | 1500 |
|
1560 | 1501 | // https://jqueryvalidation.org/rangelength-method/ |
1561 | 1502 | rangelength: function( value, element, param ) { |
1562 | 1503 | var length = Array.isArray( value ) ? value.length : this.getLength( value, element ); |
1563 | | - |
1564 | 1504 | return this.optional( element ) || ( length >= param[ 0 ] && length <= param[ 1 ] ); |
1565 | 1505 | }, |
1566 | 1506 |
|
|
1595 | 1535 | // Number of digits right of decimal point. |
1596 | 1536 | return match[ 1 ] ? match[ 1 ].length : 0; |
1597 | 1537 | }, |
1598 | | - decimals = 0, |
1599 | 1538 | toInt = function( num ) { |
1600 | 1539 | return Math.round( num * Math.pow( 10, decimals ) ); |
1601 | 1540 | }, |
1602 | | - valid = true; |
| 1541 | + valid = true, |
| 1542 | + decimals; |
1603 | 1543 |
|
1604 | 1544 | // Works only for text, number and range input types |
1605 | 1545 | // TODO find a way to support input types date, datetime, datetime-local, month, time and week |
|
1622 | 1562 |
|
1623 | 1563 | // Bind to the blur event of the target in order to revalidate whenever the target field is updated |
1624 | 1564 | var target = $( param ); |
1625 | | - |
1626 | 1565 | if ( this.settings.onfocusout && target.not( ".validate-equalTo-blur" ).length ) { |
1627 | 1566 | target.addClass( "validate-equalTo-blur" ).on( "blur.validate-equalTo", function() { |
1628 | 1567 | $( element ).valid(); |
|
1666 | 1605 | data: data, |
1667 | 1606 | context: validator.currentForm, |
1668 | 1607 | success: function( response ) { |
1669 | | - var valid = response === true || response === 'true', |
| 1608 | + var valid = response === true || response === "true", |
1670 | 1609 | errors, message, submitted; |
1671 | 1610 |
|
1672 | 1611 | validator.settings.messages[ element.name ][ method ] = previous.originalMessage; |
|
0 commit comments