浏览代码

fix for validation

Robin Herbots 11 年之前
父节点
当前提交
6388cad1de
共有 3 个文件被更改,包括 120 次插入97 次删除
  1. 0 2
      README.md
  2. 36 15
      js/jquery.inputmask.js
  3. 84 80
      qunit/tests.js

+ 0 - 2
README.md

@@ -1,5 +1,3 @@
-#DO NOT USE - experimental
-
 #jquery.inputmask
 
 Copyright (c) 2010 - 2014 Robin Herbots

+ 36 - 15
js/jquery.inputmask.js

@@ -262,15 +262,33 @@
                 }
                 return lastValidPosition;
             }
-            function setValidPosition(pos, validTest, strict) {
-                if (opts.insertMode && getMaskSet()["validPositions"][pos] != undefined) {
-                    var currentValid = getMaskSet()["validPositions"][pos];
-                    getMaskSet()["validPositions"][pos] = validTest;
+            function setValidPosition(pos, validTest, strict, fromSetValid) {
+                if (opts.insertMode && getMaskSet()["validPositions"][pos] != undefined && fromSetValid == undefined) {
                     //reposition & revalidate others
+                    var positionsClone = $.extend(true, {}, getMaskSet()["validPositions"]);
 
-                    isValid(pos + 1, currentValid["input"], strict);
+                    for (var i = seekPrevious(getMaskLength()) ; i > pos && i >= 0; i--) {
+                        if (isMask(i)) {
+                            var j = seekPrevious(i);
+                            var t = getMaskSet()["validPositions"][j];
+                            if (t != undefined) {
+                                if (getTest(i).def == getTest(j).def && getMaskSet()["validPositions"][i] == undefined && isValid(i, t["input"], strict, true) !== false) {
+                                    getMaskSet()["validPositions"][j] = undefined;
+                                }
+                            }
+                        }
+                    }
+
+                    if (getMaskSet()["validPositions"][pos] == undefined) {
+                        getMaskSet()["validPositions"][pos] = validTest;
+                    } else {
+                        getMaskSet()["validPositions"] = $.extend(true, {}, positionsClone);
+                        return false;
+                    }
                 } else
                     getMaskSet()["validPositions"][pos] = validTest;
+
+                return true;
             }
             function getTest(pos) {
                 if (getMaskSet()['validPositions'][pos]) {
@@ -386,10 +404,10 @@
                 }
                 return getMaskSet()['buffer'];
             }
-            function isValid(pos, c, strict) { //strict true ~ no correction or autofill
+            function isValid(pos, c, strict, fromSetValid) { //strict true ~ no correction or autofill
                 strict = strict === true; //always set a value to strict to prevent possible strange behavior in the extensions 
 
-                function _isValid(position, c, strict) {
+                function _isValid(position, c, strict, fromSetValid) {
                     var rslt = false;
                     $.each(getTests(position, !strict), function (ndx, tst) {
                         var test = tst["match"];
@@ -432,7 +450,8 @@
                                 getMaskSet()["buffer"] = undefined;
                                 getMaskSet()["tests"] = {}; //clear the tests cache todo optimize
                             }
-                            setValidPosition(validatedPos, $.extend({}, tst, { "input": elem }), strict);
+                            if (!setValidPosition(validatedPos, $.extend({}, tst, { "input": elem }), strict, fromSetValid))
+                                rslt = false;
                             return false; //break from $.each
                         }
                     });
@@ -441,10 +460,10 @@
                 }
 
                 var maskPos = pos;
-                var result = _isValid(maskPos, c, strict);
+                var result = _isValid(maskPos, c, strict, fromSetValid);
                 if (!strict && (opts.insertMode || getMaskSet()["validPositions"][seekNext(pos)] == undefined) && result === false && !isMask(maskPos)) { //does the input match on a further position?
                     for (var nPos = maskPos + 1, snPos = seekNext(maskPos) ; nPos <= snPos; nPos++) {
-                        result = _isValid(nPos, c, strict);
+                        result = _isValid(nPos, c, strict, fromSetValid);
                         if (result !== false) {
                             maskPos = nPos;
                             break;
@@ -969,7 +988,7 @@
                         //should we clear a possible selection??
                         var isSlctn = isSelection(pos.begin, pos.end);
                         if (isSlctn) {
-                            getMaskSet()["undoBuffer"] = getBuffer().join(''); //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);
                             if (!opts.insertMode) { //preserve some space
                                 shiftR(pos.begin, getMaskLength());
@@ -1034,11 +1053,13 @@
                                         $input.trigger("input");
                                     }, 0);
                                 }
-                            } else if (isSlctn) { //TODO FIXME
-                                getMaskSet()["buffer"] = getMaskSet()["undoBuffer"].split('');
+                            } else if (isSlctn) {
+                                getMaskSet()["buffer"] = undefined;
+                                getMaskSet()["validPositions"] = getMaskSet()["undoPositions"];
                             }
-                        } else if (isSlctn) { //TODO FIXME
-                            getMaskSet()["buffer"] = getMaskSet()["undoBuffer"].split('');
+                        } else if (isSlctn) {
+                            getMaskSet()["buffer"] = undefined;
+                            getMaskSet()["validPositions"] = getMaskSet()["undoPositions"];
                         }
 
 

+ 84 - 80
qunit/tests.js

@@ -594,7 +594,7 @@ test("inputmask({ \"mask\": \"(999) 999-9999\" }) ~ .val(\"8144419449\") - type=
     $("#testmask").remove();
 });
 
-module("Optional & multi masks");
+module("Optional");
 test("inputmask(\"(99) 9999[9]-99999\") - input 121234-12345", function () {
     var $fixture = $( "#qunit-fixture" );
 	$fixture.append('<input type="text" id="testmask" />');
@@ -619,35 +619,35 @@ test("inputmask(\"(99) 9999[9]-99999\") - input 121234512345", function () {
 
     $("#testmask").remove();
 });
-test("inputmask({ mask: [\"999.999.999-99\", \"99.999.999/9999-99\"]}) - input 12312312312", function () {
+
+test("inputmask({ mask: \"99999[-9999]\", greedy: true }) - input 123", function () {
     var $fixture = $( "#qunit-fixture" );
 	$fixture.append('<input type="text" id="testmask" />');
-    $("#testmask").inputmask({ mask: ["999.999.999-99", "99.999.999/9999-99"] });
+    $("#testmask").inputmask({ mask: "99999[-9999]", greedy: true });
 
     $("#testmask")[0].focus();
-    $("#testmask").Type("12312312312");
-
-    equal($("#testmask").val(), "123.123.123-12", "Result " + $("#testmask").val());
+    $("#testmask").Type("123");
+    equal($("#testmask").val(), "123__-____", "Result " + $("#testmask").val());
 
     $("#testmask").remove();
 });
-test("inputmask({ mask: [\"999.999.999-99\", \"99.999.999/9999-99\"]}) - input 12.123123123412", function () {
+
+test("inputmask({ mask: \"99999[-9999]\", greedy: false }) - input 123", function () {
     var $fixture = $( "#qunit-fixture" );
 	$fixture.append('<input type="text" id="testmask" />');
-    $("#testmask").inputmask({ mask: ["999.999.999-99", "99.999.999/9999-99"] });
+    $("#testmask").inputmask({ mask: "99999[-9999]", greedy: false });
 
     $("#testmask")[0].focus();
-    $("#testmask").Type("12.123123123412");
-
-    equal($("#testmask").val(), "12.123.123/1234-12", "Result " + $("#testmask").val());
+    $("#testmask").Type("123");
+    equal($("#testmask").val(), "123__", "Result " + $("#testmask").val());
 
     $("#testmask").remove();
 });
 
-test("inputmask({ mask: [\"99999\", \"99999-9999\"]]}) - input 12345", function () {
+test("inputmask({ mask: \"99999[-9999]\", greedy: false }) - input 12345", function () {
     var $fixture = $( "#qunit-fixture" );
 	$fixture.append('<input type="text" id="testmask" />');
-    $("#testmask").inputmask({ mask: ["99999", "99999-9999"] });
+    $("#testmask").inputmask({ mask: "99999[-9999]", greedy: false });
 
     $("#testmask")[0].focus();
     $("#testmask").Type("12345");
@@ -655,145 +655,160 @@ test("inputmask({ mask: [\"99999\", \"99999-9999\"]]}) - input 12345", function
 
     $("#testmask").remove();
 });
-test("inputmask({ mask: [\"99999\", \"99999-9999\"]]}) - input 12345-1234", function () {
+
+test("inputmask({ mask: \"99999[-9999]\", greedy: false }) - input 123456", function () {
     var $fixture = $( "#qunit-fixture" );
 	$fixture.append('<input type="text" id="testmask" />');
-    $("#testmask").inputmask({ mask: ["99999", "99999-9999"] });
+    $("#testmask").inputmask({ mask: "99999[-9999]", greedy: false });
 
     $("#testmask")[0].focus();
-    $("#testmask").Type("12345-1234");
-    equal($("#testmask").val(), "12345-1234", "Result " + $("#testmask").val());
+    $("#testmask").Type("123456");
+    equal($("#testmask").val(), "12345-6___", "Result " + $("#testmask").val());
 
     $("#testmask").remove();
 });
-test("inputmask({ mask: [\"99999\", \"99999-9999\"]]}) - input 123451234", function () {
+
+test("inputmask({ mask: \"99999[-9999]\", greedy: false }) - input 123456789", function () {
     var $fixture = $( "#qunit-fixture" );
 	$fixture.append('<input type="text" id="testmask" />');
-    $("#testmask").inputmask({ mask: ["99999", "99999-9999"] });
+    $("#testmask").inputmask({ mask: "99999[-9999]", greedy: false });
 
     $("#testmask")[0].focus();
-    $("#testmask").Type("123451234");
-    equal($("#testmask").val(), "12345-1234", "Result " + $("#testmask").val());
+    $("#testmask").Type("123456789");
+    equal($("#testmask").val(), "12345-6789", "Result " + $("#testmask").val());
 
     $("#testmask").remove();
 });
-test("inputmask({ mask: [\"99999\", \"99999-9999\"]]}) - input 1234512", function () {
+
+test("inputmask(\"9[9][9] 999[9] 9999\") - input 123123 space 1234 - vipink70", function () {
     var $fixture = $( "#qunit-fixture" );
 	$fixture.append('<input type="text" id="testmask" />');
-    $("#testmask").inputmask({ mask: ["99999", "99999-9999"] });
+    $("#testmask").inputmask("9[9][9] 999[9] 9999");
 
     $("#testmask")[0].focus();
-    $("#testmask").Type("1234512");
-    equal($("#testmask").val(), "12345-12__", "Result " + $("#testmask").val());
+    $("#testmask").Type("123123");
+    $("#testmask").SendKey(keyCodes.SPACE);
+    $("#testmask").Type("1234");
+    equal($("#testmask").val(), "123 123 1234", "Result " + $("#testmask").val());
 
     $("#testmask").remove();
 });
 
-test("inputmask({ mask: [\"99999\", \"99999-9999\", \"999999-9999\"]]}) - input 1234561234", function () {
+test("inputmask('[9-]AAA.999') ", function () {
     var $fixture = $( "#qunit-fixture" );
 	$fixture.append('<input type="text" id="testmask" />');
-    $("#testmask").inputmask({ mask: ["99999", "99999-9999", "999999-9999"] });
+    $("#testmask").inputmask('[9-]AAA.999');
 
-    $("#testmask")[0].focus();
-    $("#testmask").Type("1234561234");
-    equal($("#testmask").val(), "123456-1234", "Result " + $("#testmask").val());
+    $("#testmask").Type("1abc123");
+    caret($("#testmask"), 4, 5);
+    $("#testmask").Type("d");
+    equal($("#testmask").val(), "1-ABD.123", "Result " + $("#testmask").val());
 
     $("#testmask").remove();
 });
-test("inputmask({ mask: [\"99999\", \"99999-9999\", \"999999-9999\"]]}) - input 123456", function () {
+
+module("multi masks");
+test("inputmask({ mask: [\"999.999.999-99\", \"99.999.999/9999-99\"]}) - input 12312312312", function () {
     var $fixture = $( "#qunit-fixture" );
 	$fixture.append('<input type="text" id="testmask" />');
-    $("#testmask").inputmask({ mask: ["99999", "99999-9999", "999999-9999"] });
+    $("#testmask").inputmask({ mask: ["999.999.999-99", "99.999.999/9999-99"] });
 
     $("#testmask")[0].focus();
-    $("#testmask").Type("123456");
-    equal($("#testmask").val(), "123456-____", "Result " + $("#testmask").val());
+    $("#testmask").Type("12312312312");
+
+    equal($("#testmask").val(), "123.123.123-12", "Result " + $("#testmask").val());
 
     $("#testmask").remove();
 });
-
-test("inputmask({ mask: \"99999[-9999]\", greedy: true }) - input 123", function () {
+test("inputmask({ mask: [\"999.999.999-99\", \"99.999.999/9999-99\"]}) - input 12.123123123412", function () {
     var $fixture = $( "#qunit-fixture" );
 	$fixture.append('<input type="text" id="testmask" />');
-    $("#testmask").inputmask({ mask: "99999[-9999]", greedy: true });
+    $("#testmask").inputmask({ mask: ["999.999.999-99", "99.999.999/9999-99"] });
 
     $("#testmask")[0].focus();
-    $("#testmask").Type("123");
-    equal($("#testmask").val(), "123__-____", "Result " + $("#testmask").val());
+    $("#testmask").Type("12.123123123412");
+
+    equal($("#testmask").val(), "12.123.123/1234-12", "Result " + $("#testmask").val());
 
     $("#testmask").remove();
 });
 
-test("inputmask({ mask: \"99999[-9999]\", greedy: false }) - input 123", function () {
+test("inputmask({ mask: [\"99999\", \"99999-9999\"]]}) - input 12345", function () {
     var $fixture = $( "#qunit-fixture" );
 	$fixture.append('<input type="text" id="testmask" />');
-    $("#testmask").inputmask({ mask: "99999[-9999]", greedy: false });
+    $("#testmask").inputmask({ mask: ["99999", "99999-9999"] });
 
     $("#testmask")[0].focus();
-    $("#testmask").Type("123");
-    equal($("#testmask").val(), "123__", "Result " + $("#testmask").val());
+    $("#testmask").Type("12345");
+    equal($("#testmask").val(), "12345", "Result " + $("#testmask").val());
 
     $("#testmask").remove();
 });
-
-test("inputmask({ mask: \"99999[-9999]\", greedy: false }) - input 12345", function () {
+test("inputmask({ mask: [\"99999\", \"99999-9999\"]]}) - input 12345-1234", function () {
     var $fixture = $( "#qunit-fixture" );
 	$fixture.append('<input type="text" id="testmask" />');
-    $("#testmask").inputmask({ mask: "99999[-9999]", greedy: false });
+    $("#testmask").inputmask({ mask: ["99999", "99999-9999"] });
 
     $("#testmask")[0].focus();
-    $("#testmask").Type("12345");
-    equal($("#testmask").val(), "12345", "Result " + $("#testmask").val());
+    $("#testmask").Type("12345-1234");
+    equal($("#testmask").val(), "12345-1234", "Result " + $("#testmask").val());
 
     $("#testmask").remove();
 });
+test("inputmask({ mask: [\"99999\", \"99999-9999\"]]}) - input 123451234", function () {
+    var $fixture = $( "#qunit-fixture" );
+	$fixture.append('<input type="text" id="testmask" />');
+    $("#testmask").inputmask({ mask: ["99999", "99999-9999"] });
 
-test("inputmask({ mask: \"99999[-9999]\", greedy: false }) - input 123456", function () {
+    $("#testmask")[0].focus();
+    $("#testmask").Type("123451234");
+    equal($("#testmask").val(), "12345-1234", "Result " + $("#testmask").val());
+
+    $("#testmask").remove();
+});
+test("inputmask({ mask: [\"99999\", \"99999-9999\"]]}) - input 1234512", function () {
     var $fixture = $( "#qunit-fixture" );
 	$fixture.append('<input type="text" id="testmask" />');
-    $("#testmask").inputmask({ mask: "99999[-9999]", greedy: false });
+    $("#testmask").inputmask({ mask: ["99999", "99999-9999"] });
 
     $("#testmask")[0].focus();
-    $("#testmask").Type("123456");
-    equal($("#testmask").val(), "12345-6___", "Result " + $("#testmask").val());
+    $("#testmask").Type("1234512");
+    equal($("#testmask").val(), "12345-12__", "Result " + $("#testmask").val());
 
     $("#testmask").remove();
 });
 
-test("inputmask({ mask: \"99999[-9999]\", greedy: false }) - input 123456789", function () {
+test("inputmask({ mask: [\"99999\", \"99999-9999\", \"999999-9999\"]]}) - input 1234561234", function () {
     var $fixture = $( "#qunit-fixture" );
 	$fixture.append('<input type="text" id="testmask" />');
-    $("#testmask").inputmask({ mask: "99999[-9999]", greedy: false });
+    $("#testmask").inputmask({ mask: ["99999", "99999-9999", "999999-9999"] });
 
     $("#testmask")[0].focus();
-    $("#testmask").Type("123456789");
-    equal($("#testmask").val(), "12345-6789", "Result " + $("#testmask").val());
+    $("#testmask").Type("1234561234");
+    equal($("#testmask").val(), "123456-1234", "Result " + $("#testmask").val());
 
     $("#testmask").remove();
 });
-
-test("inputmask({ mask: [\"99999\", \"99999-9999\", \"999999-9999\"]]}) - input 123456 (rtl)", function () {
+test("inputmask({ mask: [\"99999\", \"99999-9999\", \"999999-9999\"]]}) - input 123456", function () {
     var $fixture = $( "#qunit-fixture" );
-	$fixture.append('<input type="text" id="testmask" dir="rtl" />');
+	$fixture.append('<input type="text" id="testmask" />');
     $("#testmask").inputmask({ mask: ["99999", "99999-9999", "999999-9999"] });
 
     $("#testmask")[0].focus();
     $("#testmask").Type("123456");
-    equal($("#testmask").val(), "____-654321", "Result " + $("#testmask").val());
+    equal($("#testmask").val(), "123456-____", "Result " + $("#testmask").val());
 
     $("#testmask").remove();
 });
 
-test("inputmask(\"9[9][9] 999[9] 9999\") - input 123123 space 1234 - vipink70", function () {
+test("inputmask({ mask: [\"99999\", \"99999-9999\", \"999999-9999\"]]}) - input 123456 (rtl)", function () {
     var $fixture = $( "#qunit-fixture" );
-	$fixture.append('<input type="text" id="testmask" />');
-    $("#testmask").inputmask("9[9][9] 999[9] 9999");
+	$fixture.append('<input type="text" id="testmask" dir="rtl" />');
+    $("#testmask").inputmask({ mask: ["99999", "99999-9999", "999999-9999"] });
 
     $("#testmask")[0].focus();
-    $("#testmask").Type("123123");
-    $("#testmask").SendKey(keyCodes.SPACE);
-    $("#testmask").Type("1234");
-    equal($("#testmask").val(), "123 123 1234", "Result " + $("#testmask").val());
+    $("#testmask").Type("123456");
+    equal($("#testmask").val(), "____-654321", "Result " + $("#testmask").val());
 
     $("#testmask").remove();
 });
@@ -811,19 +826,6 @@ test("inputmask({ mask: ['9 AAA-AAA', 'A 999-999'] }) ", function () {
     $("#testmask").remove();
 });
 
-test("inputmask('[9-]AAA.999') ", function () {
-    var $fixture = $( "#qunit-fixture" );
-	$fixture.append('<input type="text" id="testmask" />');
-    $("#testmask").inputmask('[9-]AAA.999');
-
-    $("#testmask").Type("1abc123");
-    caret($("#testmask"), 4, 5);
-    $("#testmask").Type("d");
-    equal($("#testmask").val(), "1-ABD.123", "Result " + $("#testmask").val());
-
-    $("#testmask").remove();
-});
-
 module("Date.Extensions");
 test("inputmask(\"dd/mm/yyyy\") - input 2331973", function () {
     var $fixture = $( "#qunit-fixture" );
@@ -1081,6 +1083,8 @@ test("inputmask(\"dd/mm/yyyy\") - input 01011000 - Skiv22", function () {
     $("#testmask").remove();
 });
 
+
+
 module("Numeric.Extensions");
 test("inputmask(\"decimal\", { autoGroup: true, groupSeparator: \",\" }\") - input 12345.123", function () {
     var $fixture = $( "#qunit-fixture" );