diff --git a/all.js b/all.js index 0145cb0..0db802b 100644 --- a/all.js +++ b/all.js @@ -11,5 +11,5 @@ * krivlenia@gmail.com * Site: https://github.com/Mavrin/maskInput */ -!function(e){if("function"==typeof define&&define.amd&&define(["jquery"],e),"object"==typeof module&&module.exports){var t=require("jquery");module.exports=e(t)}else e(jQuery)}(function(e){return e.fn.numberMask=function(t){var n,r={type:"int",beforePoint:10,afterPoint:2,defaultValueInput:0,allowNegative:!1,decimalMark:["."],pattern:""},a=function(e){var t=e.which;if(e.ctrlKey||e.altKey||e.metaKey||32>t)return!0;if(t){var a=String.fromCharCode(t),i=e.target.value,l=o(e.target);return i=i.substring(0,l.start)+a+i.substring(l.end),r.allowNegative&&"-"===i||n.test(i)}},i=function(t){var n=e(t.target);(13==t.which||86==t.which)&&n.val(c(n))},o=function(e){var t,n,r,a,i,o=0,l=0,c=!1;return"number"==typeof e.selectionStart&&"number"==typeof e.selectionEnd?(o=e.selectionStart,l=e.selectionEnd):(n=document.selection.createRange(),n&&n.parentElement()==e&&(a=e.value.length,t=e.value.replace(/\r\n/g,"\n"),r=e.createTextRange(),r.moveToBookmark(n.getBookmark()),i=e.createTextRange(),i.collapse(!1),r.compareEndPoints("StartToEnd",i)>-1?o=l=a:(o=-r.moveStart("character",-a),o+=t.slice(0,o).split("\n").length-1,r.compareEndPoints("EndToEnd",i)>-1?l=a:(l=-r.moveEnd("character",-a),l+=t.slice(0,l).split("\n").length-1)))),o-l!=0&&(c=!0),{start:o,end:l,statusSelection:c}},l=function(t){var n=e(t.target);""!=n.val()&&n.val(c(n))},c=function(e){var t=e.val();return n.test(t)?t:r.defaultValueInput},u=function(){for(var e="(\\"+r.decimalMark[0],t=1;tt)return!0;if(t){var r=String.fromCharCode(t),i=e.target.value,l=o(e.target);i=i.substring(0,l.start)+r+i.substring(l.end);var u=n.allowNegative&&"-"===i||a.test(i);return u&&n.replaceCommaPoint&&","===r&&setTimeout(function(){var t=o(e.target);e.target.value=i.replace(",","."),c(e.target,t.start,t.end)},0),u}},i=function(t){var a=e(t.target);(13==t.which||86==t.which)&&a.val(u(a))},o=function(e){var t,a,n,r,i,o=0,c=0,l=!1;return"number"==typeof e.selectionStart&&"number"==typeof e.selectionEnd?(o=e.selectionStart,c=e.selectionEnd):(a=document.selection.createRange(),a&&a.parentElement()==e&&(r=e.value.length,t=e.value.replace(/\r\n/g,"\n"),n=e.createTextRange(),n.moveToBookmark(a.getBookmark()),i=e.createTextRange(),i.collapse(!1),n.compareEndPoints("StartToEnd",i)>-1?o=c=r:(o=-n.moveStart("character",-r),o+=t.slice(0,o).split("\n").length-1,n.compareEndPoints("EndToEnd",i)>-1?c=r:(c=-n.moveEnd("character",-r),c+=t.slice(0,c).split("\n").length-1)))),o-c!=0&&(l=!0),{start:o,end:c,statusSelection:l}},c=function(e,t,a){if(e.setSelectionRange)e.focus(),e.setSelectionRange(t,a);else if(e.createTextRange){var n=e.createTextRange();n.collapse(!0),n.moveEnd("character",a),n.moveStart("character",t),n.select()}},l=function(t){var a=e(t.target);""!=a.val()&&a.val(u(a))},u=function(e){var t=e.val();return a.test(t)?t:n.defaultValueInput},s=function(){for(var e="(\\"+n.decimalMark[0],t=1;tt)return!0;if(t){var a=String.fromCharCode(t),i=e.target.value,l=o(e.target);return i=i.substring(0,l.start)+a+i.substring(l.end),r.allowNegative&&"-"===i||n.test(i)}},i=function(t){var n=e(t.target);(13==t.which||86==t.which)&&n.val(c(n))},o=function(e){var t,n,r,a,i,o=0,l=0,c=!1;return"number"==typeof e.selectionStart&&"number"==typeof e.selectionEnd?(o=e.selectionStart,l=e.selectionEnd):(n=document.selection.createRange(),n&&n.parentElement()==e&&(a=e.value.length,t=e.value.replace(/\r\n/g,"\n"),r=e.createTextRange(),r.moveToBookmark(n.getBookmark()),i=e.createTextRange(),i.collapse(!1),r.compareEndPoints("StartToEnd",i)>-1?o=l=a:(o=-r.moveStart("character",-a),o+=t.slice(0,o).split("\n").length-1,r.compareEndPoints("EndToEnd",i)>-1?l=a:(l=-r.moveEnd("character",-a),l+=t.slice(0,l).split("\n").length-1)))),o-l!=0&&(c=!0),{start:o,end:l,statusSelection:c}},l=function(t){var n=e(t.target);""!=n.val()&&n.val(c(n))},c=function(e){var t=e.val();return n.test(t)?t:r.defaultValueInput},u=function(){for(var e="(\\"+r.decimalMark[0],t=1;tt)return!0;if(t){var r=String.fromCharCode(t),i=e.target.value,l=o(e.target);i=i.substring(0,l.start)+r+i.substring(l.end);var u=n.allowNegative&&"-"===i||a.test(i);return u&&n.replaceCommaPoint&&","===r&&setTimeout(function(){var t=o(e.target);e.target.value=i.replace(",","."),c(e.target,t.start,t.end)},0),u}},i=function(t){var a=e(t.target);(13==t.which||86==t.which)&&a.val(u(a))},o=function(e){var t,a,n,r,i,o=0,c=0,l=!1;return"number"==typeof e.selectionStart&&"number"==typeof e.selectionEnd?(o=e.selectionStart,c=e.selectionEnd):(a=document.selection.createRange(),a&&a.parentElement()==e&&(r=e.value.length,t=e.value.replace(/\r\n/g,"\n"),n=e.createTextRange(),n.moveToBookmark(a.getBookmark()),i=e.createTextRange(),i.collapse(!1),n.compareEndPoints("StartToEnd",i)>-1?o=c=r:(o=-n.moveStart("character",-r),o+=t.slice(0,o).split("\n").length-1,n.compareEndPoints("EndToEnd",i)>-1?c=r:(c=-n.moveEnd("character",-r),c+=t.slice(0,c).split("\n").length-1)))),o-c!=0&&(l=!0),{start:o,end:c,statusSelection:l}},c=function(e,t,a){if(e.setSelectionRange)e.focus(),e.setSelectionRange(t,a);else if(e.createTextRange){var n=e.createTextRange();n.collapse(!0),n.moveEnd("character",a),n.moveStart("character",t),n.select()}},l=function(t){var a=e(t.target);""!=a.val()&&a.val(u(a))},u=function(e){var t=e.val();return a.test(t)?t:n.defaultValueInput},s=function(){for(var e="(\\"+n.decimalMark[0],t=1;t -1) {\n start = end = len;\n } else {\n start = -textInputRange.moveStart(\"character\", -len);\n start += normalizedValue.slice(0, start).split(\"\\n\").length - 1;\n\n if (textInputRange.compareEndPoints(\"EndToEnd\", endRange) > -1) {\n end = len;\n } else {\n end = -textInputRange.moveEnd(\"character\", -len);\n end += normalizedValue.slice(0, end).split(\"\\n\").length - 1;\n }\n }\n }\n }\n if ((start - end) != 0) {\n statusSelection = true;\n }\n return {\n start: start,\n end: end,\n statusSelection: statusSelection\n };\n },\n onBlur = function (e) {\n var input = $(e.target);\n if (input.val() != '') {\n input.val(formattedNumber(input));\n }\n },\n formattedNumber = function ($input) {\n var val = $input.val();\n if (regExp.test(val)) {\n return val;\n } else {\n return settings.defaultValueInput;\n }\n },\n getDecimalMarksString = function () {\n var decimalMarksString = '(\\\\' + settings.decimalMark[0];\n for (var i = 1; i < settings.decimalMark.length; i++) {\n decimalMarksString += \"|\\\\\" + settings.decimalMark[i];\n }\n decimalMarksString += ')';\n return decimalMarksString;\n };\n\n this.bind('keypress', onKeyPress).bind('keyup', onKeyUp).bind('blur', onBlur);\n if (options) {\n if (options.decimalMark) {\n if ($.type(options.decimalMark) === \"string\")\n options.decimalMark = [options.decimalMark];\n }\n\n $.extend(settings, options);\n }\n if ((typeof settings.pattern == \"object\") && (settings.pattern instanceof RegExp)) {\n regExp = settings.pattern;\n } else {\n var negRegExpPart = settings.allowNegative ? \"[-]?\" : '',\n intRegExp = \"^\" + negRegExpPart + \"\\\\d{1,\" + settings.beforePoint + \"}$\",\n decimalRegExp = \"^\" + negRegExpPart + \"\\\\d{1,\" + settings.beforePoint + \"}\" + getDecimalMarksString() + \"\\\\d{0,\" + settings.afterPoint + \"}$\";\n\n if (settings.type == 'int') {\n regExp = new RegExp(intRegExp);\n } else {\n regExp = new RegExp(intRegExp + \"|\" + decimalRegExp);\n }\n }\n\n return this;\n};\nreturn $;\r\n}));"],"sourceRoot":"/source/"} \ No newline at end of file +{"version":3,"sources":["jquery.numberMask.js"],"names":[],"mappings":"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","file":"jquery.numberMask.min.js","sourcesContent":["/*!\n * jQuery numberMask Plugin v1.0.0\n *\n * Licensed under the MIT License\n * Authors: Konstantin Krivlenia\n * krivlenia@gmail.com\n * Site: https://github.com/Mavrin/maskInput\n */\n(function (factory) {\n if (typeof define === 'function' && define.amd) {\n // AMD. Register as an anonymous module.\n define(['jquery'], factory);\n } if (typeof module === \"object\" && module.exports) {\n var $ = require('jquery');\n module.exports = factory($);\n } else {\n // Browser globals\n factory(jQuery);\n }\n}(function ($) {\n\n\n$.fn.numberMask = function (options) {\n var settings = {\n type: 'int', beforePoint: 10, afterPoint: 2, defaultValueInput: 0,\n allowNegative: false, decimalMark: ['.'], pattern: '', replaceCommaPoint: false\n },\n regExp,\n onKeyPress = function (e) {\n var k = e.which;\n\n if (e.ctrlKey || e.altKey || e.metaKey || k < 32) {//Ignore\n return true;\n } else if (k) {\n var c = String.fromCharCode(k);\n var value = e.target.value;\n var selectionParam = getSelection(e.target);\n value = value.substring(0, selectionParam.start) + c + value.substring(selectionParam.end);\n var isValid = (settings.allowNegative && value === '-') || regExp.test(value);\n\n if (isValid && settings.replaceCommaPoint && c === ',') {\n setTimeout(function () {\n var selectionParamAfter = getSelection(e.target);\n e.target.value = value.replace(',', '.');\n setSelectionRange(e.target, selectionParamAfter.start, selectionParamAfter.end);\n }, 0);\n }\n\n return isValid;\n }\n },\n onKeyUp = function (e) {\n var input = $(e.target);\n if (e.which == 13 || e.which == 86) {\n input.val(formattedNumber(input));\n }\n },\n getSelection = function (el) {\n var start = 0, end = 0, normalizedValue, range,\n textInputRange, len, endRange, statusSelection = false;\n\n if (typeof el.selectionStart == \"number\" && typeof el.selectionEnd == \"number\") {\n start = el.selectionStart;\n end = el.selectionEnd;\n } else {\n range = document.selection.createRange();\n\n if (range && range.parentElement() == el) {\n len = el.value.length;\n normalizedValue = el.value.replace(/\\r\\n/g, \"\\n\");\n\n // Create a working TextRange that lives only in the input\n textInputRange = el.createTextRange();\n textInputRange.moveToBookmark(range.getBookmark());\n\n // Check if the start and end of the selection are at the very end\n // of the input, since moveStart/moveEnd doesn't return what we want\n // in those cases\n endRange = el.createTextRange();\n endRange.collapse(false);\n\n if (textInputRange.compareEndPoints(\"StartToEnd\", endRange) > -1) {\n start = end = len;\n } else {\n start = -textInputRange.moveStart(\"character\", -len);\n start += normalizedValue.slice(0, start).split(\"\\n\").length - 1;\n\n if (textInputRange.compareEndPoints(\"EndToEnd\", endRange) > -1) {\n end = len;\n } else {\n end = -textInputRange.moveEnd(\"character\", -len);\n end += normalizedValue.slice(0, end).split(\"\\n\").length - 1;\n }\n }\n }\n }\n if ((start - end) != 0) {\n statusSelection = true;\n }\n return {\n start: start,\n end: end,\n statusSelection: statusSelection\n };\n },\n setSelectionRange = function (input, selectionStart, selectionEnd) {\n if (input.setSelectionRange) {\n input.focus();\n input.setSelectionRange(selectionStart, selectionEnd);\n }\n else if (input.createTextRange) {\n var range = input.createTextRange();\n range.collapse(true);\n range.moveEnd('character', selectionEnd);\n range.moveStart('character', selectionStart);\n range.select();\n }\n },\n onBlur = function (e) {\n var input = $(e.target);\n if (input.val() != '') {\n input.val(formattedNumber(input));\n }\n },\n formattedNumber = function ($input) {\n var val = $input.val();\n if (regExp.test(val)) {\n return val;\n } else {\n return settings.defaultValueInput;\n }\n },\n getDecimalMarksString = function () {\n var decimalMarksString = '(\\\\' + settings.decimalMark[0];\n for (var i = 1; i < settings.decimalMark.length; i++) {\n decimalMarksString += \"|\\\\\" + settings.decimalMark[i];\n }\n decimalMarksString += ')';\n return decimalMarksString;\n };\n\n this.bind('keypress', onKeyPress).bind('keyup', onKeyUp).bind('blur', onBlur);\n if (options) {\n if (options.decimalMark) {\n if ($.type(options.decimalMark) === \"string\")\n options.decimalMark = [options.decimalMark];\n }\n\n $.extend(settings, options);\n }\n\n if (settings.replaceCommaPoint) {\n if(settings.decimalMark.indexOf(',') !== -1){\n settings.decimalMark.push(',');\n }\n }\n\n if ((typeof settings.pattern == \"object\") && (settings.pattern instanceof RegExp)) {\n regExp = settings.pattern;\n } else {\n var negRegExpPart = settings.allowNegative ? \"[-]?\" : '',\n intRegExp = \"^\" + negRegExpPart + \"\\\\d{1,\" + settings.beforePoint + \"}$\",\n decimalRegExp = \"^\" + negRegExpPart + \"\\\\d{1,\" + settings.beforePoint + \"}\" + getDecimalMarksString() + \"\\\\d{0,\" + settings.afterPoint + \"}$\";\n\n if (settings.type == 'int') {\n regExp = new RegExp(intRegExp);\n } else {\n regExp = new RegExp(intRegExp + \"|\" + decimalRegExp);\n }\n }\n\n return this;\n};\nreturn $;\n}));"],"sourceRoot":"/source/"} \ No newline at end of file diff --git a/jquery.numberMask.js b/jquery.numberMask.js index 297546d..e373440 100644 --- a/jquery.numberMask.js +++ b/jquery.numberMask.js @@ -1,7 +1,7 @@ $.fn.numberMask = function (options) { var settings = { type: 'int', beforePoint: 10, afterPoint: 2, defaultValueInput: 0, - allowNegative: false, decimalMark: ['.'], pattern: '' + allowNegative: false, decimalMark: ['.'], pattern: '', replaceCommaPoint: false }, regExp, onKeyPress = function (e) { @@ -14,7 +14,17 @@ $.fn.numberMask = function (options) { var value = e.target.value; var selectionParam = getSelection(e.target); value = value.substring(0, selectionParam.start) + c + value.substring(selectionParam.end); - return (settings.allowNegative && value === '-') || regExp.test(value); + var isValid = (settings.allowNegative && value === '-') || regExp.test(value); + + if (isValid && settings.replaceCommaPoint && c === ',') { + setTimeout(function () { + var selectionParamAfter = getSelection(e.target); + e.target.value = value.replace(',', '.'); + setSelectionRange(e.target, selectionParamAfter.start, selectionParamAfter.end); + }, 0); + } + + return isValid; } }, onKeyUp = function (e) { @@ -71,6 +81,19 @@ $.fn.numberMask = function (options) { statusSelection: statusSelection }; }, + setSelectionRange = function (input, selectionStart, selectionEnd) { + if (input.setSelectionRange) { + input.focus(); + input.setSelectionRange(selectionStart, selectionEnd); + } + else if (input.createTextRange) { + var range = input.createTextRange(); + range.collapse(true); + range.moveEnd('character', selectionEnd); + range.moveStart('character', selectionStart); + range.select(); + } + }, onBlur = function (e) { var input = $(e.target); if (input.val() != '') { @@ -103,6 +126,13 @@ $.fn.numberMask = function (options) { $.extend(settings, options); } + + if (settings.replaceCommaPoint) { + if(settings.decimalMark.indexOf(',') !== -1){ + settings.decimalMark.push(','); + } + } + if ((typeof settings.pattern == "object") && (settings.pattern instanceof RegExp)) { regExp = settings.pattern; } else {