diff --git a/CHANGELOG.md b/CHANGELOG.md index 0a197f9..a64e9bf 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,16 @@ +## 1.4 (2013-11-12) + +Features: + +* pasting support has been greatly improved and behaves more intelligently +* improved support in Firefox so that special keys no longer have to be tracked in order to be allowed + +Bug fixes: + +* fixed a bug where the `del` key would do nothing in Firefox (introduced in 1.3) +* fixed several instances of bad evaluations of boolean values as a result of browsers storing data-* differently (introduced in 1.3) + + ## 1.3 (2013-11-09) Features: diff --git a/README.md b/README.md index 325667c..ed8cef2 100644 --- a/README.md +++ b/README.md @@ -10,8 +10,6 @@ Autotab is a jQuery plugin that provides auto tabbing and filtering on text fiel * Populate multiple text fields by pasting into one. * It is small, fast, easy to load and built on the powerful jQuery library. -_Pasting support has basic functionality and has a lot of room for improvement, so use at your own risk._ - ## Table of Contents * [Requirements](#requirements) diff --git a/demo.html b/demo.html index 5d92175..ecc6f45 100644 --- a/demo.html +++ b/demo.html @@ -14,8 +14,8 @@ $('.text').autotab('filter', 'text'); $('.alpha').autotab('filter', 'alpha'); $('.alphanumeric').autotab('filter', { format: 'alphanumeric', uppercase: true }); - $('#regex').autotab({ format: 'custom', pattern: '[^0-9\.]', maxlength: 15 }); - $('#function').autotab(function (value, element) { + $('#regex').autotab('filter', { format: 'custom', pattern: '[^0-9\.]', maxlength: 15 }); + $('#function').autotab('filter', function (value, element) { var parsedValue = parseInt(value, 10); if (!value || parsedValue != value) { @@ -248,7 +248,7 @@

jQuery Autotab Demo

-$('.alphanumeric').autotab('filter', 'alphanumeric');
+$('.alphanumeric').autotab('filter', { format: 'alphanumeric', uppercase: true });
 
@@ -327,21 +327,21 @@

jQuery Autotab Demo

- + : - + : - + : - + : - + : - + : - + : - +
 $('.hexadecimal').autotab('filter', 'hexadecimal');
