Browse Source

enhance caret positioning for android

Robin Herbots 8 years ago
parent
commit
0daf06e3ab
43 changed files with 149 additions and 93 deletions
  1. 1 1
      bower.json
  2. 1 1
      component.json
  3. 1 1
      composer.json
  4. 1 1
      dist/inputmask/bindings/inputmask.binding.js
  5. 1 1
      dist/inputmask/dependencyLibs/inputmask.dependencyLib.jqlite.js
  6. 1 1
      dist/inputmask/dependencyLibs/inputmask.dependencyLib.jquery.js
  7. 1 1
      dist/inputmask/dependencyLibs/inputmask.dependencyLib.js
  8. 1 1
      dist/inputmask/global/document.js
  9. 1 1
      dist/inputmask/global/window.js
  10. 1 1
      dist/inputmask/inputmask.date.extensions.js
  11. 1 1
      dist/inputmask/inputmask.extensions.js
  12. 25 13
      dist/inputmask/inputmask.js
  13. 1 1
      dist/inputmask/inputmask.numeric.extensions.js
  14. 1 1
      dist/inputmask/inputmask.phone.extensions.js
  15. 1 1
      dist/inputmask/inputmask.regex.extensions.js
  16. 1 1
      dist/inputmask/jquery.inputmask.js
  17. 1 1
      dist/inputmask/phone-codes/phone-be.js
  18. 1 1
      dist/inputmask/phone-codes/phone-nl.js
  19. 1 1
      dist/inputmask/phone-codes/phone-ru.js
  20. 1 1
      dist/inputmask/phone-codes/phone-uk.js
  21. 1 1
      dist/inputmask/phone-codes/phone.js
  22. 25 13
      dist/jquery.inputmask.bundle.js
  23. 1 1
      dist/min/inputmask/bindings/inputmask.binding.min.js
  24. 1 1
      dist/min/inputmask/dependencyLibs/inputmask.dependencyLib.jqlite.min.js
  25. 1 1
      dist/min/inputmask/dependencyLibs/inputmask.dependencyLib.jquery.min.js
  26. 1 1
      dist/min/inputmask/dependencyLibs/inputmask.dependencyLib.min.js
  27. 1 1
      dist/min/inputmask/global/document.min.js
  28. 1 1
      dist/min/inputmask/global/window.min.js
  29. 1 1
      dist/min/inputmask/inputmask.date.extensions.min.js
  30. 1 1
      dist/min/inputmask/inputmask.extensions.min.js
  31. 3 3
      dist/min/inputmask/inputmask.min.js
  32. 1 1
      dist/min/inputmask/inputmask.numeric.extensions.min.js
  33. 1 1
      dist/min/inputmask/inputmask.phone.extensions.min.js
  34. 1 1
      dist/min/inputmask/inputmask.regex.extensions.min.js
  35. 1 1
      dist/min/inputmask/jquery.inputmask.min.js
  36. 1 1
      dist/min/inputmask/phone-codes/phone-be.min.js
  37. 1 1
      dist/min/inputmask/phone-codes/phone-nl.min.js
  38. 1 1
      dist/min/inputmask/phone-codes/phone-ru.min.js
  39. 1 1
      dist/min/inputmask/phone-codes/phone-uk.min.js
  40. 1 1
      dist/min/inputmask/phone-codes/phone.min.js
  41. 4 4
      dist/min/jquery.inputmask.bundle.min.js
  42. 54 22
      js/inputmask.js
  43. 1 1
      package.json

+ 1 - 1
bower.json

