ソースを参照

fix handleremove

Robin Herbots 11 年 前
コミット
669054139a
1 ファイル変更26 行追加126 行削除
  1. 26 126
      js/jquery.inputmask.js

+ 26 - 126
js/jquery.inputmask.js

@@ -273,7 +273,7 @@
                             var t = getMaskSet()["validPositions"][j];
                             var t = getMaskSet()["validPositions"][j];
                             if (t != undefined) {
                             if (t != undefined) {
                                 if (getTest(i).def == getTest(j).def && getMaskSet()["validPositions"][i] == undefined && isValid(i, t["input"], strict, true) !== false) {
                                 if (getTest(i).def == getTest(j).def && getMaskSet()["validPositions"][i] == undefined && isValid(i, t["input"], strict, true) !== false) {
-                                    getMaskSet()["validPositions"][j] = undefined;
+                                    delete getMaskSet()["validPositions"][j];
                                 }
                                 }
                             }
                             }
                         }
                         }
@@ -290,6 +290,23 @@
 
 
                 return true;
                 return true;
             }
             }
+            function stripValidPositions(start, end) {
+                var i, ml, startPos = seekNext(start - 1);
+                for (i = start; i < end; i++) { //clear selection
+                    delete getMaskSet()["validPositions"][i];
+                }
+                for (i = end, ml = getMaskLength() ; i < ml; i++) { //clear selection
+                    var t = getMaskSet()["validPositions"][i];
+                    var s = getMaskSet()["validPositions"][startPos];
+                    if (t != undefined && s == undefined) {
+                        if (getTest(startPos).def == t.match.def && isValid(startPos, t["input"], false) !== false) {
+                            delete getMaskSet()["validPositions"][i];
+                        }
+                        startPos = seekNext(startPos);
+                    }
+                }
+                getMaskSet()["buffer"] = undefined;
+            }
             function getTest(pos) {
             function getTest(pos) {
                 if (getMaskSet()['validPositions'][pos]) {
                 if (getMaskSet()['validPositions'][pos]) {
                     return getMaskSet()['validPositions'][pos]["match"];
                     return getMaskSet()['validPositions'][pos]["match"];
@@ -423,7 +440,7 @@
                         rslt = test.fn != null ?
                         rslt = test.fn != null ?
                             test.fn.test(chrs, buffer, position, strict, opts)
                             test.fn.test(chrs, buffer, position, strict, opts)
                             : (c == test["def"] || c == opts.skipOptionalPartCharacter) ?
                             : (c == test["def"] || c == opts.skipOptionalPartCharacter) ?
-                                { "refresh": ndx == 0, c: test["def"], pos: position }
+                                { c: test["def"], pos: position }
                                 : false;
                                 : false;
 
 
                         if (rslt !== false) {
                         if (rslt !== false) {
@@ -510,24 +527,6 @@
                 ;
                 ;
                 return position;
                 return position;
             }
             }
-            function setBufferElement(buffer, position, element) {
-                position = prepareBuffer(buffer, position);
-
-                var test = getTest(position);
-                var elem = element;
-                if (elem != undefined && test != undefined) {
-                    switch (test.casing) {
-                        case "upper":
-                            elem = element.toUpperCase();
-                            break;
-                        case "lower":
-                            elem = element.toLowerCase();
-                            break;
-                    }
-                }
-
-                buffer[position] = elem;
-            }
             function getBufferElement(buffer, position) {
             function getBufferElement(buffer, position) {
                 position = prepareBuffer(buffer, position);
                 position = prepareBuffer(buffer, position);
                 return buffer[position];
                 return buffer[position];
@@ -552,18 +551,6 @@
                     caret(input, caretPos);
                     caret(input, caretPos);
                 }
                 }
             }
             }
-            function clearBuffer(buffer, start, end, stripNomasks) {
-                for (var i = start, maskL = getMaskLength() ; i < end && i < maskL; i++) {
-                    if (stripNomasks === true) {
-                        if (!isMask(i))
-                            setBufferElement(buffer, i, "");
-                    } else
-                        setBufferElement(buffer, i, getPlaceholder(i));
-                }
-            }
-            function setPlaceholder(pos) {
-                setBufferElement(getBuffer(), pos, getPlaceholder(pos));
-            }
             function getPlaceholder(pos) {
             function getPlaceholder(pos) {
                 var test = getTest(pos);
                 var test = getTest(pos);
                 return test["fn"] == null ? test["def"] : opts.placeholder.charAt(pos % opts.placeholder.length);
                 return test["fn"] == null ? test["def"] : opts.placeholder.charAt(pos % opts.placeholder.length);
@@ -786,73 +773,6 @@
                     PatchValhook(npt.type);
                     PatchValhook(npt.type);
                 }
                 }
             }
             }