diff --git a/js/jquery.autotab.js b/js/jquery.autotab.js
index 77b4bd7..7e9f113 100644
--- a/js/jquery.autotab.js
+++ b/js/jquery.autotab.js
@@ -1,5 +1,5 @@
 /**
- * Autotab - jQuery plugin 1.3
+ * Autotab - jQuery plugin 1.4
  * https://github.com/Mathachew/jquery-autotab
  * 
  * Copyright (c) 2013 Matthew Miller
@@ -54,7 +54,7 @@
         settings.firefox = e.getAttribute('data-autotab-Firefox') || (typeof InstallTrigger !== 'undefined');
 
         // Save settings on first run
-        if (!settings.loaded) {
+        if (settings.loaded != 'true' && settings.loaded !== true) {
             setSettings(e, settings);
         }
 
@@ -212,16 +212,16 @@
             value = value.replace(pattern, '');
         }
 
-        if (defaults.nospace) {
+        if (defaults.nospace == 'true' || defaults.nospace === true) {
             pattern = new RegExp('[ ]+', 'g');
             value = value.replace(pattern, '');
         }
 
-        if (defaults.uppercase) {
+        if (defaults.uppercase == 'true' || defaults.uppercase === true) {
             value = value.toUpperCase();
         }
 
-        if (defaults.lowercase) {
+        if (defaults.lowercase == 'true' || defaults.lowercase === true) {
             value = value.toLowerCase();
         }
 
@@ -264,7 +264,7 @@
             defaults.target = null;
         }
 
-        if (!defaults.loaded) {
+        if (settings.loaded != 'true' && settings.loaded !== true) {
             defaults.loaded = true;
             setSettings(element, defaults);
         }
@@ -303,7 +303,7 @@
 
                 // When setting value = value, Firefox will not place the cursor at the end of a textbox
                 // when the cursor was last at any point before the final character within the same textbox
-                if (defaults.firefox) {
+                if (defaults.firefox == 'true' || defaults.firefox === true) {
                     var length = defaults.previous.val().length;
                     defaults.previous[0].setSelectionRange(length, length);
                 }
@@ -316,7 +316,7 @@
         }).on('keydown', function (e) {
             var defaults = getSettings(this);
 
-            if (!defaults || defaults.disabled == 'true') {
+            if (!defaults || defaults.disabled == 'true' || defaults.disabled === true) {
                 return true;
             }
 
@@ -349,18 +349,17 @@
                 return true;
             }
 
+            // e.charCode == 0 indicates a special key has been pressed, which only Firefox triggers
+            if (((defaults.firefox == 'true' || defaults.firefox === true) && e.charCode === 0) || e.ctrlKey || e.altKey) {
+                return true;
+            }
+
             var keyCode = e.which || e.keyCode,
                 keyChar = filterValue(this, String.fromCharCode(keyCode), defaults),
                 hasValue = document.selection && document.selection.createRange ? true : (e.charCode > 0);
 
-            if (e.ctrlKey || e.altKey) {
-                return true;
-            }
-
             if (hasValue && (keyChar === null || keyChar === '')) {
-                // Returns true whenever a paste is occurring
-                // Speficially added for Firefox
-                return e.ctrlKey;
+                return false;
             }
 
             // Many, many thanks to Tim Down for this solution: http://stackoverflow.com/a/3923320/94656
@@ -422,22 +421,6 @@
                 }
             }
 
-            // Firefox doesn't behave properly when trying to backspace or move through
-            // a text box with the arrow keys
-            if (defaults.firefox == 'true' || defaults.firefox === true) {
-                var keys = '8,9,16,17,18,19,20,27,33,34,35,36,37,38,39,40,45,144,145';
-
-                if (keys.indexOf(keyCode) == -1 && typeof keyCode !== 'undefined') {
-                    if (this.value.length == defaults.maxlength) {
-                        $(this).trigger('autotab-next', defaults);
-                    }
-
-                    return false;
-                }
-
-                return true;
-            }
-
             if (this.value.length == defaults.maxlength) {
                 $(this).trigger('autotab-next', defaults);
             }
@@ -450,57 +433,57 @@
                 return true;
             }
 
-            var handlePaste = function (e, originalValue, previousValue) {
-                if (!e) {
-                    return;
-                }
+            this.maxLength = 2147483647;
 
-                var settings = getSettings(e),
-                    maxLength = e.maxLength;
+            (function (e, originDefaults) {
+                setTimeout(function () {
+                    var lastIndex = -1,
+                        hiddenInput = document.createElement('input');
+                    hiddenInput.type = 'hidden';
+                    hiddenInput.value = e.value.toLowerCase();
 
-                if (!defaults || defaults.disabled == 'true' || defaults.disabled === true) {
-                    return true;
-                }
+                    e.maxLength = originDefaults.maxlength;
+                    e.value = filterValue(e, e.value, originDefaults).substr(0, originDefaults.maxlength);
 
-                setSettings(e, defaults);
+                    var handlePaste = function (e, previousValue) {
+                        if (!e) {
+                            return;
+                        }
 
-                e.maxLength = 2147483647;
+                        for (var i = 0, count = previousValue.length; i < count; i++) {
+                            lastIndex = hiddenInput.value.indexOf(previousValue.charAt(i), lastIndex) + 1;
+                        }
 
-                setTimeout(function () {
-                    if (originalValue === null) {
-                        originalValue = e.value;
-                    }
+                        var defaults = getSettings(e),
+                            trimmedValue = hiddenInput.value.substr(lastIndex),
+                            filteredValue = filterValue(e, trimmedValue, defaults).substr(0, defaults.maxlength);
 
-                    var filteredValue;
+                        if (!filteredValue) {
+                            e.value = '';
+                            return;
+                        }
 
-                    // Truncate the pasted text up to the previous element's filtered value
-                    if (previousValue !== null) {
-                        filteredValue = filterValue(e, originalValue.substr(originalValue.indexOf(previousValue) + previousValue.length), defaults).substr(0, maxLength);
-                    }
-                    else {
-                        filteredValue = filterValue(e, originalValue, defaults).substr(0, maxLength);
-                    }
+                        e.value = filteredValue;
 
-                    e.maxLength = maxLength;
+                        if (filteredValue.length == defaults.maxlength) {
+                            $(e).trigger('autotab-next', defaults);
 
-                    if (!filteredValue) {
-                        e.value = '';
-                        return;
-                    }
+                            if (defaults.iOS != 'true' && defaults.iOS !== true) {
+                                handlePaste(defaults.target[0], filteredValue);
+                            }
+                        }
 
-                    e.value = filteredValue;
+                    };
 
-                    if (filteredValue.length == maxLength) {
+                    if (e.value.length == originDefaults.maxlength) {
                         $(e).trigger('autotab-next', defaults);
 
                         if (defaults.iOS != 'true' && defaults.iOS !== true) {
-                            handlePaste(defaults.target[0], originalValue, filteredValue);
+                            handlePaste(originDefaults.target[0], e.value.toLowerCase());
                         }
                     }
                 }, 1);
-            };
-
-            handlePaste(this, null, null);
+            })(this, defaults);
         });
     };
 
diff --git a/js/jquery.autotab.min.js b/js/jquery.autotab.min.js
index 5e32c5a..d8bd60a 100644
--- a/js/jquery.autotab.min.js
+++ b/js/jquery.autotab.min.js
@@ -1,5 +1,5 @@
 /**
- * Autotab - jQuery plugin 1.3
+ * Autotab - jQuery plugin 1.4
  * https://github.com/Mathachew/jquery-autotab
  * 
  * Copyright (c) 2013 Matthew Miller
@@ -8,15 +8,15 @@
  *   http://www.opensource.org/licenses/mit-license.php
  */
 