@@ -1,6 +1,6 @@
 {
   "name": "jquery.inputmask",
-  "version": "3.3.5-172",
+  "version": "3.3.5-173",
   "main": [
 	  "./dist/inputmask/inputmask.js",
 	  "./dist/inputmask/inputmask.extensions.js",

+ 1 - 1
component.json

@@ -2,7 +2,7 @@
 	"name": "jquery_inputmask",
 	"repository": "robinherbots/jquery.inputmask",
 	"description": "jquery.inputmask is a jquery plugin which create an input mask.",
-	"version": "3.3.5-172",
+	"version": "3.3.5-173",
 	"keywords": [
 		"jquery",
 		"plugins",

+ 1 - 1
composer.json

@@ -1,7 +1,7 @@
 {
   "name": "robinherbots/jquery.inputmask",
   "description": "jquery.inputmask is a jquery plugin which create an input mask.",
-  "version": "3.3.5-172",
+  "version": "3.3.5-173",
   "type": "library",
   "keywords": ["jquery", "plugins", "input", "form", "inputmask", "mask"],
   "homepage": "http://robinherbots.github.io/jquery.inputmask",

+ 1 - 1
dist/inputmask/bindings/inputmask.binding.js

@@ -3,7 +3,7 @@
 * https://github.com/RobinHerbots/jquery.inputmask
 * Copyright (c) 2010 - 2017 Robin Herbots
 * Licensed under the MIT license (http://www.opensource.org/licenses/mit-license.php)
-* Version: 3.3.5-172
+* Version: 3.3.5-173
 */
 !function(factory) {
     "function" == typeof define && define.amd ? define([ "jquery", "../inputmask", "../global/document" ], factory) : "object" == typeof exports ? module.exports = factory(require("jquery"), require("../inputmask"), require("../global/document")) : factory(jQuery, window.Inputmask, document);

+ 1 - 1
dist/inputmask/dependencyLibs/inputmask.dependencyLib.jqlite.js

@@ -3,7 +3,7 @@
 * https://github.com/RobinHerbots/jquery.inputmask
 * Copyright (c) 2010 - 2017 Robin Herbots
 * Licensed under the MIT license (http://www.opensource.org/licenses/mit-license.php)
-* Version: 3.3.5-172
+* Version: 3.3.5-173
 */
 !function(factory) {
     "function" == typeof define && define.amd ? define([ "jqlite", "../global/window", "../global/document]" ], factory) : "object" == typeof exports ? module.exports = factory(require("jqlite"), require("../global/window"), require("../global/document")) : window.dependencyLib = factory(jqlite, window, document);

+ 1 - 1
dist/inputmask/dependencyLibs/inputmask.dependencyLib.jquery.js

@@ -3,7 +3,7 @@
 * https://github.com/RobinHerbots/jquery.inputmask
 * Copyright (c) 2010 - 2017 Robin Herbots
 * Licensed under the MIT license (http://www.opensource.org/licenses/mit-license.php)
-* Version: 3.3.5-172
+* Version: 3.3.5-173
 */
 !function(factory) {
     "function" == typeof define && define.amd ? define([ "jquery" ], factory) : "object" == typeof exports ? module.exports = factory(require("jquery")) : window.dependencyLib = factory(jQuery);

+ 1 - 1
dist/inputmask/dependencyLibs/inputmask.dependencyLib.js

@@ -3,7 +3,7 @@
 * https://github.com/RobinHerbots/jquery.inputmask
 * Copyright (c) 2010 - 2017 Robin Herbots
 * Licensed under the MIT license (http://www.opensource.org/licenses/mit-license.php)
-* Version: 3.3.5-172
+* Version: 3.3.5-173
 */
 !function(factory) {
     "function" == typeof define && define.amd ? define([ "../global/window", "../global/document" ], factory) : "object" == typeof exports ? module.exports = factory(require("../global/window"), require("../global/document")) : window.dependencyLib = factory(window, document);

+ 1 - 1
dist/inputmask/global/document.js

@@ -3,7 +3,7 @@
 * https://github.com/RobinHerbots/jquery.inputmask
 * Copyright (c) 2010 - 2017 Robin Herbots
 * Licensed under the MIT license (http://www.opensource.org/licenses/mit-license.php)
-* Version: 3.3.5-172
+* Version: 3.3.5-173
 */
 "function" == typeof define && define.amd ? define(function() {
     return document;

+ 1 - 1
dist/inputmask/global/window.js

@@ -3,7 +3,7 @@
 * https://github.com/RobinHerbots/jquery.inputmask
 * Copyright (c) 2010 - 2017 Robin Herbots
 * Licensed under the MIT license (http://www.opensource.org/licenses/mit-license.php)
-* Version: 3.3.5-172
+* Version: 3.3.5-173
 */
 "function" == typeof define && define.amd ? define(function() {
     return window;

+ 1 - 1
dist/inputmask/inputmask.date.extensions.js

@@ -3,7 +3,7 @@
 * https://github.com/RobinHerbots/jquery.inputmask
 * Copyright (c) 2010 - 2017 Robin Herbots
 * Licensed under the MIT license (http://www.opensource.org/licenses/mit-license.php)
-* Version: 3.3.5-172
+* Version: 3.3.5-173
 */
 !function(factory) {
     "function" == typeof define && define.amd ? define([ "./dependencyLibs/inputmask.dependencyLib", "./inputmask" ], factory) : "object" == typeof exports ? module.exports = factory(require("./dependencyLibs/inputmask.dependencyLib"), require("./inputmask")) : factory(window.dependencyLib || jQuery, window.Inputmask);

+ 1 - 1
dist/inputmask/inputmask.extensions.js

@@ -3,7 +3,7 @@
 * https://github.com/RobinHerbots/jquery.inputmask
 * Copyright (c) 2010 - 2017 Robin Herbots
 * Licensed under the MIT license (http://www.opensource.org/licenses/mit-license.php)
-* Version: 3.3.5-172
+* Version: 3.3.5-173
 */
 !function(factory) {
     "function" == typeof define && define.amd ? define([ "./dependencyLibs/inputmask.dependencyLib", "./inputmask" ], factory) : "object" == typeof exports ? module.exports = factory(require("./dependencyLibs/inputmask.dependencyLib"), require("./inputmask")) : factory(window.dependencyLib || jQuery, window.Inputmask);

+ 25 - 13
dist/inputmask/inputmask.js

@@ -3,7 +3,7 @@
 * https://github.com/RobinHerbots/jquery.inputmask
 * Copyright (c) 2010 - 2017 Robin Herbots
 * Licensed under the MIT license (http://www.opensource.org/licenses/mit-license.php)
-* Version: 3.3.5-172
+* Version: 3.3.5-173
 */
 !function(factory) {
     "function" == typeof define && define.amd ? define([ "./dependencyLibs/inputmask.dependencyLib", "./global/window", "./global/document" ], factory) : "object" == typeof exports ? module.exports = factory(require("./dependencyLibs/inputmask.dependencyLib"), require("../global/window"), require("../global/document")) : window.Inputmask = factory(window.dependencyLib || jQuery, window, document);
@@ -539,7 +539,7 @@
             }
             return opts.placeholder.charAt(pos % opts.placeholder.length);
         }
-        function checkVal(input, writeOut, strict, nptvl, initiatingEvent, stickyCaret) {
+        function checkVal(input, writeOut, strict, nptvl, initiatingEvent) {
             function isTemplateMatch(ndx, charCodes) {
                 var charCodeNdx = getBufferTemplate().slice(ndx, seekNext(ndx)).join("").indexOf(charCodes);
                 return charCodeNdx !== -1 && !isMask(ndx) && getTest(ndx).match.nativeDef === charCodes.charAt(charCodes.length - 1);
@@ -560,18 +560,19 @@
                         result = EventHandlers.keypressEvent.call(input, keypress, !0, !1, strict, pos), 
                         initialNdx = pos + 1, charCodes = "";
                     } else result = EventHandlers.keypressEvent.call(input, keypress, !0, !1, !0, lvp + 1);
-                    if (!strict && $.isFunction(opts.onBeforeWrite) && (result = opts.onBeforeWrite(keypress, getBuffer(), result.forwardPosition, opts), 
-                    result && result.refreshFromBuffer)) {
-                        var refresh = result.refreshFromBuffer;
-                        refreshFromBuffer(refresh === !0 ? refresh : refresh.start, refresh.end, result.buffer), 
-                        resetMaskSet(!0), result.caret && (getMaskSet().p = result.caret);
+                    if (!strict && $.isFunction(opts.onBeforeWrite)) {
+                        var fp = result.forwardPosition;
+                        if (result = opts.onBeforeWrite(keypress, getBuffer(), result.forwardPosition, opts), 
+                        result.forwardPosition = fp, result && result.refreshFromBuffer) {
+                            var refresh = result.refreshFromBuffer;
+                            refreshFromBuffer(refresh === !0 ? refresh : refresh.start, refresh.end, result.buffer), 
+                            resetMaskSet(!0), result.caret && (getMaskSet().p = result.caret, result.forwardPosition = result.caret);
+                        }
                     }
                 }
             }), writeOut) {
-                var caretPos = undefined, lvp = getLastValidPosition();
-                document.activeElement === input && (initiatingEvent || result) && (caretPos = result && result.caret && stickyCaret !== !0 ? result.caret : caret(input).begin, 
-                !initiatingEvent || result !== !1 && result !== undefined || (caretPos = seekNext(getLastValidPosition(caretPos))), 
-                result && stickyCaret !== !0 && (caretPos < lvp + 1 || lvp === -1) && (caretPos = opts.numericInput && result.caret === undefined ? seekPrevious(result.forwardPosition) : result.forwardPosition)), 
+                var caretPos = undefined;
+                document.activeElement === input && result && (caretPos = opts.numericInput ? seekPrevious(result.forwardPosition) : result.forwardPosition), 
                 writeBuffer(input, getBuffer(), caretPos, initiatingEvent || new $.Event("checkval"));
             }
         }
@@ -1017,9 +1018,20 @@
                     }
                     if (caretPos.begin > inputValue.length && (caret(input, inputValue.length), caretPos = caret(input)), 
                     getBuffer().length - inputValue.length !== 1 || inputValue.charAt(caretPos.begin) === getBuffer()[caretPos.begin] || inputValue.charAt(caretPos.begin + 1) === getBuffer()[caretPos.begin] || isMask(caretPos.begin)) {
-                        for (var lvp = getLastValidPosition() + 1, bufferTemplate = getBufferTemplate().join(""); null === inputValue.match(Inputmask.escapeRegex(bufferTemplate) + "$"); ) bufferTemplate = bufferTemplate.slice(1);
+                        var stickyParts = [], bufferTemplate = getBufferTemplate().join("");
+                        for (stickyParts.push(inputValue.substr(0, caretPos.begin)), stickyParts.push(inputValue.substr(caretPos.begin)); null === inputValue.match(Inputmask.escapeRegex(bufferTemplate) + "$"); ) bufferTemplate = bufferTemplate.slice(1);
                         inputValue = inputValue.replace(bufferTemplate, ""), $.isFunction(opts.onBeforeMask) && (inputValue = opts.onBeforeMask(inputValue, opts) || inputValue), 
-                        inputValue = inputValue.split(""), checkVal(input, !0, !1, inputValue, e, caretPos.begin < lvp), 
+                        checkVal(input, !0, !1, inputValue.split(""), e);
+                        var currentPos = caret(input).begin, currentValue = input.inputmask._valueGet();
+                        if (0 === currentValue.indexOf(stickyParts[0]) && currentPos !== stickyParts[0].length) caret(input, stickyParts[0].length), 
+                        android && setTimeout(function() {
+                            caret(input, stickyParts[0].length);
+                        }, 0); else {
+                            var pos2 = currentValue.indexOf(stickyParts[1]);
+                            currentPos > pos2 && (caret(input, pos2), android && setTimeout(function() {
+                                caret(input, pos2);
+                            }, 0));
+                        }
                         isComplete(getBuffer()) === !0 && $(input).trigger("complete");
                     } else e.keyCode = Inputmask.keyCode.BACKSPACE, EventHandlers.keydownEvent.call(input, e);
                     e.preventDefault();

+ 1 - 1
dist/inputmask/inputmask.numeric.extensions.js

@@ -3,7 +3,7 @@
 * https://github.com/RobinHerbots/jquery.inputmask
 * Copyright (c) 2010 - 2017 Robin Herbots
 * Licensed under the MIT license (http://www.opensource.org/licenses/mit-license.php)
-* Version: 3.3.5-172
+* Version: 3.3.5-173
 */
 !function(factory) {
     "function" == typeof define && define.amd ? define([ "./dependencyLibs/inputmask.dependencyLib", "./inputmask" ], factory) : "object" == typeof exports ? module.exports = factory(require("./dependencyLibs/inputmask.dependencyLib"), require("./inputmask")) : factory(window.dependencyLib || jQuery, window.Inputmask);

+ 1 - 1
dist/inputmask/inputmask.phone.extensions.js

@@ -3,7 +3,7 @@
 * https://github.com/RobinHerbots/jquery.inputmask
 * Copyright (c) 2010 - 2017 Robin Herbots
 * Licensed under the MIT license (http://www.opensource.org/licenses/mit-license.php)
-* Version: 3.3.5-172
+* Version: 3.3.5-173
 */
 !function(factory) {
     "function" == typeof define && define.amd ? define([ "./dependencyLibs/inputmask.dependencyLib", "./inputmask" ], factory) : "object" == typeof exports ? module.exports = factory(require("./dependencyLibs/inputmask.dependencyLib"), require("./inputmask")) : factory(window.dependencyLib || jQuery, window.Inputmask);

+ 1 - 1
dist/inputmask/inputmask.regex.extensions.js

@@ -3,7 +3,7 @@
 * https://github.com/RobinHerbots/jquery.inputmask
 * Copyright (c) 2010 - 2017 Robin Herbots
 * Licensed under the MIT license (http://www.opensource.org/licenses/mit-license.php)
-* Version: 3.3.5-172
+* Version: 3.3.5-173
 */
 !function(factory) {
     "function" == typeof define && define.amd ? define([ "./dependencyLibs/inputmask.dependencyLib", "./inputmask" ], factory) : "object" == typeof exports ? module.exports = factory(require("./dependencyLibs/inputmask.dependencyLib"), require("./inputmask")) : factory(window.dependencyLib || jQuery, window.Inputmask);

+ 1 - 1
dist/inputmask/jquery.inputmask.js

@@ -3,7 +3,7 @@
 * https://github.com/RobinHerbots/jquery.inputmask
 * Copyright (c) 2010 - 2017 Robin Herbots
 * Licensed under the MIT license (http://www.opensource.org/licenses/mit-license.php)
-* Version: 3.3.5-172
+* Version: 3.3.5-173
 */
 !function(factory) {
     "function" == typeof define && define.amd ? define([ "jquery", "./inputmask" ], factory) : "object" == typeof exports ? module.exports = factory(require("jquery"), require("./inputmask")) : factory(jQuery, window.Inputmask);

+ 1 - 1
dist/inputmask/phone-codes/phone-be.js

@@ -3,7 +3,7 @@
 * https://github.com/RobinHerbots/jquery.inputmask
 * Copyright (c) 2010 - 2017 Robin Herbots
 * Licensed under the MIT license (http://www.opensource.org/licenses/mit-license.php)
-* Version: 3.3.5-172
+* Version: 3.3.5-173
 */
 !function(factory) {
     "function" == typeof define && define.amd ? define([ "../inputmask" ], factory) : "object" == typeof exports ? module.exports = factory(require("../inputmask")) : factory(window.Inputmask);

+ 1 - 1
dist/inputmask/phone-codes/phone-nl.js

@@ -3,7 +3,7 @@
 * https://github.com/RobinHerbots/jquery.inputmask
 * Copyright (c) 2010 - 2017 Robin Herbots
 * Licensed under the MIT license (http://www.opensource.org/licenses/mit-license.php)
-* Version: 3.3.5-172
+* Version: 3.3.5-173
 */
 !function(factory) {
     "function" == typeof define && define.amd ? define([ "../inputmask" ], factory) : "object" == typeof exports ? module.exports = factory(require("../inputmask")) : factory(window.Inputmask);

+ 1 - 1
dist/inputmask/phone-codes/phone-ru.js

@@ -3,7 +3,7 @@
 * https://github.com/RobinHerbots/jquery.inputmask
 * Copyright (c) 2010 - 2017 Robin Herbots
 * Licensed under the MIT license (http://www.opensource.org/licenses/mit-license.php)
-* Version: 3.3.5-172
+* Version: 3.3.5-173
 */
 !function(factory) {
     "function" == typeof define && define.amd ? define([ "../inputmask" ], factory) : "object" == typeof exports ? module.exports = factory(require("../inputmask")) : factory(window.Inputmask);

+ 1 - 1
dist/inputmask/phone-codes/phone-uk.js

@@ -3,7 +3,7 @@
 * https://github.com/RobinHerbots/jquery.inputmask
 * Copyright (c) 2010 - 2017 Robin Herbots
 * Licensed under the MIT license (http://www.opensource.org/licenses/mit-license.php)
-* Version: 3.3.5-172
+* Version: 3.3.5-173
 */
 !function(factory) {
     "function" == typeof define && define.amd ? define([ "../inputmask" ], factory) : "object" == typeof exports ? module.exports = factory(require("../inputmask")) : factory(window.Inputmask);

+ 1 - 1
dist/inputmask/phone-codes/phone.js

@@ -3,7 +3,7 @@
 * https://github.com/RobinHerbots/jquery.inputmask
 * Copyright (c) 2010 - 2017 Robin Herbots
 * Licensed under the MIT license (http://www.opensource.org/licenses/mit-license.php)
-* Version: 3.3.5-172
+* Version: 3.3.5-173
 */
 !function(factory) {
     "function" == typeof define && define.amd ? define([ "../inputmask" ], factory) : "object" == typeof exports ? module.exports = factory(require("../inputmask")) : factory(window.Inputmask);

+ 25 - 13
dist/jquery.inputmask.bundle.js

@@ -3,7 +3,7 @@
 * https://github.com/RobinHerbots/jquery.inputmask
 * Copyright (c) 2010 - 2017 Robin Herbots
 * Licensed under the MIT license (http://www.opensource.org/licenses/mit-license.php)
-* Version: 3.3.5-172
+* Version: 3.3.5-173
 */
 !function(factory) {
     window.Inputmask = factory(window.dependencyLib || jQuery, window, document);
@@ -539,7 +539,7 @@
             }
             return opts.placeholder.charAt(pos % opts.placeholder.length);
         }
-        function checkVal(input, writeOut, strict, nptvl, initiatingEvent, stickyCaret) {
+        function checkVal(input, writeOut, strict, nptvl, initiatingEvent) {
             function isTemplateMatch(ndx, charCodes) {
                 var charCodeNdx = getBufferTemplate().slice(ndx, seekNext(ndx)).join("").indexOf(charCodes);
                 return charCodeNdx !== -1 && !isMask(ndx) && getTest(ndx).match.nativeDef === charCodes.charAt(charCodes.length - 1);
@@ -560,18 +560,19 @@
                         result = EventHandlers.keypressEvent.call(input, keypress, !0, !1, strict, pos), 
                         initialNdx = pos + 1, charCodes = "";
                     } else result = EventHandlers.keypressEvent.call(input, keypress, !0, !1, !0, lvp + 1);
-                    if (!strict && $.isFunction(opts.onBeforeWrite) && (result = opts.onBeforeWrite(keypress, getBuffer(), result.forwardPosition, opts), 
-                    result && result.refreshFromBuffer)) {
-                        var refresh = result.refreshFromBuffer;
-                        refreshFromBuffer(refresh === !0 ? refresh : refresh.start, refresh.end, result.buffer), 
-                        resetMaskSet(!0), result.caret && (getMaskSet().p = result.caret);
+                    if (!strict && $.isFunction(opts.onBeforeWrite)) {
+                        var fp = result.forwardPosition;
+                        if (result = opts.onBeforeWrite(keypress, getBuffer(), result.forwardPosition, opts), 
+                        result.forwardPosition = fp, result && result.refreshFromBuffer) {
+                            var refresh = result.refreshFromBuffer;
+                            refreshFromBuffer(refresh === !0 ? refresh : refresh.start, refresh.end, result.buffer), 
+                            resetMaskSet(!0), result.caret && (getMaskSet().p = result.caret, result.forwardPosition = result.caret);
+                        }
                     }
                 }
             }), writeOut) {
-                var caretPos = undefined, lvp = getLastValidPosition();
-                document.activeElement === input && (initiatingEvent || result) && (caretPos = result && result.caret && stickyCaret !== !0 ? result.caret : caret(input).begin, 
-                !initiatingEvent || result !== !1 && result !== undefined || (caretPos = seekNext(getLastValidPosition(caretPos))), 
-                result && stickyCaret !== !0 && (caretPos < lvp + 1 || lvp === -1) && (caretPos = opts.numericInput && result.caret === undefined ? seekPrevious(result.forwardPosition) : result.forwardPosition)), 
+                var caretPos = undefined;
+                document.activeElement === input && result && (caretPos = opts.numericInput ? seekPrevious(result.forwardPosition) : result.forwardPosition), 
                 writeBuffer(input, getBuffer(), caretPos, initiatingEvent || new $.Event("checkval"));
             }
         }
@@ -1017,9 +1018,20 @@
                     }
                     if (caretPos.begin > inputValue.length && (caret(input, inputValue.length), caretPos = caret(input)), 
                     getBuffer().length - inputValue.length !== 1 || inputValue.charAt(caretPos.begin) === getBuffer()[caretPos.begin] || inputValue.charAt(caretPos.begin + 1) === getBuffer()[caretPos.begin] || isMask(caretPos.begin)) {
-                        for (var lvp = getLastValidPosition() + 1, bufferTemplate = getBufferTemplate().join(""); null === inputValue.match(Inputmask.escapeRegex(bufferTemplate) + "$"); ) bufferTemplate = bufferTemplate.slice(1);
+                        var stickyParts = [], bufferTemplate = getBufferTemplate().join("");
+                        for (stickyParts.push(inputValue.substr(0, caretPos.begin)), stickyParts.push(inputValue.substr(caretPos.begin)); null === inputValue.match(Inputmask.escapeRegex(bufferTemplate) + "$"); ) bufferTemplate = bufferTemplate.slice(1);
                         inputValue = inputValue.replace(bufferTemplate, ""), $.isFunction(opts.onBeforeMask) && (inputValue = opts.onBeforeMask(inputValue, opts) || inputValue), 
-                        inputValue = inputValue.split(""), checkVal(input, !0, !1, inputValue, e, caretPos.begin < lvp), 
+                        checkVal(input, !0, !1, inputValue.split(""), e);
+                        var currentPos = caret(input).begin, currentValue = input.inputmask._valueGet();
+                        if (0 === currentValue.indexOf(stickyParts[0]) && currentPos !== stickyParts[0].length) caret(input, stickyParts[0].length), 
+                        android && setTimeout(function() {
+                            caret(input, stickyParts[0].length);
+                        }, 0); else {
+                            var pos2 = currentValue.indexOf(stickyParts[1]);
+                            currentPos > pos2 && (caret(input, pos2), android && setTimeout(function() {
+                                caret(input, pos2);
+                            }, 0));
+                        }
                         isComplete(getBuffer()) === !0 && $(input).trigger("complete");
                     } else e.keyCode = Inputmask.keyCode.BACKSPACE, EventHandlers.keydownEvent.call(input, e);
                     e.preventDefault();

File diff suppressed because it is too large
+ 1 - 1
dist/min/inputmask/bindings/inputmask.binding.min.js


File diff suppressed because it is too large
+ 1 - 1
dist/min/inputmask/dependencyLibs/inputmask.dependencyLib.jqlite.min.js


+ 1 - 1
dist/min/inputmask/dependencyLibs/inputmask.dependencyLib.jquery.min.js

@@ -3,6 +3,6 @@
 * https://github.com/RobinHerbots/jquery.inputmask
 * Copyright (c) 2010 - 2017 Robin Herbots
 * Licensed under the MIT license (http://www.opensource.org/licenses/mit-license.php)
-* Version: 3.3.5-172
+* Version: 3.3.5-173
 */
 !function(a){"function"==typeof define&&define.amd?define(["jquery"],a):"object"==typeof exports?module.exports=a(require("jquery")):window.dependencyLib=a(jQuery)}(function(a){return a});

File diff suppressed because it is too large
+ 1 - 1
dist/min/inputmask/dependencyLibs/inputmask.dependencyLib.min.js


+ 1 - 1
dist/min/inputmask/global/document.min.js

@@ -3,6 +3,6 @@
 * https://github.com/RobinHerbots/jquery.inputmask
 * Copyright (c) 2010 - 2017 Robin Herbots
 * Licensed under the MIT license (http://www.opensource.org/licenses/mit-license.php)
-* Version: 3.3.5-172
+* Version: 3.3.5-173
 */
 "function"==typeof define&&define.amd?define(function(){return document}):"object"==typeof exports&&(module.exports=document);

+ 1 - 1
dist/min/inputmask/global/window.min.js

@@ -3,6 +3,6 @@
 * https://github.com/RobinHerbots/jquery.inputmask
 * Copyright (c) 2010 - 2017 Robin Herbots
 * Licensed under the MIT license (http://www.opensource.org/licenses/mit-license.php)
-* Version: 3.3.5-172
+* Version: 3.3.5-173
 */
 "function"==typeof define&&define.amd?define(function(){return window}):"object"==typeof exports&&(module.exports=window);

File diff suppressed because it is too large
+ 1 - 1
dist/min/inputmask/inputmask.date.extensions.min.js


File diff suppressed because it is too large
+ 1 - 1
dist/min/inputmask/inputmask.extensions.min.js


File diff suppressed because it is too large
+ 3 - 3
dist/min/inputmask/inputmask.min.js


File diff suppressed because it is too large
+ 1 - 1
dist/min/inputmask/inputmask.numeric.extensions.min.js


File diff suppressed because it is too large
+ 1 - 1
dist/min/inputmask/inputmask.phone.extensions.min.js


File diff suppressed because it is too large
+ 1 - 1
dist/min/inputmask/inputmask.regex.extensions.min.js


File diff suppressed because it is too large
+ 1 - 1
dist/min/inputmask/jquery.inputmask.min.js


File diff suppressed because it is too large
+ 1 - 1
dist/min/inputmask/phone-codes/phone-be.min.js


File diff suppressed because it is too large
+ 1 - 1
dist/min/inputmask/phone-codes/phone-nl.min.js


File diff suppressed because it is too large
+ 1 - 1
dist/min/inputmask/phone-codes/phone-ru.min.js


File diff suppressed because it is too large
+ 1 - 1
dist/min/inputmask/phone-codes/phone-uk.min.js


File diff suppressed because it is too large
+ 1 - 1
dist/min/inputmask/phone-codes/phone.min.js


File diff suppressed because it is too large
+ 4 - 4
dist/min/jquery.inputmask.bundle.min.js


+ 54 - 22
js/inputmask.js

@@ -1769,7 +1769,7 @@
 			return opts.placeholder.charAt(pos % opts.placeholder.length);
 		}
 
-		function checkVal(input, writeOut, strict, nptvl, initiatingEvent, stickyCaret) {
+		function checkVal(input, writeOut, strict, nptvl, initiatingEvent) {
 			var inputValue = nptvl.slice(),
 				charCodes = "",
 				initialNdx = 0, result = undefined;
@@ -1814,25 +1814,25 @@
 						result = EventHandlers.keypressEvent.call(input, keypress, true, false, true, lvp + 1);
 					}
 					if (!strict && $.isFunction(opts.onBeforeWrite)) {
+						var fp = result.forwardPosition;
 						result = opts.onBeforeWrite(keypress, getBuffer(), result.forwardPosition, opts);
+						result.forwardPosition = fp;
 						if (result && result.refreshFromBuffer) {
 							var refresh = result.refreshFromBuffer;
 							refreshFromBuffer(refresh === true ? refresh : refresh.start, refresh.end, result.buffer);
 							resetMaskSet(true);
 							if (result.caret) {
 								getMaskSet().p = result.caret;
+								result.forwardPosition = result.caret;
 							}
 						}
 					}
 				}
 			});
 			if (writeOut) {
-				var caretPos = undefined, lvp = getLastValidPosition();
-				if (document.activeElement === input && (initiatingEvent || result)) {
-					caretPos = result && result.caret && stickyCaret !== true ? result.caret : caret(input).begin;
-					if (initiatingEvent && (result === false || result === undefined)) caretPos = seekNext(getLastValidPosition(caretPos));
-					if (result && stickyCaret !== true && (caretPos < lvp + 1 || lvp === -1))
-						caretPos = (opts.numericInput && result.caret === undefined) ? seekPrevious(result.forwardPosition) : result.forwardPosition;
+				var caretPos = undefined;
+				if (document.activeElement === input && result) {
+					caretPos = opts.numericInput ? seekPrevious(result.forwardPosition) : result.forwardPosition;
 				}
 
 				writeBuffer(input, getBuffer(), caretPos, initiatingEvent || new $.Event("checkval"));
@@ -2342,7 +2342,6 @@
 				var input = this,
 					inputValue = input.inputmask._valueGet();
 
-				//console.log(inputValue);
 				if (getBuffer().join("") !== inputValue) {
 					var caretPos = caret(input);
 					inputValue = inputValue.replace(new RegExp("(" + Inputmask.escapeRegex(getBufferTemplate().join("")) + ")*"), "");
@@ -2366,15 +2365,37 @@
 						e.keyCode = Inputmask.keyCode.BACKSPACE;
 						EventHandlers.keydownEvent.call(input, e);
 					} else {
-						var lvp = getLastValidPosition() + 1;
-						var bufferTemplate = getBufferTemplate().join(""); //getBuffer().slice(lvp).join('');
+						var stickyParts = [], bufferTemplate = getBufferTemplate().join("");
+						stickyParts.push(inputValue.substr(0, caretPos.begin));
+						stickyParts.push(inputValue.substr(caretPos.begin));
+
 						while (inputValue.match(Inputmask.escapeRegex(bufferTemplate) + "$") === null) {
 							bufferTemplate = bufferTemplate.slice(1);
 						}
 						inputValue = inputValue.replace(bufferTemplate, "");
 						if ($.isFunction(opts.onBeforeMask)) inputValue = opts.onBeforeMask(inputValue, opts) || inputValue;
-						inputValue = inputValue.split("");
-						checkVal(input, true, false, inputValue, e, caretPos.begin < lvp);
+
+						checkVal(input, true, false, inputValue.split(""), e);
+						//correct caret position
+						var currentPos = caret(input).begin, currentValue = input.inputmask._valueGet();
+						if (currentValue.indexOf(stickyParts[0]) === 0 && currentPos !== stickyParts[0].length) {
+							caret(input, stickyParts[0].length);
+							if (android) { //caret is set by android after inputevent
+								setTimeout(function () {
+									caret(input, stickyParts[0].length);
+								}, 0);
+							}
+						} else {
+							var pos2 = currentValue.indexOf(stickyParts[1]);
+							if (currentPos > pos2) {
+								caret(input, pos2);
+								if (android) { //caret is set by android after inputevent
+									setTimeout(function () {
+										caret(input, pos2);
+									}, 0);
+								}
+							}
+						}
 
 						if (isComplete(getBuffer()) === true) {
 							$(input).trigger("complete");
@@ -2395,7 +2416,9 @@
 				if ((opts.clearMaskOnLostFocus || opts.clearIncomplete) && input.inputmask._valueGet() === getBufferTemplate().join("")) {
 					input.inputmask._valueSet("");
 				}
-			},
+			}
+
+			,
 			focusEvent: function (e) {
 				var input = this,
 					nptValue = input.inputmask._valueGet();
@@ -2410,7 +2433,8 @@
 					EventHandlers.clickEvent.apply(input, [e, true]);
 				}
 				undoValue = getBuffer().join("");
-			},
+			}
+			,
 			mouseleaveEvent: function (e) {
 				var input = this;
 				mouseEnter = false;
@@ -2426,7 +2450,8 @@
 						writeBuffer(input, buffer);
 					}
 				}
-			},
+			}
+			,
 			clickEvent: function (e, tabbed) {
 				function doRadixFocus(clickPos) {
 					if (opts.radixPoint !== "") {
@@ -2485,13 +2510,15 @@
 						}
 					}
 				}, 0);
-			},
+			}
+			,
 			dblclickEvent: function (e) {
 				var input = this;
 				setTimeout(function () {
 					caret(input, 0, seekNext(getLastValidPosition()));
 				}, 0);
-			},
+			}
+			,
 			cutEvent: function (e) {
 				var input = this,
 					$input = $(input),
@@ -2510,7 +2537,8 @@
 				if (input.inputmask._valueGet() === getBufferTemplate().join("")) {
 					$input.trigger("cleared");
 				}
-			},
+			}
+			,
 			blurEvent: function (e) {
 				var $input = $(this),
 					input = this;
@@ -2548,7 +2576,8 @@
 						writeBuffer(input, buffer, undefined, e);
 					}
 				}
-			},
+			}
+			,
 			mouseenterEvent: function (e) {
 				var input = this;
 				mouseEnter = true;
@@ -2557,7 +2586,8 @@
 						writeBuffer(input, getBuffer());
 					}
 				}
-			},
+			}
+			,
 			submitEvent: function (e) { //trigger change on submit if any
 				if (undoValue !== getBuffer().join("")) {
 					$el.trigger("change");
@@ -2571,7 +2601,8 @@
 						writeBuffer(el, getBuffer());
 					}, 0);
 				}
-			},
+			}
+			,
 			resetEvent: function (e) {
 				el.inputmask.refreshValue = true; //indicate a forced refresh when there is a call to the value before leaving the triggering event fn
 				setTimeout(function () {
@@ -3064,4 +3095,5 @@
 
 //make inputmask available
 	return Inputmask;
-}));
+}))
+;

+ 1 - 1
package.json

@@ -1,6 +1,6 @@
 {
 	"name": "jquery.inputmask",
-	"version": "3.3.5-172",
+	"version": "3.3.5-173",
 	"description": "jquery.inputmask is a jquery plugin which create an input mask.",
 	"main": "dist/jquery.inputmask.bundle.js",
 	"files": [