|
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