|
5 | 5 | *
|
6 | 6 | * @website http://formvalidator.net/
|
7 | 7 | * @license Dual licensed under the MIT or GPL Version 2 licenses
|
8 |
| -* @version 2.1.28 |
| 8 | +* @version 2.1.29 |
9 | 9 | */
|
10 | 10 | (function($) {
|
11 | 11 |
|
|
19 | 19 | * @return {jQuery}
|
20 | 20 | */
|
21 | 21 | $.fn.validateOnBlur = function(language, settings) {
|
22 |
| - |
23 |
| - var blurValidationCallback = function() { |
24 |
| - $(this).validateInputOnBlur(language, settings); |
25 |
| - }; |
26 |
| - |
27 | 22 | this.find('input[data-validation], textarea[data-validation]')
|
28 |
| - .unbind('blur', blurValidationCallback) |
29 |
| - .bind('blur', blurValidationCallback); |
| 23 | + .unbind('blur.validation') |
| 24 | + .bind('blur.validation', function() { |
| 25 | + $(this).validateInputOnBlur(language, settings); |
| 26 | + }); |
30 | 27 |
|
31 | 28 | return this;
|
32 | 29 | };
|
|
49 | 46 | .valAttr('has-keyup-event', false)
|
50 | 47 | .valAttr('backend-valid', false)
|
51 | 48 | .valAttr('backend-invalid', false)
|
52 |
| - .unbind('focus') |
53 |
| - .unbind('blur') |
| 49 | + .unbind('focus.validation') |
| 50 | + .unbind('blur.validation') |
54 | 51 | .removeClass('has-help-txt');
|
55 | 52 |
|
56 | 53 | // Add help text listeners
|
57 | 54 | this.find('textarea,input').each(function() {
|
58 | 55 | var $element = $(this),
|
59 |
| - className = 'jquery_form_help_' + $element.attr('name').replace( /(:|\.|\[|\])/g, "" ), |
| 56 | + className = 'jquery_form_help_' + ($element.attr('name') || '').replace( /(:|\.|\[|\])/g, "" ), |
60 | 57 | help = $element.attr(attrName);
|
61 | 58 |
|
62 | 59 | if(help) {
|
63 | 60 | $element
|
64 | 61 | .addClass('has-help-txt')
|
65 |
| - .focus(function() { |
| 62 | + .bind('focus.validation', function() { |
66 | 63 | var $help = $element.parent().find('.'+className);
|
67 | 64 | if($help.length == 0) {
|
68 | 65 | $help = $('<span />')
|
|
76 | 73 | }
|
77 | 74 | $help.fadeIn();
|
78 | 75 | })
|
79 |
| - .blur(function() { |
| 76 | + .bind('blur.validation', function() { |
80 | 77 | $(this)
|
81 | 78 | .parent()
|
82 | 79 | .find('.'+className)
|
|
440 | 437 | onError : false
|
441 | 438 | }, config || {});
|
442 | 439 |
|
443 |
| - var formSubmitCallback = function() { |
444 |
| - var $form = $(this); |
445 |
| - if($.formUtils.isLoadingModules) { |
446 |
| - setTimeout(function() { |
447 |
| - $form.trigger('submit'); |
448 |
| - }, 200); |
449 |
| - return false; |
450 |
| - } |
451 |
| - var valid = $(this).validateForm(config.language, config); |
452 |
| - if( valid && typeof config.onSuccess == 'function') { |
453 |
| - var callbackResponse = config.onSuccess($form); |
454 |
| - if( callbackResponse === false ) |
455 |
| - return false; |
456 |
| - } else if ( !valid && typeof config.onError == 'function' ) { |
457 |
| - config.onError($form); |
458 |
| - return false; |
459 |
| - } else { |
460 |
| - return valid; |
461 |
| - } |
462 |
| - }; |
463 |
| - |
464 | 440 | // Remove all event listeners previously added
|
465 |
| - $('form').unbind('submit', formSubmitCallback); |
| 441 | + $('form.has-validation-callback') |
| 442 | + .removeClass('has-validation-callback') |
| 443 | + .unbind('submit.validation'); |
466 | 444 |
|
467 | 445 | // Add validation to forms
|
468 | 446 | $.split(config.form, function(formQuery) {
|
469 | 447 |
|
470 | 448 | var $form = $(formQuery);
|
471 | 449 |
|
472 | 450 | // Validate when submitted
|
473 |
| - $form.bind('submit', formSubmitCallback); |
| 451 | + $form.bind('submit.validation', function() { |
| 452 | + var $form = $(this); |
| 453 | + if($.formUtils.isLoadingModules) { |
| 454 | + setTimeout(function() { |
| 455 | + $form.trigger('submit.validation'); |
| 456 | + }, 200); |
| 457 | + return false; |
| 458 | + } |
| 459 | + var valid = $(this).validateForm(config.language, config); |
| 460 | + if( valid && typeof config.onSuccess == 'function') { |
| 461 | + var callbackResponse = config.onSuccess($form); |
| 462 | + if( callbackResponse === false ) |
| 463 | + return false; |
| 464 | + } else if ( !valid && typeof config.onError == 'function' ) { |
| 465 | + config.onError($form); |
| 466 | + return false; |
| 467 | + } else { |
| 468 | + return valid; |
| 469 | + } |
| 470 | + }) |
| 471 | + .addClass('has-validation-callback'); |
474 | 472 |
|
475 | 473 | if( config.showHelpOnFocus ) {
|
476 | 474 | $form.showHelpOnFocus();
|
|
966 | 964 | activeSuggestionCSS : {
|
967 | 965 | background : '#E9E9E9'
|
968 | 966 | }
|
| 967 | + }, |
| 968 | + setSuggsetionPosition = function($suggestionContainer, $input) { |
| 969 | + var offset = $input.offset(); |
| 970 | + $suggestionContainer.css({ |
| 971 | + width : $input.outerWidth(), |
| 972 | + left : offset.left + 'px', |
| 973 | + top : (offset.top + $input.outerHeight()) +'px' |
| 974 | + }); |
969 | 975 | };
|
970 | 976 |
|
971 | 977 | if(settings)
|
|
975 | 981 | config.css['z-index'] = 9999;
|
976 | 982 | $element.attr('autocomplete', 'off');
|
977 | 983 |
|
| 984 | + if( this._numSuggestionElements === 0 ) { |
| 985 | + // Re-position suggestion container if window size changes |
| 986 | + $(window).bind('resize', function() { |
| 987 | + $('.jquery-form-suggestions').each(function() { |
| 988 | + var $container = $(this), |
| 989 | + suggestID = $container.attr('data-suggest-container'); |
| 990 | + setSuggsetionPosition($container, $('.suggestions-'+suggestID).eq(0)); |
| 991 | + }); |
| 992 | + }); |
| 993 | + } |
| 994 | + |
978 | 995 | this._numSuggestionElements++;
|
979 | 996 |
|
980 | 997 | var onSelectSuggestion = function($el) {
|
|
987 | 1004 | $element
|
988 | 1005 | .data('suggestions', suggestions)
|
989 | 1006 | .valAttr('suggestion-nr', this._numSuggestionElements)
|
990 |
| - .bind('focus', function() { |
| 1007 | + .unbind('focus.validation') |
| 1008 | + .bind('focus.validation', function() { |
991 | 1009 | $(this).trigger('keyup');
|
992 | 1010 | $.formUtils._selectedSuggestion = null;
|
993 | 1011 | })
|
994 |
| - .bind('keyup', function() { |
| 1012 | + .unbind('keyup.validation') |
| 1013 | + .bind('keyup.validation', function() { |
995 | 1014 | var $input = $(this),
|
996 | 1015 | foundSuggestions = [],
|
997 | 1016 | val = $.trim($input.val()).toLocaleLowerCase();
|
|
1032 | 1051 | // Create suggestion container if not already exists
|
1033 | 1052 | else if(foundSuggestions.length > 0 && $suggestionContainer.length == 0) {
|
1034 | 1053 | $suggestionContainer = $('<div></div>').css(config.css).appendTo('body');
|
1035 |
| - $suggestionContainer.addClass('jquery-form-suggestions'); |
1036 |
| - $suggestionContainer.addClass('jquery-form-suggestion-'+suggestionId); |
| 1054 | + $element.addClass('suggestions-'+suggestionId); |
| 1055 | + $suggestionContainer |
| 1056 | + .attr('data-suggest-container', suggestionId) |
| 1057 | + .addClass('jquery-form-suggestions') |
| 1058 | + .addClass('jquery-form-suggestion-'+suggestionId); |
1037 | 1059 | }
|
1038 | 1060 |
|
1039 | 1061 | // Show hidden container
|
|
1045 | 1067 | if(foundSuggestions.length > 0 && val.length != foundSuggestions[0].length) {
|
1046 | 1068 |
|
1047 | 1069 | // put container in place every time, just in case
|
1048 |
| - var offset = $input.offset(); |
1049 |
| - $suggestionContainer.css({ |
1050 |
| - width : $input.outerWidth(), |
1051 |
| - left : offset.left + 'px', |
1052 |
| - top : (offset.top + $input.outerHeight()) +'px' |
1053 |
| - }); |
| 1070 | + setSuggsetionPosition($suggestionContainer, $input); |
1054 | 1071 |
|
1055 | 1072 | // Add suggestions HTML to container
|
1056 | 1073 | $suggestionContainer.html('');
|
|
1073 | 1090 | });
|
1074 | 1091 | }
|
1075 | 1092 | })
|
1076 |
| - .bind('keydown', function(e) { |
| 1093 | + .unbind('keydown.validation') |
| 1094 | + .bind('keydown.validation', function(e) { |
1077 | 1095 | var code = (e.keyCode ? e.keyCode : e.which),
|
1078 | 1096 | suggestionId,
|
1079 | 1097 | $suggestionContainer,
|
|
1134 | 1152 | }
|
1135 | 1153 | }
|
1136 | 1154 | })
|
1137 |
| - .bind('blur', function() { |
| 1155 | + .unbind('blur.validation') |
| 1156 | + .bind('blur.validation', function() { |
1138 | 1157 | onSelectSuggestion($(this));
|
1139 | 1158 | });
|
1140 | 1159 |
|
|
0 commit comments