-(function(f){var l=null,m=function(b,c){if(null!==c&&"undefined"!==typeof c)for(var a in c)"format"==a||"target"==a||"previous"==a?f(b).data("autotab-"+a,c[a]):b.setAttribute("data-autotab-"+a,c[a])},k=function(b){var c=navigator.platform,a={loaded:!1,disabled:!1,pattern:null,uppercase:!1,lowercase:!1,nospace:!1,maxlength:2147483647},e;for(e in a)a[e]=b.getAttribute("data-autotab-"+e)||a[e];a.format=f(b).data("autotab-format")||"all";a.target=f(b).data("autotab-target")||a.target;a.previous=f(b).data("autotab-previous")||
-a.previous;a.iOS=b.getAttribute("data-autotab-iOS")||"iPad"===c||"iPhone"===c||"iPod"===c;a.firefox=b.getAttribute("data-autotab-Firefox")||"undefined"!==typeof InstallTrigger;a.loaded||m(b,a);return a};f.autotab={next:function(){var b=f(document.activeElement);b.length&&setTimeout(function(){b.trigger("autotab-next")},1)},previous:function(){var b=f(document.activeElement);b.length&&setTimeout(function(){b.trigger("autotab-previous")},1)}};f.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,e=this.length;a(new Date).getTime()-l.getTime())return l=null,!1}else l=null}).on("keypress",
-function(a){var b=k(this);if(!b||"true"==b.disabled||!0===b.disabled)return!0;var c=a.which||a.keyCode,n=p(this,String.fromCharCode(c),b),e=document.selection&&document.selection.createRange?!0:0