ソースを参照

dynamic validation working

Robin Herbots 11 年 前
コミット
47131c4e4a
3 ファイル変更65 行追加24 行削除
  1. 4 0
      js/jquery.inputmask.extensions.js
  2. 32 19
      js/jquery.inputmask.js
  3. 29 5
      qunit/tests.js

+ 4 - 0
js/jquery.inputmask.extensions.js

@@ -117,6 +117,10 @@ Optional extensions on the jquery.inputmask base
                     definitionSymbol: "i"
                 }
             }
+        },
+        "email": {
+            mask: "*{1,20}[.*{1,20}][.*{1,20}]@*{1,20}.*{2,6}[.*{2}]",
+            greedy: false
         }
     });
 })(jQuery);

+ 32 - 19
js/jquery.inputmask.js

@@ -216,10 +216,12 @@
                 $el,
                 skipKeyPressEvent = false, //Safari 5.1.x - modal dialog fires keypress twice workaround
                 skipInputEvent = false, //skip when triggered from within inputmask
-                ignorable = false;
+                ignorable = false,
+                maxLength;
+
 
             //maskset helperfunctions
-            function getMaskTemplate(baseOnInput, minimalPos) {
+            function getMaskTemplate(baseOnInput, minimalPos, includeInput) {
                 minimalPos = minimalPos || 0;
                 var maskTemplate = [], ndxIntlzr, pos = 0, test;
                 do {
@@ -227,7 +229,7 @@
                         var validPos = getMaskSet()['validPositions'][pos];
                         test = validPos["match"];
                         ndxIntlzr = validPos["locator"].slice();
-                        maskTemplate.push(test["fn"] == null ? test["def"] : opts.placeholder.charAt(pos % opts.placeholder.length));
+                        maskTemplate.push(test["fn"] == null ? test["def"] : (includeInput === true ? validPos["input"] : opts.placeholder.charAt(pos % opts.placeholder.length)));
                     } else {
                         var testPos = getTests(pos, false, ndxIntlzr, pos - 1);
                         testPos = testPos[opts.greedy || minimalPos > pos ? 0 : (testPos.length - 1)];
@@ -236,7 +238,7 @@
                         maskTemplate.push(test["fn"] == null ? test["def"] : opts.placeholder.charAt(pos % opts.placeholder.length));
                     }
                     pos++;
-                } while (test["fn"] != null || (test["fn"] == null && test["def"] != "") || minimalPos >= pos);
+                } while ((maxLength == undefined || (pos - 1 < maxLength && maxLength > -1)) && test["fn"] != null || (test["fn"] == null && test["def"] != "") || minimalPos >= pos);
                 maskTemplate.pop(); //drop the last one which is empty
                 return maskTemplate;
             }
@@ -248,6 +250,7 @@
                 maskset["buffer"] = undefined;
                 maskset["_buffer"] = undefined;
                 maskset["validPositions"] = {};
+                maskset["tests"] = {};
                 maskset["p"] = -1;
             }
             function getLastValidPosition(maskset, closestTo) { //TODO implement closest to
@@ -259,6 +262,16 @@
                 }
                 return lastValidPosition;
             }
+            function setValidPosition(pos, validTest, strict) {
+                if (opts.insertMode && getMaskSet()["validPositions"][pos] != undefined) {
+                    var currentValid = getMaskSet()["validPositions"][pos];
+                    getMaskSet()["validPositions"][pos] = validTest;
+                    //reposition & revalidate others
+
+                    isValid(pos + 1, currentValid["input"], strict);
+                } else
+                    getMaskSet()["validPositions"][pos] = validTest;
+            }
             function getTest(pos) {
                 if (getMaskSet()['validPositions'][pos]) {
                     return getMaskSet()['validPositions'][pos]["match"];
@@ -369,7 +382,7 @@
             }
             function getBuffer() {
                 if (getMaskSet()['buffer'] == undefined) {
-                    getMaskSet()['buffer'] = getMaskTemplate(true);
+                    getMaskSet()['buffer'] = getMaskTemplate(true, 0, true);
                 }
                 return getMaskSet()['buffer'];
             }
@@ -391,8 +404,8 @@
                         //return is false or a json object => { pos: ??, c: ??} or true
                         rslt = test.fn != null ?
                             test.fn.test(chrs, buffer, position, strict, opts)
-                            : (c == getPlaceholder(position) || c == opts.skipOptionalPartCharacter) ?
-                                { "refresh": true, c: getPlaceholder(position), pos: position }
+                            : (c == test["def"] || c == opts.skipOptionalPartCharacter) ?
+                                { "refresh": ndx == 0, c: test["def"], pos: position }
                                 : false;
 
                         if (rslt !== false) {
@@ -407,11 +420,19 @@
                             }
 
                             var validatedPos = position;
-                            if (rslt !== true && rslt["pos"] != position) {
+                            if (rslt !== true && rslt["pos"] != position) { //their is an position offset
+                                setValidPosition(position, $.extend({}, tst, { "input": buffer[position] }), strict);
                                 validatedPos = rslt["pos"];
+                                for (var op = position + 1; op < validatedPos; op++) {
+                                    setValidPosition(op, $.extend({}, getTests(op, !strict)[0], { "input": buffer[op] }), strict);
+                                }
                                 tst = getTests(validatedPos, !strict)[0]; //possible mismatch TODO
                             }
-                            getMaskSet()["validPositions"][validatedPos] = $.extend({}, tst, { "input": elem });
+                            if (ndx != 0) {
+                                getMaskSet()["buffer"] = undefined;
+                                getMaskSet()["tests"] = {}; //clear the tests cache
+                            }
+                            setValidPosition(validatedPos, $.extend({}, tst, { "input": elem }), strict);
                             return false; //break from $.each
                         }
                     });
