From d287c3706da0879e70e0e8ae7dae45dec2df9ffc Mon Sep 17 00:00:00 2001 From: Matthew Miller Date: Mon, 13 Jan 2014 21:57:27 -0600 Subject: [PATCH] Fixes a bug that where filtering rules, like uppercase or lowercase, were not working (#23) --- CHANGELOG.md | 7 +++++ js/jquery.autotab.js | 68 +++++++++++++++++++++++++++++++++------- js/jquery.autotab.min.js | 25 ++++++++------- 3 files changed, 76 insertions(+), 24 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index e2cfb23..a6065c4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,10 @@ +## 1.5.2 + +Bug fixes: + +* refactoring caused filtering rules, like uppercase or lowercase, to not work correctly (#23) + + ## 1.5.1 Bug fixes: diff --git a/js/jquery.autotab.js b/js/jquery.autotab.js index 8455e85..08c30e2 100644 --- a/js/jquery.autotab.js +++ b/js/jquery.autotab.js @@ -1,5 +1,5 @@ /** - * Autotab - jQuery plugin 1.5.1 + * Autotab - jQuery plugin 1.5.2 * https://github.com/Mathachew/jquery-autotab * * Copyright (c) 2013 Matthew Miller @@ -41,7 +41,9 @@ maxlength: 2147483647, target: null, previous: null, - trigger: null + trigger: null, + originalValue: '', + changed: false }; for (var key in settings) { @@ -294,10 +296,27 @@ if (!defaults.disabled && previous.length) { var value = previous.val(); - previous.focus().val(value.substring(0, value.length - 1)); + + if (value.length) { + previous.focus().val(value.substring(0, value.length - 1)); + setSettings(previous, { changed: true }); + } + else { + previous.focus(); + } + settings.focusChange = null; } }, 1); + }).on('focus', function () { + setSettings(this, { originalValue: this.value }); + }).on('blur', function () { + var defaults = getSettings(this); + + if (defaults.changed && this.value != defaults.originalValue) { + setSettings(this, { changed: false }); + $(this).change(); + } }).on('keydown', function (e) { var defaults = getSettings(this); @@ -309,8 +328,13 @@ // Go to the previous element when backspace // is pressed in an empty input field - if (keyCode == 8 && this.value.length === 0 && defaults.previous.length) { - $(this).trigger('autotab-previous', defaults); + if (keyCode == 8) { + if (this.value.length === 0 && defaults.previous.length) { + $(this).trigger('autotab-previous', defaults); + } + else { + setSettings(this, { changed: (this.value != defaults.originalValue) }); + } } else if (keyCode == 9 && settings.focusChange !== null) { // Tab backwards @@ -349,8 +373,7 @@ settings.focusChange = null; - var hasValue = document.selection && document.selection.createRange ? true : (e.charCode > 0), - valueChanged = false; + var hasValue = document.selection && document.selection.createRange ? true : (e.charCode > 0); keyChar = filterValue(this, keyChar, defaults); @@ -360,12 +383,14 @@ // Many, many thanks to Tim Down for this solution: http://stackoverflow.com/a/3923320/94656 if (hasValue && (this.value.length <= this.maxLength)) { - var start, end; + var start, end, + selectionType = 0; if (typeof this.selectionStart === 'number' && typeof this.selectionEnd === 'number') { // Non-IE browsers and IE 9 start = this.selectionStart; end = this.selectionEnd; + selectionType = 1; } else if (document.selection && document.selection.createRange) { // For IE up to version 8 @@ -377,11 +402,13 @@ precedingRange.setEndPoint("EndToStart", textInputRange); start = precedingRange.text.length; end = start + selectionRange.text.length; + selectionType = 2; } // Text is fully selected, so it needs to be replaced if (start === 0 && end == this.value.length) { - valueChanged = true; + this.value = keyChar; + setSettings(this, { changed: (this.value != defaults.originalValue) }); } else { if (this.value.length == this.maxLength) { @@ -389,15 +416,32 @@ return false; } - valueChanged = true; + this.value = this.value.slice(0, start) + keyChar + this.value.slice(end); + setSettings(this, { changed: (this.value != defaults.originalValue) }); + + // Prevents the cursor position from being set to the end of the text box + if (this.value.length != defaults.maxlength) { + start++; + + if (selectionType == 1) { + this.selectionStart = this.selectionEnd = start; + } + else if (selectionType == 2) { + var range = this.createTextRange(); + range.collapse(true); + range.moveEnd('character', start); + range.moveStart('character', start); + range.select(); + } + } } } - if (valueChanged && (this.value.length + 1) == defaults.maxlength) { + if (this.value.length == defaults.maxlength) { $(this).trigger('autotab-next', defaults); } - return valueChanged; + return false; }).on('paste', function (e) { var defaults = getSettings(this); diff --git a/js/jquery.autotab.min.js b/js/jquery.autotab.min.js index 654f4bf..977f0ac 100644 --- a/js/jquery.autotab.min.js +++ b/js/jquery.autotab.min.js @@ -1,5 +1,5 @@ /** - * Autotab - jQuery plugin 1.5.1 + * Autotab - jQuery plugin 1.5.2 * https://github.com/Mathachew/jquery-autotab * * Copyright (c) 2013 Matthew Miller @@ -8,14 +8,15 @@ * http://www.opensource.org/licenses/mit-license.php */ -(function(e){var l=navigator.platform,d={tabPause:800,focusChange:null,iOS:"iPad"===l||"iPhone"===l||"iPod"===l,firefox:"undefined"!==typeof InstallTrigger},n=function(b,c){if(null!==c&&"undefined"!==typeof c)for(var a in c)e(b).data("autotab-"+a,c[a])},k=function(b){var c={format:"all",loaded:!1,disabled:!1,pattern:null,uppercase:!1,lowercase:!1,nospace:!1,maxlength:2147483647,target:null,previous:null,trigger:null},a;for(a in c)c[a]=e(b).data("autotab-"+a)||c[a];c.loaded||(null!==c.trigger&&"string"=== -typeof c.trigger&&(c.trigger=c.trigger.toString()),n(b,c));return c};e.autotab={next:function(){var b=e(document.activeElement);b.length&&b.trigger("autotab-next")},previous:function(){var b=e(document.activeElement);b.length&&b.trigger("autotab-previous")}};e.fn.autotab=function(b,c){if(!this.length)return this;if("filter"==b){if("string"===typeof c||"function"===typeof c)c={format:c};for(var a=0,d=this.length;a