|
15 | 15 | 'a': "[A-Za-z]", |
16 | 16 | '*': "[A-Za-z0-9]" |
17 | 17 | }, |
18 | | - dataName:"rawMaskFn" |
| 18 | + dataName:"rawMaskFn", |
| 19 | + extraData: "maskedit.extra" |
19 | 20 | }; |
20 | 21 |
|
21 | 22 | $.fn.extend({ |
|
51 | 52 | mask: function(mask, settings) { |
52 | 53 | if (!mask && this.length > 0) { |
53 | 54 | var input = $(this[0]); |
54 | | - return input.data($.mask.dataName)(); |
| 55 | + return input.data($.mask.dataName)(input); |
55 | 56 | } |
56 | 57 | settings = $.extend({ |
57 | 58 | placeholder: "_", |
|
71 | 72 | } else if (defs[c]) { |
72 | 73 | tests.push(new RegExp(defs[c])); |
73 | 74 | if(firstNonMaskPos==null) |
74 | | - firstNonMaskPos = tests.length - 1; |
| 75 | + firstNonMaskPos = tests.length - 1; |
75 | 76 | } else { |
76 | 77 | tests.push(null); |
77 | 78 | } |
78 | 79 | }); |
79 | 80 |
|
80 | 81 | return this.trigger("unmask").each(function() { |
81 | 82 | var input = $(this); |
82 | | - var buffer = $.map(mask.split(""), function(c, i) { if (c != '?') return defs[c] ? settings.placeholder : c }); |
83 | | - var focusText = input.val(); |
| 83 | + input.data($.mask.extraData, { focusText: input.val() }); |
| 84 | + |
| 85 | + function extra(input) { |
| 86 | + var data = input.data($.mask.extraData); |
| 87 | + if (data.input !== input[0]) { |
| 88 | + data = $.extend({}, data, { |
| 89 | + input: input[0], |
| 90 | + buffer: $.map(mask.split(""), function(c, i) { |
| 91 | + if (c != '?') return defs[c] ? settings.placeholder : c |
| 92 | + }) |
| 93 | + }); |
| 94 | + input.data($.mask.extraData, data); |
| 95 | + } |
| 96 | + return data; |
| 97 | + } |
| 98 | + |
| 99 | + function focusText(input, val) { |
| 100 | + if (arguments.length > 1) |
| 101 | + return extra(input).focusText = val; |
| 102 | + return extra(input).focusText; |
| 103 | + } |
| 104 | + |
| 105 | + function getBuffer(input) { |
| 106 | + return extra(input).buffer; |
| 107 | + } |
| 108 | + |
| 109 | + focusText(input, input.val()); |
84 | 110 |
|
85 | 111 | function seekNext(pos) { |
86 | 112 | while (++pos <= len && !tests[pos]); |
|
91 | 117 | return pos; |
92 | 118 | }; |
93 | 119 |
|
94 | | - function shiftL(begin,end) { |
| 120 | + function shiftL(input, begin,end) { |
95 | 121 | if(begin<0) |
96 | | - return; |
| 122 | + return; |
| 123 | + var buffer = getBuffer(input); |
97 | 124 | for (var i = begin,j = seekNext(end); i < len; i++) { |
98 | 125 | if (tests[i]) { |
99 | 126 | if (j < len && tests[i].test(buffer[j])) { |
|
104 | 131 | j = seekNext(j); |
105 | 132 | } |
106 | 133 | } |
107 | | - writeBuffer(); |
| 134 | + writeBuffer(input); |
108 | 135 | input.caret(Math.max(firstNonMaskPos, begin)); |
109 | 136 | }; |
110 | 137 |
|
111 | | - function shiftR(pos) { |
| 138 | + function shiftR(input, pos) { |
| 139 | + var buffer = getBuffer(input); |
112 | 140 | for (var i = pos, c = settings.placeholder; i < len; i++) { |
113 | 141 | if (tests[i]) { |
114 | 142 | var j = seekNext(i); |
|
124 | 152 |
|
125 | 153 | function keydownEvent(e) { |
126 | 154 | var k=e.which; |
| 155 | + var input = $(this); |
127 | 156 |
|
128 | 157 | //backspace, delete, and escape get special treatment |
129 | 158 | if(k == 8 || k == 46 || (iPhone && k == 127)){ |
|
135 | 164 | begin=k!=46?seekPrev(begin):(end=seekNext(begin-1)); |
136 | 165 | end=k==46?seekNext(end):end; |
137 | 166 | } |
138 | | - clearBuffer(begin, end); |
139 | | - shiftL(begin,end-1); |
| 167 | + clearBuffer(input, begin, end); |
| 168 | + shiftL(input, begin, end-1); |
140 | 169 |
|
141 | 170 | return false; |
142 | 171 | } else if (k == 27) {//escape |
143 | | - input.val(focusText); |
144 | | - input.caret(0, checkVal()); |
| 172 | + input.val(focusText(input)); |
| 173 | + input.caret(0, checkVal(input)); |
145 | 174 | return false; |
146 | 175 | } |
147 | 176 | }; |
148 | 177 |
|
149 | 178 | function keypressEvent(e) { |
| 179 | + var input = $(this); |
150 | 180 | var k = e.which, |
151 | 181 | pos = input.caret(); |
152 | 182 | if (e.ctrlKey || e.altKey || e.metaKey || k<32) {//Ignore |
153 | 183 | return true; |
154 | 184 | } else if (k) { |
155 | 185 | if(pos.end-pos.begin!=0){ |
156 | | - clearBuffer(pos.begin, pos.end); |
157 | | - shiftL(pos.begin, pos.end-1); |
| 186 | + clearBuffer(input, pos.begin, pos.end); |
| 187 | + shiftL(input, pos.begin, pos.end-1); |
158 | 188 | } |
159 | 189 |
|
160 | 190 | var p = seekNext(pos.begin - 1); |
161 | 191 | if (p < len) { |
162 | 192 | var c = String.fromCharCode(k); |
163 | 193 | if (tests[p].test(c)) { |
164 | | - shiftR(p); |
165 | | - buffer[p] = c; |
166 | | - writeBuffer(); |
| 194 | + shiftR(input, p); |
| 195 | + (getBuffer(input))[p] = c; |
| 196 | + writeBuffer(input); |
167 | 197 | var next = seekNext(p); |
168 | 198 | input.caret(next); |
169 | 199 | if (settings.completed && next >= len) |
|
174 | 204 | } |
175 | 205 | }; |
176 | 206 |
|
177 | | - function clearBuffer(start, end) { |
| 207 | + function clearBuffer(input, start, end) { |
| 208 | + var buffer = getBuffer(input); |
178 | 209 | for (var i = start; i < end && i < len; i++) { |
179 | 210 | if (tests[i]) |
180 | 211 | buffer[i] = settings.placeholder; |
181 | 212 | } |
182 | 213 | }; |
183 | 214 |
|
184 | | - function writeBuffer() { return input.val(buffer.join('')).val(); }; |
| 215 | + function writeBuffer(input) { |
| 216 | + var buffer = getBuffer(input); |
| 217 | + return input.val(buffer.join('')).val(); |
| 218 | + }; |
185 | 219 |
|
186 | | - function checkVal(allow) { |
| 220 | + function checkVal(input, allow) { |
187 | 221 | //try to place characters where they belong |
188 | 222 | var test = input.val(); |
189 | 223 | var lastMatch = -1; |
| 224 | + var buffer = getBuffer(input); |
190 | 225 | for (var i = 0, pos = 0; i < len; i++) { |
191 | 226 | if (tests[i]) { |
192 | 227 | buffer[i] = settings.placeholder; |
|
207 | 242 | } |
208 | 243 | if (!allow && lastMatch + 1 < partialPosition) { |
209 | 244 | input.val(""); |
210 | | - clearBuffer(0, len); |
| 245 | + clearBuffer(input, 0, len); |
211 | 246 | } else if (allow || lastMatch + 1 >= partialPosition) { |
212 | | - writeBuffer(); |
| 247 | + writeBuffer(input); |
213 | 248 | if (!allow) input.val(input.val().substring(0, lastMatch + 1)); |
214 | 249 | } |
215 | 250 | return (partialPosition ? i : firstNonMaskPos); |
216 | 251 | }; |
217 | 252 |
|
218 | | - input.data($.mask.dataName,function(){ |
219 | | - return $.map(buffer, function(c, i) { |
| 253 | + input.data($.mask.dataName,function(input){ |
| 254 | + return $.map(getBuffer(input), function(c, i) { |
220 | 255 | return tests[i]&&c!=settings.placeholder ? c : null; |
221 | 256 | }).join(''); |
222 | 257 | }) |
223 | 258 |
|
224 | 259 | if (!input.attr("readonly")) |
225 | 260 | input |
226 | 261 | .one("unmask", function() { |
227 | | - input |
| 262 | + $(this) |
228 | 263 | .unbind(".mask") |
229 | | - .removeData($.mask.dataName); |
| 264 | + .removeData($.mask.dataName) |
| 265 | + .removeData($.mask.extraData); |
230 | 266 | }) |
231 | 267 | .bind("focus.mask", function() { |
232 | | - focusText = input.val(); |
233 | | - var pos = checkVal(); |
234 | | - writeBuffer(); |
| 268 | + var input = $(this); |
| 269 | + focusText(input, input.val()); |
| 270 | + var pos = checkVal(input); |
| 271 | + writeBuffer(input); |
235 | 272 | var moveCaret=function(){ |
236 | 273 | if (pos == mask.length) |
237 | 274 | input.caret(0, pos); |
|
241 | 278 | ($.browser.msie ? moveCaret:function(){setTimeout(moveCaret,0)})(); |
242 | 279 | }) |
243 | 280 | .bind("blur.mask", function() { |
244 | | - checkVal(); |
245 | | - if (input.val() != focusText) |
| 281 | + var input = $(this); |
| 282 | + checkVal(input); |
| 283 | + if (input.val() != focusText(input)) |
246 | 284 | input.change(); |
247 | 285 | }) |
248 | 286 | .bind("keydown.mask", keydownEvent) |
249 | 287 | .bind("keypress.mask", keypressEvent) |
250 | 288 | .bind(pasteEventName, function() { |
251 | | - setTimeout(function() { input.caret(checkVal(true)); }, 0); |
| 289 | + var input = $(this); |
| 290 | + setTimeout(function() { input.caret(checkVal(input, true)); }, 0); |
252 | 291 | }); |
253 | 292 |
|
254 | | - checkVal(); //Perform initial check for existing values |
| 293 | + checkVal(input); //Perform initial check for existing values |
255 | 294 | }); |
256 | 295 | } |
257 | 296 | }); |
|
0 commit comments