ソースを参照

numericinput fixes

Robin Herbots 13 年 前
コミット
cb947a0a98
1 ファイル変更21 行追加16 行削除
  1. 21 16
      jquery.inputmask.js

+ 21 - 16
jquery.inputmask.js

@@ -3,7 +3,7 @@ Input Mask plugin for jquery
 http://github.com/RobinHerbots/jquery.inputmask
 Copyright (c) 2010 Robin Herbots
 Licensed under the MIT license (http://www.opensource.org/licenses/mit-license.php)
-Version: 0.5.7b
+Version: 0.5.8
  
 This plugin is based on the masked input plugin written by Josh Bush (digitalbush.com)
 */
@@ -149,7 +149,7 @@ This plugin is based on the masked input plugin written by Josh Bush (digitalbus
             }
 
             //helper functions
-           function ResolveAlias(aliasStr) {
+            function ResolveAlias(aliasStr) {
                 var aliasDefinition = opts.aliases[aliasStr];
                 if (aliasDefinition) {
                     if (aliasDefinition.alias) ResolveAlias(aliasDefinition.alias); //alias is another alias
@@ -305,16 +305,20 @@ This plugin is based on the masked input plugin written by Josh Bush (digitalbus
 
             //needed to handle the non-greedy mask repetitions
             function prepareBuffer(buffer, position, isRTL) {
-                while ((buffer.length < position || position < 0) && buffer.length < getMaskLength()) {
-                    var j = 0;
-                    if (isRTL) {
+                var j = 0;
+                if (isRTL) {
+                    while (position < 0 && buffer.length < getMaskLength()) {
                         j = _buffer.length - 1;
-                        position = position + _buffer.length;
-                        while (_buffer[j] !== undefined)
+                        position = _buffer.length;
+                        while (_buffer[j] !== undefined) {
                             buffer.unshift(_buffer[j--]);
-                        break;
-                    } else while (_buffer[j] !== undefined) {
-                        buffer.push(_buffer[j++]);
+                        }
+                    }
+                } else {
+                    while (buffer.length < position && buffer.length < getMaskLength()) {
+                        while (_buffer[j] !== undefined) {
+                            buffer.push(_buffer[j++]);
+                        }
                     }
                 }
 
@@ -681,7 +685,7 @@ This plugin is based on the masked input plugin written by Josh Bush (digitalbus
                 //shift chars to left from start to end and put c at end position if defined
                 function shiftL(start, end, c) {
                     while (!isMask(start) && start - 1 >= 0) start--;
-                    for (var i = start; i <= end && i < getMaskLength(); i++) {
+                    for (var i = start; i < end && i < getMaskLength(); i++) {
                         if (isMask(i)) {
                             SetReTargetPlaceHolder(buffer, i);
                             var j = seekNext(buffer, i);
@@ -689,6 +693,7 @@ This plugin is based on the masked input plugin written by Josh Bush (digitalbus
                             if (p != getPlaceHolder(j)) {
                                 if (j < getMaskLength() && isValid(i, p, buffer, true) !== false && tests[determineTestPosition(i)].def == tests[determineTestPosition(j)].def) {
                                     setBufferElement(buffer, i, getBufferElement(buffer, j));
+                                    SetReTargetPlaceHolder(buffer, j); //cleanup next position
                                 } else {
                                     if (isMask(i))
                                         break;
@@ -820,17 +825,17 @@ This plugin is based on the masked input plugin written by Josh Bush (digitalbus
                         if (k) {
                             var pos = caret(input), c = String.fromCharCode(k), maskL = getMaskLength();
                             if (isRTL) {
-                                var p = seekPrevious(buffer, pos.end), np;
+                                var p = opts.numericInput ? pos.end : seekPrevious(buffer, pos.end), np;
                                 if ((np = isValid(p, c, buffer, false)) !== false) {
                                     if (np !== true) p = np; //set new position from isValid
                                     if (isValid(firstMaskPos, buffer[firstMaskPos], buffer, true) == false || (opts.greedy === false && buffer.length < maskL)) {
                                         if (buffer[firstMaskPos] != getPlaceHolder(firstMaskPos) && buffer.length < maskL) {
-                                            var offset = prepareBuffer(buffer, -1, isRTL) + 1;
-                                            p = p + offset;
+                                            var offset = prepareBuffer(buffer, -1, isRTL);
+                                            if (pos.end != 0) p = p + offset;
                                             maskL = buffer.length;
                                         }
-                                        shiftL(firstMaskPos, p, c);
-                                        writeBuffer(input, buffer, opts.numericInput ? maskL : p);
+                                        shiftL(firstMaskPos, opts.numericInput ? seekPrevious(buffer, p) : p, c);
+                                        writeBuffer(input, buffer, opts.numericInput && p == 0 ? seekNext(buffer, p) : p);
                                     } else if (opts.oncomplete)
                                         opts.oncomplete.call(input);
                                 } else if (android) writeBuffer(input, buffer, pos.begin);