-            //shift chars to left from start to end and put c at end position if defined
-            function shiftL(start, end, c, maskJumps) {
-                var buffer = getBuffer();
-                if (maskJumps !== false) //jumping over nonmask position
-                    while (!isMask(start) && start - 1 >= 0) start--;
-                for (var i = start; i < end && i < getMaskLength() ; i++) {
-                    if (isMask(i)) {
-                        setPlaceholder(i);
-                        var j = seekNext(i);
-                        var p = getBufferElement(buffer, j);
-                        if (p != getPlaceholder(j)) {
-                            if (j < getMaskLength() && isValid(i, p, true) !== false && getTest(i).def == getTest(j).def) {
-                                setBufferElement(buffer, i, p);
-                                if (j < end) {
-                                    setPlaceholder(j); //cleanup next position
-                                }
-                            } else {
-                                if (isMask(i))
-                                    break;
-                            }
-                        }
-                    } else {
-                        setPlaceholder(i);
-                    }
-                }
-                if (c != undefined)
-                    setBufferElement(buffer, seekPrevious(end), c);
-                if (opts.greedy == false) {
-                    var trbuffer = truncateInput(buffer.join('')).split('');
-                    buffer.length = trbuffer.length;
-                    for (var i = 0, bl = buffer.length; i < bl; i++) {
-                        buffer[i] = trbuffer[i];
-                    }
-                    if (buffer.length == 0) getMaskSet()["buffer"] = getBufferTemplate().slice();
-                }
-                return start; //return the used start position
-            }
-            function shiftR(start, end, c) {
-                var buffer = getBuffer();
-                if (getBufferElement(buffer, start) != getPlaceholder(start)) {
-                    for (var i = seekPrevious(end) ; i > start && i >= 0; i--) {
-                        if (isMask(i)) {
-                            var j = seekPrevious(i);
-                            var t = getBufferElement(buffer, j);
-                            if (t != getPlaceholder(j)) {
-                                if (isValid(i, t, true) !== false && getTest(i).def == getTest(j).def) {
-                                    setBufferElement(buffer, i, t);
-                                    setPlaceholder(j);
-                                } //else break;
-                            }
-                        } else
-                            setPlaceholder(i);
-                    }
-                }
-                if (c != undefined && getBufferElement(buffer, start) == getPlaceholder(start))
-                    setBufferElement(buffer, start, c);
-                var lengthBefore = buffer.length;
-                if (opts.greedy == false) {
-                    var trbuffer = truncateInput(buffer.join('')).split('');
-                    buffer.length = trbuffer.length;
-                    for (var i = 0, bl = buffer.length; i < bl; i++) {
-                        buffer[i] = trbuffer[i];
-                    }
-                    if (buffer.length == 0) getMaskSet()["buffer"] = getBufferTemplate().slice();
-                }
-                return end - (lengthBefore - buffer.length); //return new start position
-            }
             function HandleRemove(input, k, pos) {
             function HandleRemove(input, k, pos) {
                 if (opts.numericInput || isRTL) {
                 if (opts.numericInput || isRTL) {
                     switch (k) {
                     switch (k) {
@@ -870,40 +790,23 @@
                     }
                     }
                 }
                 }
 
 
-                var isSelection = true;
                 if (pos.begin == pos.end) {
                 if (pos.begin == pos.end) {
                     var posBegin = k == opts.keyCode.BACKSPACE ? pos.begin - 1 : pos.begin;
                     var posBegin = k == opts.keyCode.BACKSPACE ? pos.begin - 1 : pos.begin;
                     if (opts.isNumeric && opts.radixPoint != "" && getBuffer()[posBegin] == opts.radixPoint) {
                     if (opts.isNumeric && opts.radixPoint != "" && getBuffer()[posBegin] == opts.radixPoint) {
                         pos.begin = (getBuffer().length - 1 == posBegin) /* radixPoint is latest? delete it */ ? pos.begin : k == opts.keyCode.BACKSPACE ? posBegin : seekNext(posBegin);
                         pos.begin = (getBuffer().length - 1 == posBegin) /* radixPoint is latest? delete it */ ? pos.begin : k == opts.keyCode.BACKSPACE ? posBegin : seekNext(posBegin);
                         pos.end = pos.begin;
                         pos.end = pos.begin;
                     }
                     }
-                    isSelection = false;
                     if (k == opts.keyCode.BACKSPACE)
                     if (k == opts.keyCode.BACKSPACE)
-                        pos.begin--;
+                        pos.begin =seekPrevious(pos.begin);
                     else if (k == opts.keyCode.DELETE)
                     else if (k == opts.keyCode.DELETE)
                         pos.end++;
                         pos.end++;
                 } else if (pos.end - pos.begin == 1 && !opts.insertMode) {
                 } else if (pos.end - pos.begin == 1 && !opts.insertMode) {
-                    isSelection = false;
                     if (k == opts.keyCode.BACKSPACE)
                     if (k == opts.keyCode.BACKSPACE)
                         pos.begin--;
                         pos.begin--;
                 }
                 }
 
 
-                clearBuffer(getBuffer(), pos.begin, pos.end);
-
-                var ml = getMaskLength();
-                if (opts.greedy == false && (isNaN(opts.repeat) || opts.repeat > 0)) {
-                    shiftL(pos.begin, ml, undefined, !isRTL && (k == opts.keyCode.BACKSPACE && !isSelection));
-                } else {
-                    var newpos = pos.begin;
-                    for (var i = pos.begin; i < pos.end; i++) { //seeknext to skip placeholders at start in selection
-                        if (isMask(i) || !isSelection)
-                            newpos = shiftL(pos.begin, ml, undefined, !isRTL && (k == opts.keyCode.BACKSPACE && !isSelection));
-                    }
-                    if (!isSelection) pos.begin = newpos;
-                }
+                stripValidPositions(pos.begin, pos.end);
                 var firstMaskPos = seekNext(-1);
                 var firstMaskPos = seekNext(-1);
-                clearBuffer(getBuffer(), pos.begin, pos.end, true);
-                checkVal(input, false, false, getBuffer());
                 if (getLastValidPosition() < firstMaskPos) {
                 if (getLastValidPosition() < firstMaskPos) {
                     getMaskSet()["p"] = firstMaskPos;
                     getMaskSet()["p"] = firstMaskPos;
                 } else {
                 } else {
@@ -991,7 +894,9 @@
                             getMaskSet()["undoPositions"] = $.extend(true, {}, getMaskSet()["validPositions"]); //init undobuffer for recovery when not valid
                             getMaskSet()["undoPositions"] = $.extend(true, {}, getMaskSet()["validPositions"]); //init undobuffer for recovery when not valid
                             HandleRemove(input, opts.keyCode.DELETE, pos);
                             HandleRemove(input, opts.keyCode.DELETE, pos);
                             if (!opts.insertMode) { //preserve some space
                             if (!opts.insertMode) { //preserve some space
-                                shiftR(pos.begin, getMaskLength());
+                                opts.insertMode = !opts.insertMode;
+                                setValidPosition(pos.begin, undefined, strict);
+                                opts.insertMode = !opts.insertMode;
                             }
                             }
                         }
                         }
 
 
@@ -1010,17 +915,12 @@
                         var p = pos.begin;
                         var p = pos.begin;
                         var valResult = isValid(p, c, strict);
                         var valResult = isValid(p, c, strict);
                         if (valResult !== false) {
                         if (valResult !== false) {
-                            var refresh = false, buffer = getBuffer();
+                            var buffer = getBuffer();
                             if (valResult !== true) {
                             if (valResult !== true) {
-                                refresh = valResult["refresh"]; //only rewrite buffer from isValid
                                 p = valResult.pos != undefined ? valResult.pos : p; //set new position from isValid
                                 p = valResult.pos != undefined ? valResult.pos : p; //set new position from isValid
                                 c = valResult.c != undefined ? valResult.c : c; //set new char from isValid
                                 c = valResult.c != undefined ? valResult.c : c; //set new char from isValid
                             }
                             }
-                            if (refresh !== true) {
-                                if (opts.insertMode == true) {
-                                    getMaskSet()["buffer"] = undefined;
-                                } else setBufferElement(buffer, p, c);
-                            }
+                            getMaskSet()["buffer"] = undefined;
                             forwardPosition = seekNext(p);
                             forwardPosition = seekNext(p);
                             getMaskSet()["p"] = forwardPosition; //needed for checkval
                             getMaskSet()["p"] = forwardPosition; //needed for checkval
                         }
                         }