From b827e28c1e37565ac83fea8404db1e7cf9fe16ff Mon Sep 17 00:00:00 2001 From: PJonDevelopment Date: Mon, 4 Apr 2011 04:36:51 -0700 Subject: [PATCH] Fixing a problem I had with a clean input box. --- src/jquery.maskedinput.js | 442 +++++++++++++++++++------------------- 1 file changed, 222 insertions(+), 220 deletions(-) diff --git a/src/jquery.maskedinput.js b/src/jquery.maskedinput.js index af67604..1d77c43 100644 --- a/src/jquery.maskedinput.js +++ b/src/jquery.maskedinput.js @@ -1,258 +1,260 @@ /* - Masked Input plugin for jQuery - Copyright (c) 2007-@Year Josh Bush (digitalbush.com) - Licensed under the MIT license (http://digitalbush.com/projects/masked-input-plugin/#license) - Version: @version +Masked Input plugin for jQuery +Copyright (c) 2007-@Year Josh Bush (digitalbush.com) +Licensed under the MIT license (http://digitalbush.com/projects/masked-input-plugin/#license) +Version: @version */ (function($) { - var pasteEventName = ($.browser.msie ? 'paste' : 'input') + ".mask"; - var iPhone = (window.orientation != undefined); + var pasteEventName = ($.browser.msie ? 'paste' : 'input') + ".mask"; + var iPhone = (window.orientation != undefined); - $.mask = { - //Predefined character definitions - definitions: { - '9': "[0-9]", - 'a': "[A-Za-z]", - '*': "[A-Za-z0-9]" - }, - dataName:"rawMaskFn" - }; + $.mask = { + //Predefined character definitions + definitions: { + '9': "[0-9]", + 'a': "[A-Za-z]", + '*': "[A-Za-z0-9]" + }, + dataName: "rawMaskFn" + }; - $.fn.extend({ - //Helper Function for Caret positioning - caret: function(begin, end) { - if (this.length == 0) return; - if (typeof begin == 'number') { - end = (typeof end == 'number') ? end : begin; - return this.each(function() { - if (this.setSelectionRange) { - this.setSelectionRange(begin, end); - } else if (this.createTextRange) { - var range = this.createTextRange(); - range.collapse(true); - range.moveEnd('character', end); - range.moveStart('character', begin); - range.select(); - } - }); - } else { - if (this[0].setSelectionRange) { - begin = this[0].selectionStart; - end = this[0].selectionEnd; - } else if (document.selection && document.selection.createRange) { - var range = document.selection.createRange(); - begin = 0 - range.duplicate().moveStart('character', -100000); - end = begin + range.text.length; - } - return { begin: begin, end: end }; - } - }, - unmask: function() { return this.trigger("unmask"); }, - mask: function(mask, settings) { - if (!mask && this.length > 0) { - var input = $(this[0]); - return input.data($.mask.dataName)(); - } - settings = $.extend({ - placeholder: "_", - completed: null - }, settings); + $.fn.extend({ + //Helper Function for Caret positioning + caret: function(begin, end) { + if (this.length == 0) return; + if (typeof begin == 'number') { + end = (typeof end == 'number') ? end : begin; + return this.each(function() { + if (this.setSelectionRange) { + this.setSelectionRange(begin, end); + } else if (this.createTextRange) { + var range = this.createTextRange(); + range.collapse(true); + range.moveEnd('character', end); + range.moveStart('character', begin); + range.select(); + } + }); + } else { + if (this[0].setSelectionRange) { + begin = this[0].selectionStart; + end = this[0].selectionEnd; + } else if (document.selection && document.selection.createRange) { + var range = document.selection.createRange(); + begin = 0 - range.duplicate().moveStart('character', -100000); + end = begin + range.text.length; + } + return { begin: begin, end: end }; + } + }, + unmask: function() { return this.trigger("unmask"); }, + mask: function(mask, settings) { + if (!mask && this.length > 0) { + var input = $(this[0]); + return input.data($.mask.dataName)(); + } + settings = $.extend({ + placeholder: "_", + completed: null + }, settings); - var defs = $.mask.definitions; - var tests = []; - var partialPosition = mask.length; - var firstNonMaskPos = null; - var len = mask.length; + var defs = $.mask.definitions; + var tests = []; + var partialPosition = mask.length; + var firstNonMaskPos = null; + var len = mask.length; - $.each(mask.split(""), function(i, c) { - if (c == '?') { - len--; - partialPosition = i; - } else if (defs[c]) { - tests.push(new RegExp(defs[c])); - if(firstNonMaskPos==null) - firstNonMaskPos = tests.length - 1; - } else { - tests.push(null); - } - }); + $.each(mask.split(""), function(i, c) { + if (c == '?') { + len--; + partialPosition = i; + } else if (defs[c]) { + tests.push(new RegExp(defs[c])); + if (firstNonMaskPos == null) + firstNonMaskPos = tests.length - 1; + } else { + tests.push(null); + } + }); - return this.trigger("unmask").each(function() { - var input = $(this); - var buffer = $.map(mask.split(""), function(c, i) { if (c != '?') return defs[c] ? settings.placeholder : c }); - var focusText = input.val(); + return this.trigger("unmask").each(function() { + var input = $(this); + var buffer = $.map(mask.split(""), function(c, i) { if (c != '?') return defs[c] ? settings.placeholder : c }); + var focusText = input.val(); - function seekNext(pos) { - while (++pos <= len && !tests[pos]); - return pos; - }; - function seekPrev(pos) { - while (--pos >= 0 && !tests[pos]); - return pos; - }; + function seekNext(pos) { + while (++pos <= len && !tests[pos]); + return pos; + }; + function seekPrev(pos) { + while (--pos >= 0 && !tests[pos]); + return pos; + }; - function shiftL(begin,end) { - if(begin<0) - return; - for (var i = begin,j = seekNext(end); i < len; i++) { - if (tests[i]) { - if (j < len && tests[i].test(buffer[j])) { - buffer[i] = buffer[j]; - buffer[j] = settings.placeholder; - } else - break; - j = seekNext(j); - } - } - writeBuffer(); - input.caret(Math.max(firstNonMaskPos, begin)); - }; + function shiftL(begin, end) { + if (begin < 0) + return; + for (var i = begin, j = seekNext(end); i < len; i++) { + if (tests[i]) { + if (j < len && tests[i].test(buffer[j])) { + buffer[i] = buffer[j]; + buffer[j] = settings.placeholder; + } else + break; + j = seekNext(j); + } + } + writeBuffer(); + input.caret(Math.max(firstNonMaskPos, begin)); + }; - function shiftR(pos) { - for (var i = pos, c = settings.placeholder; i < len; i++) { - if (tests[i]) { - var j = seekNext(i); - var t = buffer[i]; - buffer[i] = c; - if (j < len && tests[j].test(t)) - c = t; - else - break; - } - } - }; + function shiftR(pos) { + for (var i = pos, c = settings.placeholder; i < len; i++) { + if (tests[i]) { + var j = seekNext(i); + var t = buffer[i]; + buffer[i] = c; + if (j < len && tests[j].test(t)) + c = t; + else + break; + } + } + }; - function keydownEvent(e) { - var k=e.which; + function keydownEvent(e) { + var k = e.which; - //backspace, delete, and escape get special treatment - if(k == 8 || k == 46 || (iPhone && k == 127)){ - var pos = input.caret(), + //backspace, delete, and escape get special treatment + if (k == 8 || k == 46 || (iPhone && k == 127)) { + var pos = input.caret(), begin = pos.begin, end = pos.end; - - if(end-begin==0){ - begin=k!=46?seekPrev(begin):(end=seekNext(begin-1)); - end=k==46?seekNext(end):end; - } - clearBuffer(begin, end); - shiftL(begin,end-1); - return false; - } else if (k == 27) {//escape - input.val(focusText); - input.caret(0, checkVal()); - return false; - } - }; + if (end - begin == 0) { + begin = k != 46 ? seekPrev(begin) : (end = seekNext(begin - 1)); + end = k == 46 ? seekNext(end) : end; + } + clearBuffer(begin, end); + shiftL(begin, end - 1); - function keypressEvent(e) { - var k = e.which, + return false; + } else if (k == 27) {//escape + input.val(focusText); + input.caret(0, checkVal()); + return false; + } + }; + + function keypressEvent(e) { + var k = e.which, pos = input.caret(); - if (e.ctrlKey || e.altKey || e.metaKey || k<32) {//Ignore - return true; - } else if (k) { - if(pos.end-pos.begin!=0){ - clearBuffer(pos.begin, pos.end); - shiftL(pos.begin, pos.end-1); - } + if (e.ctrlKey || e.altKey || e.metaKey || k < 32) {//Ignore + return true; + } else if (k) { + if (pos.end - pos.begin != 0) { + clearBuffer(pos.begin, pos.end); + shiftL(pos.begin, pos.end - 1); + } - var p = seekNext(pos.begin - 1); - if (p < len) { - var c = String.fromCharCode(k); - if (tests[p].test(c)) { - shiftR(p); - buffer[p] = c; - writeBuffer(); - var next = seekNext(p); - input.caret(next); - if (settings.completed && next >= len) - settings.completed.call(input); - } - } - return false; - } - }; + var p = seekNext(pos.begin - 1); + if (p < len) { + var c = String.fromCharCode(k); + if (tests[p].test(c)) { + shiftR(p); + buffer[p] = c; + writeBuffer(); + var next = seekNext(p); + input.caret(next); + if (settings.completed && next >= len) + settings.completed.call(input); + } + } + return false; + } + }; - function clearBuffer(start, end) { - for (var i = start; i < end && i < len; i++) { - if (tests[i]) - buffer[i] = settings.placeholder; - } - }; + function clearBuffer(start, end) { + for (var i = start; i < end && i < len; i++) { + if (tests[i]) + buffer[i] = settings.placeholder; + } + }; - function writeBuffer() { return input.val(buffer.join('')).val(); }; + function writeBuffer() { return input.val(buffer.join('')).val(); }; - function checkVal(allow) { - //try to place characters where they belong - var test = input.val(); - var lastMatch = -1; - for (var i = 0, pos = 0; i < len; i++) { - if (tests[i]) { - buffer[i] = settings.placeholder; - while (pos++ < test.length) { - var c = test.charAt(pos - 1); - if (tests[i].test(c)) { - buffer[i] = c; - lastMatch = i; - break; - } - } - if (pos > test.length) - break; - } else if (buffer[i] == test.charAt(pos) && i!=partialPosition) { - pos++; - lastMatch = i; - } - } - if (!allow && lastMatch + 1 < partialPosition) { - input.val(""); - clearBuffer(0, len); - } else if (allow || lastMatch + 1 >= partialPosition) { - writeBuffer(); - if (!allow) input.val(input.val().substring(0, lastMatch + 1)); - } - return (partialPosition ? i : firstNonMaskPos); - }; + function checkVal(allow) { + //try to place characters where they belong + var test = input.val(); + var lastMatch = -1; + for (var i = 0, pos = 0; i < len; i++) { + if (tests[i]) { + buffer[i] = settings.placeholder; + while (pos++ < test.length) { + var c = test.charAt(pos - 1); + if (tests[i].test(c)) { + buffer[i] = c; + lastMatch = i; + break; + } + } + if (pos > test.length) + break; + } else if (buffer[i] == test.charAt(pos) && i != partialPosition) { + pos++; + lastMatch = i; + } + } + if (!allow && lastMatch + 1 < partialPosition) { + input.val(""); + clearBuffer(0, len); + } else if (allow || lastMatch + 1 >= partialPosition) { + writeBuffer(); + if (!allow) input.val(input.val().substring(0, lastMatch + 1)); + } + return (partialPosition ? i : firstNonMaskPos); + }; - input.data($.mask.dataName,function(){ - return $.map(buffer, function(c, i) { - return tests[i]&&c!=settings.placeholder ? c : null; - }).join(''); - }) + input.data($.mask.dataName, function() { + return $.map(buffer, function(c, i) { + return tests[i] && c != settings.placeholder ? c : null; + }).join(''); + }) - if (!input.attr("readonly")) - input + if (!input.attr("readonly")) + input .one("unmask", function() { - input + input .unbind(".mask") .removeData($.mask.dataName); }) .bind("focus.mask", function() { - focusText = input.val(); - var pos = checkVal(); - writeBuffer(); - var moveCaret=function(){ - if (pos == mask.length) - input.caret(0, pos); - else - input.caret(pos); - }; - ($.browser.msie ? moveCaret:function(){setTimeout(moveCaret,0)})(); + focusText = input.val(); + if (focusText === "") + clearBuffer(0, len); + var pos = checkVal(); + writeBuffer(); + var moveCaret = function() { + if (pos == mask.length) + input.caret(0, pos); + else + input.caret(pos); + }; + ($.browser.msie ? moveCaret : function() { setTimeout(moveCaret, 0) })(); }) .bind("blur.mask", function() { - checkVal(); - if (input.val() != focusText) - input.change(); + checkVal(); + if (input.val() != focusText) + input.change(); }) .bind("keydown.mask", keydownEvent) .bind("keypress.mask", keypressEvent) .bind(pasteEventName, function() { - setTimeout(function() { input.caret(checkVal(true)); }, 0); + setTimeout(function() { input.caret(checkVal(true)); }, 0); }); - checkVal(); //Perform initial check for existing values - }); - } - }); + checkVal(); //Perform initial check for existing values + }); + } + }); })(jQuery);