@@ -439,7 +460,7 @@
                 return test.fn != null ? test.fn : false;
             }
             function getMaskLength() {
-                var maxLength = $el.prop('maxLength'), maskLength;
+                var maskLength; maxLength = $el.prop('maxLength');
                 if (opts.greedy == false) {
                     var lvp = getLastValidPosition() + 1,
                         test = getTest(lvp);
@@ -978,15 +999,7 @@
                             }
                             if (refresh !== true) {
                                 if (opts.insertMode == true) {
-                                    var freePos = p;
-                                    if (getBufferElement(buffer, p) != getPlaceholder(p)) {
-                                        while (getMaskSet()["validPositions"][freePos]) {
-                                            freePos = seekNext(freePos);
-                                        }
-                                    }
-                                    if (freePos < getMaskLength()) {
-                                        shiftR(p, getMaskLength(), c);
-                                    } else getMaskSet()["writeOutBuffer"] = false;
+                                    getMaskSet()["buffer"] = undefined;
                                 } else setBufferElement(buffer, p, c);
                             }
                             forwardPosition = seekNext(p);

+ 29 - 5
qunit/tests.js

@@ -2125,19 +2125,19 @@ test("inputmask(\"9-a{3}9{3}\" - simple dynamic mask", function () {
 test("inputmask(\"9-a{1,3}9{1,3}\" - simple dynamic mask", function () {
     var $fixture = $( "#qunit-fixture" );
 	$fixture.append('<input type="text" id="testmask" />');
-    $("#testmask").inputmask("9-a{1,3}9{1,3}")
+    $("#testmask").inputmask("9-a{1,3}9{1,3}");
 
     $("#testmask")[0].focus();
     $("#testmask").Type("1a1");
 
-    equal($("#testmask").val(), "1-a1", "Result " + $("#testmask").val());
+    equal($("#testmask").val(), "1-a1__", "Result " + $("#testmask").val());
 
     $("#testmask").remove();
 });
 test("inputmask(\"9-a{1,3}9{1,3}\" - simple dynamic mask - greedy false", function () {
     var $fixture = $( "#qunit-fixture" );
 	$fixture.append('<input type="text" id="testmask" />');
-    $("#testmask").inputmask("9-a{1,3}9{1,3}", { greedy: false })
+    $("#testmask").inputmask("9-a{1,3}9{1,3}", { greedy: false });
 
     $("#testmask")[0].focus();
     $("#testmask").Type("1a1");
@@ -2146,10 +2146,34 @@ test("inputmask(\"9-a{1,3}9{1,3}\" - simple dynamic mask - greedy false", functi
 
     $("#testmask").remove();
 });
-test("inputmask(\"*{1,20}@*{1,20}.*{2,6}[.*{2}]\" - email mask", function () {
+test("inputmask(\"9-a{1,3}/9{2,3}\" - simple dynamic mask - greedy true", function () {
+    var $fixture = $( "#qunit-fixture" );
+	$fixture.append('<input type="text" id="testmask" />');
+    $("#testmask").inputmask("9-a{1,3}/9{2,3}", { greedy: true });
+
+    $("#testmask")[0].focus();
+    $("#testmask").Type("1a/123");
+
+    equal($("#testmask").val(), "1-a/123", "Result " + $("#testmask").val());
+
+    $("#testmask").remove();
+});
+test("inputmask(\"*{1,20}[.*{1,20}][.*{1,20}]@*{1,20}.*{2,6}[.*{2}]\" - email mask greedy false", function () {
+    var $fixture = $( "#qunit-fixture" );
+	$fixture.append('<input type="text" id="testmask" />');
+    $("#testmask").inputmask("*{1,20}[.*{1,20}][.*{1,20}]@*{1,20}.*{2,6}[.*{2}]",{ greedy: false });
+
+    $("#testmask")[0].focus();
+    $("#testmask").Type("some.body@mail.com");
+
+    equal($("#testmask").val(), "some.body@mail.com", "Result " + $("#testmask").val());
+
+    $("#testmask").remove();
+});
+test("inputmask(\"*{1,20}[.*{1,20}][.*{1,20}]@*{1,20}.*{2,6}[.*{2}]\" - email mask greedy true", function () {
     var $fixture = $( "#qunit-fixture" );
 	$fixture.append('<input type="text" id="testmask" />');
-    $("#testmask").inputmask("*{1,20}@*{1,20}.*{2,6}[.*{2}]")
+    $("#testmask").inputmask("*{1,20}[.*{1,20}][.*{1,20}]@*{1,20}.*{2,6}[.*{2}]",{ greedy: true });
 
     $("#testmask")[0].focus();
     $("#testmask").Type("some.body@mail.com");