Skip to content
This repository was archived by the owner on Aug 29, 2019. It is now read-only.

Commit 33b8c3a

Browse files
committed
Making the plugin work with $().clone(true)
The plugin was originally built using closures to implement the event handlers and accessed variables from enclosing scope to reference the element jquery object. Thus, when a cloned element was created, and received events, the event handlers worked on the cloning source, when they should work on the cloned element. Only works with jquery 1.4+ as it relies on 1.4 version feature of cloning not only events, but data as well.
1 parent 50b040f commit 33b8c3a

File tree

1 file changed

+73
-34
lines changed

1 file changed

+73
-34
lines changed

src/jquery.maskedinput.js

Lines changed: 73 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,8 @@
1515
'a': "[A-Za-z]",
1616
'*': "[A-Za-z0-9]"
1717
},
18-
dataName:"rawMaskFn"
18+
dataName:"rawMaskFn",
19+
extraData: "maskedit.extra"
1920
};
2021

2122
$.fn.extend({
@@ -51,7 +52,7 @@
5152
mask: function(mask, settings) {
5253
if (!mask && this.length > 0) {
5354
var input = $(this[0]);
54-
return input.data($.mask.dataName)();
55+
return input.data($.mask.dataName)(input);
5556
}
5657
settings = $.extend({
5758
placeholder: "_",
@@ -71,16 +72,41 @@
7172
} else if (defs[c]) {
7273
tests.push(new RegExp(defs[c]));
7374
if(firstNonMaskPos==null)
74-
firstNonMaskPos = tests.length - 1;
75+
firstNonMaskPos = tests.length - 1;
7576
} else {
7677
tests.push(null);
7778
}
7879
});
7980

8081
return this.trigger("unmask").each(function() {
8182
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());
84110

85111
function seekNext(pos) {
86112
while (++pos <= len && !tests[pos]);
@@ -91,9 +117,10 @@
91117
return pos;
92118
};
93119

94-
function shiftL(begin,end) {
120+
function shiftL(input, begin,end) {
95121
if(begin<0)
96-
return;
122+
return;
123+
var buffer = getBuffer(input);
97124
for (var i = begin,j = seekNext(end); i < len; i++) {
98125
if (tests[i]) {
99126
if (j < len && tests[i].test(buffer[j])) {
@@ -104,11 +131,12 @@
104131
j = seekNext(j);
105132
}
106133
}
107-
writeBuffer();
134+
writeBuffer(input);
108135
input.caret(Math.max(firstNonMaskPos, begin));
109136
};
110137

111-
function shiftR(pos) {
138+
function shiftR(input, pos) {
139+
var buffer = getBuffer(input);
112140
for (var i = pos, c = settings.placeholder; i < len; i++) {
113141
if (tests[i]) {
114142
var j = seekNext(i);
@@ -124,6 +152,7 @@
124152

125153
function keydownEvent(e) {
126154
var k=e.which;
155+
var input = $(this);
127156

128157
//backspace, delete, and escape get special treatment
129158
if(k == 8 || k == 46 || (iPhone && k == 127)){
@@ -135,35 +164,36 @@
135164
begin=k!=46?seekPrev(begin):(end=seekNext(begin-1));
136165
end=k==46?seekNext(end):end;
137166
}
138-
clearBuffer(begin, end);
139-
shiftL(begin,end-1);
167+
clearBuffer(input, begin, end);
168+
shiftL(input, begin, end-1);
140169

141170
return false;
142171
} 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));
145174
return false;
146175
}
147176
};
148177

149178
function keypressEvent(e) {
179+
var input = $(this);
150180
var k = e.which,
151181
pos = input.caret();
152182
if (e.ctrlKey || e.altKey || e.metaKey || k<32) {//Ignore
153183
return true;
154184
} else if (k) {
155185
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);
158188
}
159189

160190
var p = seekNext(pos.begin - 1);
161191
if (p < len) {
162192
var c = String.fromCharCode(k);
163193
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);
167197
var next = seekNext(p);
168198
input.caret(next);
169199
if (settings.completed && next >= len)
@@ -174,19 +204,24 @@
174204
}
175205
};
176206

177-
function clearBuffer(start, end) {
207+
function clearBuffer(input, start, end) {
208+
var buffer = getBuffer(input);
178209
for (var i = start; i < end && i < len; i++) {
179210
if (tests[i])
180211
buffer[i] = settings.placeholder;
181212
}
182213
};
183214

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+
};
185219

186-
function checkVal(allow) {
220+
function checkVal(input, allow) {
187221
//try to place characters where they belong
188222
var test = input.val();
189223
var lastMatch = -1;
224+
var buffer = getBuffer(input);
190225
for (var i = 0, pos = 0; i < len; i++) {
191226
if (tests[i]) {
192227
buffer[i] = settings.placeholder;
@@ -207,31 +242,33 @@
207242
}
208243
if (!allow && lastMatch + 1 < partialPosition) {
209244
input.val("");
210-
clearBuffer(0, len);
245+
clearBuffer(input, 0, len);
211246
} else if (allow || lastMatch + 1 >= partialPosition) {
212-
writeBuffer();
247+
writeBuffer(input);
213248
if (!allow) input.val(input.val().substring(0, lastMatch + 1));
214249
}
215250
return (partialPosition ? i : firstNonMaskPos);
216251
};
217252

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) {
220255
return tests[i]&&c!=settings.placeholder ? c : null;
221256
}).join('');
222257
})
223258

224259
if (!input.attr("readonly"))
225260
input
226261
.one("unmask", function() {
227-
input
262+
$(this)
228263
.unbind(".mask")
229-
.removeData($.mask.dataName);
264+
.removeData($.mask.dataName)
265+
.removeData($.mask.extraData);
230266
})
231267
.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);
235272
var moveCaret=function(){
236273
if (pos == mask.length)
237274
input.caret(0, pos);
@@ -241,17 +278,19 @@
241278
($.browser.msie ? moveCaret:function(){setTimeout(moveCaret,0)})();
242279
})
243280
.bind("blur.mask", function() {
244-
checkVal();
245-
if (input.val() != focusText)
281+
var input = $(this);
282+
checkVal(input);
283+
if (input.val() != focusText(input))
246284
input.change();
247285
})
248286
.bind("keydown.mask", keydownEvent)
249287
.bind("keypress.mask", keypressEvent)
250288
.bind(pasteEventName, function() {
251-
setTimeout(function() { input.caret(checkVal(true)); }, 0);
289+
var input = $(this);
290+
setTimeout(function() { input.caret(checkVal(input, true)); }, 0);
252291
});
253292

254-
checkVal(); //Perform initial check for existing values
293+
checkVal(input); //Perform initial check for existing values
255294
});
256295
}
257296
});

0 commit comments

Comments
 (0)