diff --git a/bower.json b/bower.json index e8d3bcd..17af41e 100644 --- a/bower.json +++ b/bower.json @@ -5,6 +5,7 @@ "authors": [ "Josh Bush (digitalbush.com)" ], + "main": "dist/jquery.maskedinput.js", "description": "jQuery Masked Input Plugin", "moduleType": [ "es6" diff --git a/dist/jquery.maskedinput.js b/dist/jquery.maskedinput.js index 5e57b0f..a6bc63b 100644 --- a/dist/jquery.maskedinput.js +++ b/dist/jquery.maskedinput.js @@ -142,7 +142,7 @@ break; } } else buffer[i] === test.charAt(pos) && i !== partialPosition && (pos++, lastMatch = i); - return allow ? writeBuffer() : partialPosition > lastMatch + 1 ? settings.autoclear || buffer.join("") === defaultBuffer ? (input.val() && input.val(""), + return allow ? writeBuffer() : partialPosition > lastMatch + 1 ? settings.autoclear || buffer.join("") === defaultBuffer ? settings.retainPartial || (input.val(""), clearBuffer(0, len)) : writeBuffer() : (writeBuffer(), input.val(input.val().substring(0, lastMatch + 1))), partialPosition ? i : firstNonMaskPos; } diff --git a/dist/jquery.maskedinput.min.js b/dist/jquery.maskedinput.min.js index 4093f44..92f2ca3 100644 --- a/dist/jquery.maskedinput.min.js +++ b/dist/jquery.maskedinput.min.js @@ -4,4 +4,4 @@ Licensed under the MIT license (http://digitalbush.com/projects/masked-input-plugin/#license) Version: 1.3.1 */ -!function(a){function b(){var a=document.createElement("input"),b="onpaste";return a.setAttribute(b,""),"function"==typeof a[b]?"paste":"input"}var c,d=b()+".mask",e=navigator.userAgent,f=/iphone/i.test(e),g=/chrome/i.test(e),h=/android/i.test(e);a.mask={definitions:{9:"[0-9]",a:"[A-Za-z]","*":"[A-Za-z0-9]"},autoclear:!0,dataName:"rawMaskFn",placeholder:"_"},a.fn.extend({caret:function(a,b){var c;if(0!==this.length&&!this.is(":hidden"))return"number"==typeof a?(b="number"==typeof b?b:a,this.each(function(){this.setSelectionRange?this.setSelectionRange(a,b):this.createTextRange&&(c=this.createTextRange(),c.collapse(!0),c.moveEnd("character",b),c.moveStart("character",a),c.select())})):(this[0].setSelectionRange?(a=this[0].selectionStart,b=this[0].selectionEnd):document.selection&&document.selection.createRange&&(c=document.selection.createRange(),a=0-c.duplicate().moveStart("character",-1e5),b=a+c.text.length),{begin:a,end:b})},unmask:function(){return this.trigger("unmask")},mask:function(b,e){var i,j,k,l,m,n,o,p;return!b&&this.length>0?(i=a(this[0]),i.data(a.mask.dataName)()):(e=a.extend({autoclear:a.mask.autoclear,placeholder:a.mask.placeholder,completed:null},e),j=a.mask.definitions,k=[],l=o=b.length,m=null,a.each(b.split(""),function(a,b){"?"==b?(o--,l=a):j[b]?(k.push(new RegExp(j[b])),null===m&&(m=k.length-1),l>a&&(n=k.length-1)):k.push(null)}),this.trigger("unmask").each(function(){function i(){if(e.completed){for(var a=m;n>=a;a++)if(k[a]&&C[a]===e.placeholder)return;e.completed.call(B)}}function q(a){for(;++a=0&&!k[a];);return a}function s(a,b){var c,d;if(!(0>a)){for(c=a,d=q(b);o>c;c++)if(k[c]){if(!(o>d&&k[c].test(C[d])))break;C[c]=C[d],C[d]=e.placeholder,d=q(d)}z(),B.caret(Math.max(m,a))}}function t(a){var b,c,d,f;for(b=a,c=e.placeholder;o>b;b++)if(k[b]){if(d=q(b),f=C[b],C[b]=c,!(o>d&&k[d].test(f)))break;c=f}}function u(){var a=B.val(),b=B.caret();if(a.length0&&!k[b.begin-1];)b.begin--;if(0===b.begin)for(;b.beginf)&&f&&13!==f){if(g.end-g.begin!==0&&(y(g.begin,g.end),s(g.begin,g.end-1)),c=q(g.begin-1),o>c&&(d=String.fromCharCode(f),k[c].test(d))){if(t(c),C[c]=d,z(),e=q(c),h){var j=function(){a.proxy(a.fn.caret,B,e)()};setTimeout(j,0)}else B.caret(e);g.begin<=n&&i()}b.preventDefault()}}}function y(a,b){var c;for(c=a;b>c&&o>c;c++)k[c]&&(C[c]=e.placeholder)}function z(){B.val(C.join(""))}function A(a){var b,c,d,f=B.val(),g=-1;for(b=0,d=0;o>b;b++)if(k[b]){for(C[b]=e.placeholder;d++f.length){y(b+1,o);break}}else C[b]===f.charAt(d)&&b!==l&&(d++,g=b);return a?z():l>g+1?e.autoclear||C.join("")===D?(B.val()&&B.val(""),y(0,o)):z():(z(),B.val(B.val().substring(0,g+1))),l?b:m}var B=a(this),C=a.map(b.split(""),function(a){return"?"!=a?j[a]?e.placeholder:a:void 0}),D=C.join(""),E=B.val();B.data(a.mask.dataName,function(){return a.map(C,function(a,b){return k[b]&&a!=e.placeholder?a:null}).join("")}),B.one("unmask",function(){B.off(".mask").removeData(a.mask.dataName)}).on("focus.mask",function(){if(!B.prop("readonly")){clearTimeout(c);var a;E=B.val(),a=A(),c=setTimeout(function(){z(),a==b.replace("?","").length?B.caret(0,a):B.caret(a)},10)}}).on("blur.mask",v).on("keydown.mask",w).on("keypress.mask",x).on(d,function(){B.prop("readonly")||setTimeout(function(){var a=A(!0);B.caret(a),i()},0)}),g&&h&&B.off("input.mask").on("input.mask",u),A()}))}})}(jQuery); \ No newline at end of file +!function(a){function b(){var a=document.createElement("input"),b="onpaste";return a.setAttribute(b,""),"function"==typeof a[b]?"paste":"input"}var c,d=b()+".mask",e=navigator.userAgent,f=/iphone/i.test(e),g=/chrome/i.test(e),h=/android/i.test(e);a.mask={definitions:{9:"[0-9]",a:"[A-Za-z]","*":"[A-Za-z0-9]"},autoclear:!0,dataName:"rawMaskFn",placeholder:"_"},a.fn.extend({caret:function(a,b){var c;if(0!==this.length&&!this.is(":hidden"))return"number"==typeof a?(b="number"==typeof b?b:a,this.each(function(){this.setSelectionRange?this.setSelectionRange(a,b):this.createTextRange&&(c=this.createTextRange(),c.collapse(!0),c.moveEnd("character",b),c.moveStart("character",a),c.select())})):(this[0].setSelectionRange?(a=this[0].selectionStart,b=this[0].selectionEnd):document.selection&&document.selection.createRange&&(c=document.selection.createRange(),a=0-c.duplicate().moveStart("character",-1e5),b=a+c.text.length),{begin:a,end:b})},unmask:function(){return this.trigger("unmask")},mask:function(b,e){var i,j,k,l,m,n,o,p;return!b&&this.length>0?(i=a(this[0]),i.data(a.mask.dataName)()):(e=a.extend({autoclear:a.mask.autoclear,placeholder:a.mask.placeholder,completed:null},e),j=a.mask.definitions,k=[],l=o=b.length,m=null,a.each(b.split(""),function(a,b){"?"==b?(o--,l=a):j[b]?(k.push(new RegExp(j[b])),null===m&&(m=k.length-1),l>a&&(n=k.length-1)):k.push(null)}),this.trigger("unmask").each(function(){function i(){if(e.completed){for(var a=m;n>=a;a++)if(k[a]&&C[a]===e.placeholder)return;e.completed.call(B)}}function q(a){for(;++a=0&&!k[a];);return a}function s(a,b){var c,d;if(!(0>a)){for(c=a,d=q(b);o>c;c++)if(k[c]){if(!(o>d&&k[c].test(C[d])))break;C[c]=C[d],C[d]=e.placeholder,d=q(d)}z(),B.caret(Math.max(m,a))}}function t(a){var b,c,d,f;for(b=a,c=e.placeholder;o>b;b++)if(k[b]){if(d=q(b),f=C[b],C[b]=c,!(o>d&&k[d].test(f)))break;c=f}}function u(){var a=B.val(),b=B.caret();if(a.length0&&!k[b.begin-1];)b.begin--;if(0===b.begin)for(;b.beginf)&&f&&13!==f){if(g.end-g.begin!==0&&(y(g.begin,g.end),s(g.begin,g.end-1)),c=q(g.begin-1),o>c&&(d=String.fromCharCode(f),k[c].test(d))){if(t(c),C[c]=d,z(),e=q(c),h){var j=function(){a.proxy(a.fn.caret,B,e)()};setTimeout(j,0)}else B.caret(e);g.begin<=n&&i()}b.preventDefault()}}}function y(a,b){var c;for(c=a;b>c&&o>c;c++)k[c]&&(C[c]=e.placeholder)}function z(){B.val(C.join(""))}function A(a){var b,c,d,f=B.val(),g=-1;for(b=0,d=0;o>b;b++)if(k[b]){for(C[b]=e.placeholder;d++f.length){y(b+1,o);break}}else C[b]===f.charAt(d)&&b!==l&&(d++,g=b);return a?z():l>g+1?e.autoclear||C.join("")===D?e.retainPartial||(B.val(""),y(0,o)):z():(z(),B.val(B.val().substring(0,g+1))),l?b:m}var B=a(this),C=a.map(b.split(""),function(a){return"?"!=a?j[a]?e.placeholder:a:void 0}),D=C.join(""),E=B.val();B.data(a.mask.dataName,function(){return a.map(C,function(a,b){return k[b]&&a!=e.placeholder?a:null}).join("")}),B.one("unmask",function(){B.off(".mask").removeData(a.mask.dataName)}).on("focus.mask",function(){if(!B.prop("readonly")){clearTimeout(c);var a;E=B.val(),a=A(),c=setTimeout(function(){z(),a==b.replace("?","").length?B.caret(0,a):B.caret(a)},10)}}).on("blur.mask",v).on("keydown.mask",w).on("keypress.mask",x).on(d,function(){B.prop("readonly")||setTimeout(function(){var a=A(!0);B.caret(a),i()},0)}),g&&h&&B.off("input.mask").on("input.mask",u),A()}))}})}(jQuery); \ No newline at end of file diff --git a/spec/Focus.Spec.js b/spec/Focus.Spec.js index de3976c..10eb600 100644 --- a/spec/Focus.Spec.js +++ b/spec/Focus.Spec.js @@ -1,3 +1,28 @@ +feature("Leaving A Masked Input With retainPartial",function(){ + scenario("All placeholders filled",function(){ + given("a mask with two placeholders",function(){ + input.mask("99", { retainPartial: true }); + }); + when("typing two characters and blurring",function(){ + input.mashKeys("12").blur(); + }); + then("value should be correct",function(){ + expect(input).toHaveValue("12"); + }); + }); + scenario("Empty placeholders remaining",function(){ + given("a mask with two placeholders",function(){ + input.mask("99"); + }); + when("typing one character and blurring",function(){ + input.mashKeys("1").blur(); + }); + then("value should be empty",function(){ + expect(input).toHaveValue(""); + }); + }); +}); + feature("Focusing A Masked Input",function(){ scenario("Mask starts with a placeholder",function(){ given("a mask beginning with a placeholder",function(){ @@ -68,7 +93,6 @@ feature("Focusing A Masked Input",function(){ expect(input).toHaveValue("1_"); }); }); - scenario("Mask containing optional mask ?",function(){ given("the input has a partial value",function(){ input.val("99"); diff --git a/src/jquery.maskedinput.js b/src/jquery.maskedinput.js index b93820a..60faa3a 100644 --- a/src/jquery.maskedinput.js +++ b/src/jquery.maskedinput.js @@ -343,8 +343,10 @@ $.fn.extend({ if (settings.autoclear || buffer.join('') === defaultBuffer) { // Invalid value. Remove it and replace it with the // mask, which is the default behavior. - if(input.val()) input.val(""); - clearBuffer(0, len); + if (! settings.retainPartial) { + input.val(""); + clearBuffer(0, len); + } } else { // Invalid value, but we opt to show the value to the // user and allow them to correct their mistake.