|
1 | 1 | /* |
2 | 2 | jQuery Masked Input Plugin |
3 | | - Copyright (c) 2007 - 2013 Josh Bush (digitalbush.com) |
| 3 | + Copyright (c) 2007 - 2014 Josh Bush (digitalbush.com) |
4 | 4 | Licensed under the MIT license (http://digitalbush.com/projects/masked-input-plugin/#license) |
5 | 5 | Version: 1.3.1 |
6 | 6 | */ |
|
38 | 38 | return this.trigger("unmask"); |
39 | 39 | }, |
40 | 40 | mask: function(mask, settings) { |
41 | | - var input, defs, tests, partialPosition, firstNonMaskPos, len; |
| 41 | + var input, defs, tests, partialPosition, firstNonMaskPos, len, oldVal; |
42 | 42 | return !mask && this.length > 0 ? (input = $(this[0]), input.data($.mask.dataName)()) : (settings = $.extend({ |
43 | 43 | autoclear: $.mask.autoclear, |
44 | 44 | placeholder: $.mask.placeholder, |
|
73 | 73 | c = t; |
74 | 74 | } |
75 | 75 | } |
| 76 | + function androidInputEvent() { |
| 77 | + var curVal = input.val(), pos = input.caret(); |
| 78 | + if (curVal.length < oldVal.length) { |
| 79 | + for (checkVal(!0); pos.begin > 0 && !tests[pos.begin - 1]; ) pos.begin--; |
| 80 | + if (0 === pos.begin) for (;pos.begin < firstNonMaskPos && !tests[pos.begin]; ) pos.begin++; |
| 81 | + input.caret(pos.begin, pos.begin); |
| 82 | + } else { |
| 83 | + for (checkVal(!0); pos.begin < len && !tests[pos.begin]; ) pos.begin++; |
| 84 | + input.caret(pos.begin, pos.begin); |
| 85 | + } |
| 86 | + settings.completed && pos == input.val().length && settings.completed.call(input); |
| 87 | + } |
| 88 | + function blurEvent() { |
| 89 | + checkVal(), input.val() != focusText && input.change(); |
| 90 | + } |
76 | 91 | function keydownEvent(e) { |
77 | 92 | var pos, begin, end, k = e.which; |
78 | | - 8 === k || 46 === k || iPhone && 127 === k ? (pos = input.caret(), begin = pos.begin, |
79 | | - end = pos.end, 0 === end - begin && (begin = 46 !== k ? seekPrev(begin) : end = seekNext(begin - 1), |
| 93 | + oldVal = input.val(), 8 === k || 46 === k || iPhone && 127 === k ? (pos = input.caret(), |
| 94 | + begin = pos.begin, end = pos.end, end - begin === 0 && (begin = 46 !== k ? seekPrev(begin) : end = seekNext(begin - 1), |
80 | 95 | end = 46 === k ? seekNext(end) : end), clearBuffer(begin, end), shiftL(begin, end - 1), |
81 | | - e.preventDefault()) : 27 == k && (input.val(focusText), input.caret(0, checkVal()), |
82 | | - e.preventDefault()); |
| 96 | + e.preventDefault()) : 13 === k ? blurEvent.call(this, e) : 27 === k && (input.val(focusText), |
| 97 | + input.caret(0, checkVal()), e.preventDefault()); |
83 | 98 | } |
84 | 99 | function keypressEvent(e) { |
85 | 100 | var p, c, next, k = e.which, pos = input.caret(); |
|
89 | 104 | pos.begin == pos.end && (k = input.val().charCodeAt(pos.begin - 1), pos.begin--, |
90 | 105 | pos.end--); |
91 | 106 | } |
92 | | - e.ctrlKey || e.altKey || e.metaKey || 32 > k || k && (0 !== pos.end - pos.begin && (clearBuffer(pos.begin, pos.end), |
93 | | - shiftL(pos.begin, pos.end - 1)), p = seekNext(pos.begin - 1), len > p && (c = String.fromCharCode(k), |
94 | | - tests[p].test(c) && (shiftR(p), buffer[p] = c, writeBuffer(), next = seekNext(p), |
95 | | - android ? setTimeout($.proxy($.fn.caret, input, next), 0) : input.caret(next), settings.completed && next >= len && settings.completed.call(input))), |
96 | | - e.preventDefault()); |
| 107 | + if (!(e.ctrlKey || e.altKey || e.metaKey || 32 > k) && k && 13 !== k) { |
| 108 | + if (pos.end - pos.begin !== 0 && (clearBuffer(pos.begin, pos.end), shiftL(pos.begin, pos.end - 1)), |
| 109 | + p = seekNext(pos.begin - 1), len > p && (c = String.fromCharCode(k), tests[p].test(c))) { |
| 110 | + if (shiftR(p), buffer[p] = c, writeBuffer(), next = seekNext(p), android) { |
| 111 | + var proxy = function() { |
| 112 | + $.proxy($.fn.caret, input, next)(); |
| 113 | + }; |
| 114 | + setTimeout(proxy, 0); |
| 115 | + } else input.caret(next); |
| 116 | + settings.completed && next >= len && settings.completed.call(input); |
| 117 | + } |
| 118 | + e.preventDefault(); |
| 119 | + } |
97 | 120 | } |
98 | 121 | function clearBuffer(start, end) { |
99 | 122 | var i; |
|
112 | 135 | } |
113 | 136 | if (pos > test.length) break; |
114 | 137 | } else buffer[i] === test.charAt(pos) && i !== partialPosition && (pos++, lastMatch = i); |
115 | | - return allow ? writeBuffer() : partialPosition > lastMatch + 1 ? settings.autoclear || buffer.join("") === defaultBuffer ? (input.val(""), |
| 138 | + return allow ? writeBuffer() : partialPosition > lastMatch + 1 ? settings.autoclear || buffer.join("") === defaultBuffer ? (input.val() && input.val(""), |
116 | 139 | clearBuffer(0, len)) : writeBuffer() : (writeBuffer(), input.val(input.val().substring(0, lastMatch + 1))), |
117 | 140 | partialPosition ? i : firstNonMaskPos; |
118 | 141 | } |
|
124 | 147 | return tests[i] && c != settings.placeholder ? c : null; |
125 | 148 | }).join(""); |
126 | 149 | }), input.attr("readonly") || input.one("unmask", function() { |
127 | | - input.unbind(".mask").removeData($.mask.dataName); |
128 | | - }).bind("focus.mask", function() { |
| 150 | + input.off(".mask").removeData($.mask.dataName); |
| 151 | + }).on("focus.mask", function() { |
129 | 152 | clearTimeout(caretTimeoutId); |
130 | 153 | var pos; |
131 | 154 | focusText = input.val(), pos = checkVal(), caretTimeoutId = setTimeout(function() { |
132 | | - writeBuffer(), pos == mask.length ? input.caret(0, pos) : input.caret(pos); |
| 155 | + writeBuffer(), pos == mask.replace("?", "").length ? input.caret(0, pos) : input.caret(pos); |
133 | 156 | }, 10); |
134 | | - }).bind("blur.mask", function() { |
135 | | - checkVal(), input.val() != focusText && input.change(); |
136 | | - }).bind("keydown.mask", keydownEvent).bind("keypress.mask", keypressEvent).bind(pasteEventName, function() { |
| 157 | + }).on("blur.mask", blurEvent).on("keydown.mask", keydownEvent).on("keypress.mask", keypressEvent).on(pasteEventName, function() { |
137 | 158 | setTimeout(function() { |
138 | 159 | var pos = checkVal(!0); |
139 | 160 | input.caret(pos), settings.completed && pos == input.val().length && settings.completed.call(input); |
140 | 161 | }, 0); |
141 | | - }), chrome && android && input.bind("keyup.mask", keypressEvent), checkVal(); |
| 162 | + }), chrome && android && input.off("input.mask").on("input.mask", androidInputEvent), |
| 163 | + checkVal(); |
142 | 164 | })); |
143 | 165 | } |
144 | 166 | }); |
|
0 commit comments