From 105681f13e69b317fbcebe4992ddc395bbcfaa40 Mon Sep 17 00:00:00 2001 From: Tybearius Date: Thu, 11 Apr 2013 11:13:56 -0300 Subject: [PATCH 01/24] Update jquery.selectboxes.js Fixed for in loop in addOption for use with a prototype based library. --- selectboxes/jquery.selectboxes.js | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/selectboxes/jquery.selectboxes.js b/selectboxes/jquery.selectboxes.js index d98f01e..37cc6b7 100644 --- a/selectboxes/jquery.selectboxes.js +++ b/selectboxes/jquery.selectboxes.js @@ -110,8 +110,10 @@ $.fn.addOption = function() { for(var item in items) { - add(this, item, items[item], sO, startindex); - startindex += 1; + if(items.hasOwnProperty(item)){ + add(this, item, items[item], sO, startindex); + startindex += 1; + } } } else @@ -550,4 +552,4 @@ $.fn.selectedOptions = function() return this.find("option:selected"); }; -})(jQuery); \ No newline at end of file +})(jQuery); From 8d1b3289569fcaeff09e5c0effdef6d294259077 Mon Sep 17 00:00:00 2001 From: qeny Date: Sat, 25 May 2013 15:03:57 -0600 Subject: [PATCH 02/24] Update jquery.numeric.js, saving selection end, allowing keyboard ctrl+A and keyboard selection --- numeric/jquery.numeric.js | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/numeric/jquery.numeric.js b/numeric/jquery.numeric.js index 417f26c..bfc79c1 100644 --- a/numeric/jquery.numeric.js +++ b/numeric/jquery.numeric.js @@ -144,6 +144,7 @@ $.fn.numeric.keyup = function(e) { // get carat (cursor) position var carat = $.fn.getSelectionStart(this); + var selectionEnd = $.fn.getSelectionEnd(this); // get decimal character and determine if negatives are allowed var decimal = $.data(this, "numeric.decimal"); var negative = $.data(this, "numeric.negative"); @@ -217,7 +218,7 @@ $.fn.numeric.keyup = function(e) } // set the value and prevent the cursor moving to the end this.value = val; - $.fn.setSelection(this, carat); + $.fn.setSelection(this, [carat, selectionEnd]); } }; @@ -253,6 +254,16 @@ $.fn.getSelectionStart = function(o) } else { return o.selectionStart; } }; +// Based on code from http://javascript.nwbox.com/cursor_position/ (Diego Perini ) +$.fn.getSelectionEnd = function(o) +{ + if (o.createTextRange) { + var r = document.selection.createRange().duplicate() + r.moveStart('character', -o.value.length) + return r.text.length + } else return o.selectionEnd +} + // set the selection, o is the object (input), p is the position ([start, end] or just start) $.fn.setSelection = function(o, p) { From d2c1e6d718d670bc58a647c295770be8299acce3 Mon Sep 17 00:00:00 2001 From: Tyler Sanborn Date: Fri, 23 Aug 2013 15:17:53 -0400 Subject: [PATCH 03/24] Modified addOption to work with an array of {"val":"text"} objects This will allow for options to be kept in order when returned in an AJAX request. Chrome organizes objects by their keys. --- selectboxes/jquery.selectboxes.js | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/selectboxes/jquery.selectboxes.js b/selectboxes/jquery.selectboxes.js index 37cc6b7..5262238 100644 --- a/selectboxes/jquery.selectboxes.js +++ b/selectboxes/jquery.selectboxes.js @@ -108,13 +108,17 @@ $.fn.addOption = function() if(this.nodeName.toLowerCase() != "select") return; if(m) { - for(var item in items) - { - if(items.hasOwnProperty(item)){ - add(this, item, items[item], sO, startindex); - startindex += 1; - } - } + var sel = this; + jQuery.each(items, function(val, text){ + if(typeof(text) == "object"){ + jQuery.each(text, function(k,v){ + val = k; + text = v; + }); + } + add(sel, val, text, sO, startindex); + startindex += 1; + }); } else { From 4864cc800ebc912f122fe2647e1fab8fe886229d Mon Sep 17 00:00:00 2001 From: Tyler Sanborn Date: Fri, 23 Aug 2013 15:18:29 -0400 Subject: [PATCH 04/24] Update jquery.selectboxes.js --- selectboxes/jquery.selectboxes.js | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/selectboxes/jquery.selectboxes.js b/selectboxes/jquery.selectboxes.js index 5262238..4efe832 100644 --- a/selectboxes/jquery.selectboxes.js +++ b/selectboxes/jquery.selectboxes.js @@ -110,14 +110,14 @@ $.fn.addOption = function() { var sel = this; jQuery.each(items, function(val, text){ - if(typeof(text) == "object"){ - jQuery.each(text, function(k,v){ - val = k; - text = v; - }); - } - add(sel, val, text, sO, startindex); - startindex += 1; + if(typeof(text) == "object"){ + jQuery.each(text, function(k,v){ + val = k; + text = v; + }); + } + add(sel, val, text, sO, startindex); + startindex += 1; }); } else From 5a977105ad883e147d8572c9d4636c0492d50a4b Mon Sep 17 00:00:00 2001 From: nmatpt Date: Mon, 7 Oct 2013 23:48:27 +0100 Subject: [PATCH 05/24] Update jquery.numeric.js Fixes compatibility with IE<9: replaces indexOf with inArray --- numeric/jquery.numeric.js | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/numeric/jquery.numeric.js b/numeric/jquery.numeric.js index bfc79c1..fb25ed8 100644 --- a/numeric/jquery.numeric.js +++ b/numeric/jquery.numeric.js @@ -77,9 +77,9 @@ $.fn.numeric.keypress = function(e) { var value = $(this).val(); /* '-' only allowed at start and if negative numbers allowed */ - if(value.indexOf("-") !== 0 && negative && key == 45 && (value.length === 0 || parseInt($.fn.getSelectionStart(this), 10) === 0)) { return true; } + if($.inArray('-', value.split('')) !== 0 && negative && key == 45 && (value.length === 0 || parseInt($.fn.getSelectionStart(this), 10) === 0)) { return true; } /* only one decimal separator allowed */ - if(decimal && key == decimal.charCodeAt(0) && value.indexOf(decimal) != -1) + if(decimal && key == decimal.charCodeAt(0) && $.inArray(decimal, value.split('')) != -1) { allow = false; } @@ -120,7 +120,7 @@ $.fn.numeric.keypress = function(e) // if key pressed is the decimal and it is not already in the field if(decimal && key == decimal.charCodeAt(0)) { - if(value.indexOf(decimal) == -1) + if($.inArray(decimal, value.split('')) == -1) { allow = true; } @@ -153,7 +153,7 @@ $.fn.numeric.keyup = function(e) if(decimal !== "" && decimal !== null) { // find decimal point - var dot = val.indexOf(decimal); + var dot = $.inArray(decimal, val.split('')); // if dot at start, add 0 before if(dot === 0) { @@ -203,7 +203,7 @@ $.fn.numeric.keyup = function(e) } } // remove extra decimal characters - var firstDecimal = val.indexOf(decimal); + var firstDecimal = $.inArray(decimal, val.split('')); if(firstDecimal > 0) { for(var k = length - 1; k > firstDecimal; k--) From c48f0ac367bc97cb1eb91ac3d59ad9683f1826e3 Mon Sep 17 00:00:00 2001 From: adam brill Date: Wed, 12 Mar 2014 15:49:29 -0700 Subject: [PATCH 06/24] fix error with numeric inputs --- numeric/jquery.numeric.js | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/numeric/jquery.numeric.js b/numeric/jquery.numeric.js index bfc79c1..f153c42 100644 --- a/numeric/jquery.numeric.js +++ b/numeric/jquery.numeric.js @@ -245,7 +245,10 @@ $.fn.removeNumeric = function() // Based on code from http://javascript.nwbox.com/cursor_position/ (Diego Perini ) $.fn.getSelectionStart = function(o) { - if (o.createTextRange) + if(o.type === "number"){ + return undefined; + } + else if (o.createTextRange) { var r = document.selection.createRange().duplicate(); r.moveEnd('character', o.value.length); @@ -257,7 +260,10 @@ $.fn.getSelectionStart = function(o) // Based on code from http://javascript.nwbox.com/cursor_position/ (Diego Perini ) $.fn.getSelectionEnd = function(o) { - if (o.createTextRange) { + if(o.type === "number"){ + return undefined; + } + else if (o.createTextRange) { var r = document.selection.createRange().duplicate() r.moveStart('character', -o.value.length) return r.text.length @@ -272,7 +278,10 @@ $.fn.setSelection = function(o, p) // only set if p is an array of length 2 if(p && p.constructor == Array && p.length == 2) { - if (o.createTextRange) + if(o.type === "number") { + o.focus(); + } + else if (o.createTextRange) { var r = o.createTextRange(); r.collapse(true); @@ -288,4 +297,4 @@ $.fn.setSelection = function(o, p) } }; -})(jQuery); +})(jQuery); \ No newline at end of file From a53f82044759d29ff30bac698b09e3202b456545 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Joaqu=C3=ADn=20Gatica?= Date: Fri, 21 Mar 2014 17:09:27 -0300 Subject: [PATCH 07/24] Catch errors in selectionStart and setSelectionRange in latest Chrome for input types which doesn't support them --- numeric/jquery.numeric.js | 20 ++++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/numeric/jquery.numeric.js b/numeric/jquery.numeric.js index bfc79c1..07d32a4 100644 --- a/numeric/jquery.numeric.js +++ b/numeric/jquery.numeric.js @@ -251,7 +251,10 @@ $.fn.getSelectionStart = function(o) r.moveEnd('character', o.value.length); if (r.text === '') { return o.value.length; } return o.value.lastIndexOf(r.text); - } else { return o.selectionStart; } + } else { + try { return o.selectionStart; } + catch(e) { return 0; } + } }; // Based on code from http://javascript.nwbox.com/cursor_position/ (Diego Perini ) @@ -280,11 +283,16 @@ $.fn.setSelection = function(o, p) r.moveEnd('character', p[1]); r.select(); } - else if(o.setSelectionRange) - { - o.focus(); - o.setSelectionRange(p[0], p[1]); - } + else { + o.focus(); + try{ + if(o.setSelectionRange) + { + o.setSelectionRange(p[0], p[1]); + } + } catch(e) { + } + } } }; From dc6f09f2723032cd8994a09e0eda3dcf5d0aec15 Mon Sep 17 00:00:00 2001 From: damintsew Date: Mon, 9 Jun 2014 10:53:15 +0400 Subject: [PATCH 08/24] Fixed bun in IE 11. Where document.selection is deprecated --- numeric/jquery.numeric.js | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/numeric/jquery.numeric.js b/numeric/jquery.numeric.js index bfc79c1..4b5366d 100644 --- a/numeric/jquery.numeric.js +++ b/numeric/jquery.numeric.js @@ -247,12 +247,20 @@ $.fn.getSelectionStart = function(o) { if (o.createTextRange) { - var r = document.selection.createRange().duplicate(); - r.moveEnd('character', o.value.length); - if (r.text === '') { return o.value.length; } + var r; + if(typeof document.selection == "undefined") { + //On IE < 9 && IE >= 11 : "document.selection" is deprecated and you should use "document.getSelection()" + //https://github.com/SamWM/jQuery-Plugins/issues/62 + r = document.getSelection(); + } else { + r = document.selection.createRange().duplicate(); + r.moveEnd('character', o.value.length); + } + if (r.text == '') return o.value.length; + return o.value.lastIndexOf(r.text); - } else { return o.selectionStart; } -}; + } else return o.selectionStart; +} // Based on code from http://javascript.nwbox.com/cursor_position/ (Diego Perini ) $.fn.getSelectionEnd = function(o) From 21869b026ac9723fbd561d8755a4fba45c53d76c Mon Sep 17 00:00:00 2001 From: damintsew Date: Mon, 9 Jun 2014 10:57:12 +0400 Subject: [PATCH 09/24] small fix --- numeric/jquery.numeric.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/numeric/jquery.numeric.js b/numeric/jquery.numeric.js index 4b5366d..c7dd25e 100644 --- a/numeric/jquery.numeric.js +++ b/numeric/jquery.numeric.js @@ -260,7 +260,7 @@ $.fn.getSelectionStart = function(o) return o.value.lastIndexOf(r.text); } else return o.selectionStart; -} +}; // Based on code from http://javascript.nwbox.com/cursor_position/ (Diego Perini ) $.fn.getSelectionEnd = function(o) From 3d90fc611f8f2895f2c555ace7b03ba077f7c745 Mon Sep 17 00:00:00 2001 From: damintsew Date: Mon, 9 Jun 2014 10:58:09 +0400 Subject: [PATCH 10/24] Fixed code style --- numeric/jquery.numeric.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/numeric/jquery.numeric.js b/numeric/jquery.numeric.js index c7dd25e..a6c188b 100644 --- a/numeric/jquery.numeric.js +++ b/numeric/jquery.numeric.js @@ -259,7 +259,7 @@ $.fn.getSelectionStart = function(o) if (r.text == '') return o.value.length; return o.value.lastIndexOf(r.text); - } else return o.selectionStart; + } else { return o.selectionStart; } }; // Based on code from http://javascript.nwbox.com/cursor_position/ (Diego Perini ) From 286265d1f2fce99a1619001454be40ac77d00f3e Mon Sep 17 00:00:00 2001 From: kmjones77 Date: Fri, 13 Jun 2014 12:03:05 +0100 Subject: [PATCH 11/24] Update jquery.numeric.js I suggest that carat and selectionEnd are incremented if a 0 is prepended to the beginning of the value --- numeric/jquery.numeric.js | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/numeric/jquery.numeric.js b/numeric/jquery.numeric.js index bfc79c1..32ec279 100644 --- a/numeric/jquery.numeric.js +++ b/numeric/jquery.numeric.js @@ -158,11 +158,15 @@ $.fn.numeric.keyup = function(e) if(dot === 0) { this.value = "0" + val; + carat++; + selectionEnd++; } // if dot at position 1, check if there is a - symbol before it if(dot == 1 && val.charAt(0) == "-") { this.value = "-0" + val.substring(1); + carat++; + selectionEnd++; } val = this.value; } From 442239279d213100e9be99a3bff6a2cce12b5031 Mon Sep 17 00:00:00 2001 From: SamWM Date: Fri, 27 Jun 2014 11:08:11 +0100 Subject: [PATCH 12/24] Update jquery.numeric.js --- numeric/jquery.numeric.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/numeric/jquery.numeric.js b/numeric/jquery.numeric.js index 1599734..96e800f 100644 --- a/numeric/jquery.numeric.js +++ b/numeric/jquery.numeric.js @@ -1,10 +1,10 @@ /* * - * Copyright (c) 2006-2011 Sam Collett (http://www.texotela.co.uk) + * Copyright (c) 2006-2014 Sam Collett (http://www.texotela.co.uk) * Dual licensed under the MIT (http://www.opensource.org/licenses/mit-license.php) * and GPL (http://www.opensource.org/licenses/gpl-license.php) licenses. * - * Version 1.3.1 + * Version 1.4 * Demo: http://www.texotela.co.uk/code/jquery/numeric/ * */ From 3a80bec910534b0c0cc4840414ee296b49b24767 Mon Sep 17 00:00:00 2001 From: Jorge Plaza Date: Tue, 26 Aug 2014 01:30:02 -0430 Subject: [PATCH 13/24] Decimal places configuration. Several fixes: Callback function is not called when a negative numbers is introduced, removeNumeric removes listeners for keyUp event. Test page improved, with all examples working as expected. --- numeric/jquery.numeric.js | 36 +++++++++++++++++++++++++++++++----- numeric/test.html | 12 ++++++++++-- 2 files changed, 41 insertions(+), 7 deletions(-) diff --git a/numeric/jquery.numeric.js b/numeric/jquery.numeric.js index 96e800f..de699c1 100644 --- a/numeric/jquery.numeric.js +++ b/numeric/jquery.numeric.js @@ -22,6 +22,7 @@ * @example $(".numeric").numeric(","); // use , as separator * @example $(".numeric").numeric({ decimal : "," }); // use , as separator * @example $(".numeric").numeric({ negative : false }); // do not allow negative values + * @example $(".numeric").numeric({ decimalPlaces : 2 }); // only allow 2 decimal places * @example $(".numeric").numeric(null, callback); // use default values, pass on the 'callback' function * */ @@ -29,7 +30,7 @@ $.fn.numeric = function(config, callback) { if(typeof config === 'boolean') { - config = { decimal: config }; + config = { decimal: config, negative: true, decimalPlaces: -1 }; } config = config || {}; // if config.negative undefined, set to true (default is to allow negative numbers) @@ -38,10 +39,12 @@ $.fn.numeric = function(config, callback) var decimal = (config.decimal === false) ? "" : config.decimal || "."; // allow negatives var negative = (config.negative === true) ? true : false; + // set decimal places + var decimalPlaces = (typeof config.decimalPlaces == "undefined") ? -1 : config.decimalPlaces; // callback function callback = (typeof(callback) == "function" ? callback : function() {}); // set data and methods - return this.data("numeric.decimal", decimal).data("numeric.negative", negative).data("numeric.callback", callback).keypress($.fn.numeric.keypress).keyup($.fn.numeric.keyup).blur($.fn.numeric.blur); + return this.data("numeric.decimal", decimal).data("numeric.negative", negative).data("numeric.callback", callback).data("numeric.decimalPlaces", decimalPlaces).keypress($.fn.numeric.keypress).keyup($.fn.numeric.keyup).blur($.fn.numeric.blur); }; $.fn.numeric.keypress = function(e) @@ -49,6 +52,7 @@ $.fn.numeric.keypress = function(e) // get decimal character and determine if negatives are allowed var decimal = $.data(this, "numeric.decimal"); var negative = $.data(this, "numeric.negative"); + var decimalPlaces = $.data(this, "numeric.decimalPlaces"); // get the key that was pressed var key = e.charCode ? e.charCode : e.keyCode ? e.keyCode : 0; // allow enter/return key (only when in an input box) @@ -133,6 +137,15 @@ $.fn.numeric.keypress = function(e) else { allow = true; + // remove extra decimal places + if(decimal && decimalPlaces > 0) + { + var dot = $.inArray(decimal, $(this).val().split('')); + if (dot >= 0 && $(this).val().length > dot + decimalPlaces) { + allow = false; + } + } + } return allow; }; @@ -148,6 +161,7 @@ $.fn.numeric.keyup = function(e) // get decimal character and determine if negatives are allowed var decimal = $.data(this, "numeric.decimal"); var negative = $.data(this, "numeric.negative"); + var decimalPlaces = $.data(this, "numeric.decimalPlaces"); // prepend a 0 if necessary if(decimal !== "" && decimal !== null) @@ -220,6 +234,17 @@ $.fn.numeric.keyup = function(e) } } } + + // remove extra decimal places + if(decimal && decimalPlaces > 0) + { + var dot = $.inArray(decimal, val.split('')); + if (dot >= 0) + { + val = val.substring(0, dot + decimalPlaces + 1); + selectionEnd = Math.min(val.length, selectionEnd); + } + } // set the value and prevent the cursor moving to the end this.value = val; $.fn.setSelection(this, [carat, selectionEnd]); @@ -230,10 +255,11 @@ $.fn.numeric.blur = function() { var decimal = $.data(this, "numeric.decimal"); var callback = $.data(this, "numeric.callback"); + var negative = $.data(this, "numeric.negative"); var val = this.value; - if(val !== "") + if(val !== "" && decimal) { - var re = new RegExp("^\\d+$|^\\d*" + decimal + "\\d+$"); + var re = new RegExp(negative?"-?":"" + "^\\d+$|^\\d*" + decimal + "\\d+$"); if(!re.exec(val)) { callback.apply(this); @@ -243,7 +269,7 @@ $.fn.numeric.blur = function() $.fn.removeNumeric = function() { - return this.data("numeric.decimal", null).data("numeric.negative", null).data("numeric.callback", null).unbind("keypress", $.fn.numeric.keypress).unbind("blur", $.fn.numeric.blur); + return this.data("numeric.decimal", null).data("numeric.negative", null).data("numeric.callback", null).data("numeric.decimalPlaces", null).unbind("keypress", $.fn.numeric.keypress).unbind("keyup", $.fn.numeric.keyup).unbind("blur", $.fn.numeric.blur); }; // Based on code from http://javascript.nwbox.com/cursor_position/ (Diego Perini ) diff --git a/numeric/test.html b/numeric/test.html index 631dbfc..54fe2df 100644 --- a/numeric/test.html +++ b/numeric/test.html @@ -8,12 +8,19 @@
Numbers only: +

Integers only: +

No negative values: +

No negative values (integer only): +

+ Numbers with up to 2 decimal places: + +

Remove numeric
- \ No newline at end of file + From 2a58fd0ae2c9204637def3b36c2b295183768938 Mon Sep 17 00:00:00 2001 From: Jorge Plaza Date: Tue, 26 Aug 2014 01:37:03 -0430 Subject: [PATCH 14/24] Removing wrong condition --- numeric/jquery.numeric.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/numeric/jquery.numeric.js b/numeric/jquery.numeric.js index de699c1..07321ec 100644 --- a/numeric/jquery.numeric.js +++ b/numeric/jquery.numeric.js @@ -257,7 +257,7 @@ $.fn.numeric.blur = function() var callback = $.data(this, "numeric.callback"); var negative = $.data(this, "numeric.negative"); var val = this.value; - if(val !== "" && decimal) + if(val !== "") { var re = new RegExp(negative?"-?":"" + "^\\d+$|^\\d*" + decimal + "\\d+$"); if(!re.exec(val)) From d44f1f0489ce257d2f4b90e1f1b8bfbdec5542e4 Mon Sep 17 00:00:00 2001 From: ryanss Date: Tue, 2 Sep 2014 16:00:39 -0400 Subject: [PATCH 15/24] Fixes IE11 error and misc selection issues `getSelectionEnd` function was causing error "Unable to get property 'createRange' of undefined or null reference" in IE11 due to using the depreciated `document.selection` object. A previous patch attempted to fix this but it only modified `getSelectionStart` and created new bugs. When text was selected starting in the middle of the string and a non-numeric key was pressed in some cases the selection would jump around incorrectly and not stay the same as it should. This bug would also sometimes select characters when typing in the middle of a number when nothing was selected before the keypress. This patch fixes both of these issues. --- numeric/jquery.numeric.js | 17 +++++------------ 1 file changed, 5 insertions(+), 12 deletions(-) diff --git a/numeric/jquery.numeric.js b/numeric/jquery.numeric.js index 96e800f..40cfa01 100644 --- a/numeric/jquery.numeric.js +++ b/numeric/jquery.numeric.js @@ -252,17 +252,10 @@ $.fn.getSelectionStart = function(o) if(o.type === "number"){ return undefined; } - else if (o.createTextRange) + else if (o.createTextRange && document.selection) { - var r; - if(typeof document.selection == "undefined") { - //On IE < 9 && IE >= 11 : "document.selection" is deprecated and you should use "document.getSelection()" - //https://github.com/SamWM/jQuery-Plugins/issues/62 - r = document.getSelection(); - } else { - r = document.selection.createRange().duplicate(); - r.moveEnd('character', o.value.length); - } + var r = document.selection.createRange().duplicate(); + r.moveEnd('character', o.value.length); if (r.text == '') return o.value.length; return o.value.lastIndexOf(r.text); @@ -278,7 +271,7 @@ $.fn.getSelectionEnd = function(o) if(o.type === "number"){ return undefined; } - else if (o.createTextRange) { + else if (o.createTextRange && document.selection) { var r = document.selection.createRange().duplicate() r.moveStart('character', -o.value.length) return r.text.length @@ -301,7 +294,7 @@ $.fn.setSelection = function(o, p) var r = o.createTextRange(); r.collapse(true); r.moveStart('character', p[0]); - r.moveEnd('character', p[1]); + r.moveEnd('character', p[1] - p[0]); r.select(); } else { From 75b9873cce96ad94c45aa8d49e2ab90aeede98fb Mon Sep 17 00:00:00 2001 From: ryanss Date: Wed, 3 Sep 2014 13:30:39 -0400 Subject: [PATCH 16/24] Fix small selection bug in IE8 When filling in an input box via jQuery/javascript that is currently focused `getSelectionStart` returns -1 which causes the first character of the new data in the input box to become selected. This patch does not allow the function to return less than 0 which fixes this somewhat superficial bug. This was only a bug in IE8; IE7 and IE9 worked as expected. --- numeric/jquery.numeric.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/numeric/jquery.numeric.js b/numeric/jquery.numeric.js index c2427de..cb711aa 100644 --- a/numeric/jquery.numeric.js +++ b/numeric/jquery.numeric.js @@ -284,7 +284,7 @@ $.fn.getSelectionStart = function(o) r.moveEnd('character', o.value.length); if (r.text == '') return o.value.length; - return o.value.lastIndexOf(r.text); + return Math.max(0, o.value.lastIndexOf(r.text)); } else { try { return o.selectionStart; } catch(e) { return 0; } From 9b4d8d3ead5a5809308b7058d8152615e7f5aa73 Mon Sep 17 00:00:00 2001 From: ryanss Date: Wed, 17 Sep 2014 22:35:28 -0400 Subject: [PATCH 17/24] Add minified jquery.numeric file and bump version --- numeric/jquery.numeric.js | 8 ++++---- numeric/jquery.numeric.min.js | 11 +++++++++++ 2 files changed, 15 insertions(+), 4 deletions(-) create mode 100644 numeric/jquery.numeric.min.js diff --git a/numeric/jquery.numeric.js b/numeric/jquery.numeric.js index cb711aa..f7b63e2 100644 --- a/numeric/jquery.numeric.js +++ b/numeric/jquery.numeric.js @@ -3,8 +3,8 @@ * Copyright (c) 2006-2014 Sam Collett (http://www.texotela.co.uk) * Dual licensed under the MIT (http://www.opensource.org/licenses/mit-license.php) * and GPL (http://www.opensource.org/licenses/gpl-license.php) licenses. - * - * Version 1.4 + * + * Version 1.4.1 * Demo: http://www.texotela.co.uk/code/jquery/numeric/ * */ @@ -162,7 +162,7 @@ $.fn.numeric.keyup = function(e) var decimal = $.data(this, "numeric.decimal"); var negative = $.data(this, "numeric.negative"); var decimalPlaces = $.data(this, "numeric.decimalPlaces"); - + // prepend a 0 if necessary if(decimal !== "" && decimal !== null) { @@ -184,7 +184,7 @@ $.fn.numeric.keyup = function(e) } val = this.value; } - + // if pasted in, only allow the following characters var validChars = [0,1,2,3,4,5,6,7,8,9,'-',decimal]; // get length of the value (to loop through) diff --git a/numeric/jquery.numeric.min.js b/numeric/jquery.numeric.min.js new file mode 100644 index 0000000..dd0bb58 --- /dev/null +++ b/numeric/jquery.numeric.min.js @@ -0,0 +1,11 @@ +/* + * + * Copyright (c) 2006-2014 Sam Collett (http://www.texotela.co.uk) + * Dual licensed under the MIT (http://www.opensource.org/licenses/mit-license.php) + * and GPL (http://www.opensource.org/licenses/gpl-license.php) licenses. + * + * Version 1.4.1 + * Demo: http://www.texotela.co.uk/code/jquery/numeric/ + * + */ +(function($){$.fn.numeric=function(config,callback){if(typeof config==="boolean"){config={decimal:config,negative:true,decimalPlaces:-1}}config=config||{};if(typeof config.negative=="undefined"){config.negative=true}var decimal=config.decimal===false?"":config.decimal||".";var negative=config.negative===true?true:false;var decimalPlaces=typeof config.decimalPlaces=="undefined"?-1:config.decimalPlaces;callback=typeof callback=="function"?callback:function(){};return this.data("numeric.decimal",decimal).data("numeric.negative",negative).data("numeric.callback",callback).data("numeric.decimalPlaces",decimalPlaces).keypress($.fn.numeric.keypress).keyup($.fn.numeric.keyup).blur($.fn.numeric.blur)};$.fn.numeric.keypress=function(e){var decimal=$.data(this,"numeric.decimal");var negative=$.data(this,"numeric.negative");var decimalPlaces=$.data(this,"numeric.decimalPlaces");var key=e.charCode?e.charCode:e.keyCode?e.keyCode:0;if(key==13&&this.nodeName.toLowerCase()=="input"){return true}else if(key==13){return false}var allow=false;if(e.ctrlKey&&key==97||e.ctrlKey&&key==65){return true}if(e.ctrlKey&&key==120||e.ctrlKey&&key==88){return true}if(e.ctrlKey&&key==99||e.ctrlKey&&key==67){return true}if(e.ctrlKey&&key==122||e.ctrlKey&&key==90){return true}if(e.ctrlKey&&key==118||e.ctrlKey&&key==86||e.shiftKey&&key==45){return true}if(key<48||key>57){var value=$(this).val();if($.inArray("-",value.split(""))!==0&&negative&&key==45&&(value.length===0||parseInt($.fn.getSelectionStart(this),10)===0)){return true}if(decimal&&key==decimal.charCodeAt(0)&&$.inArray(decimal,value.split(""))!=-1){allow=false}if(key!=8&&key!=9&&key!=13&&key!=35&&key!=36&&key!=37&&key!=39&&key!=46){allow=false}else{if(typeof e.charCode!="undefined"){if(e.keyCode==e.which&&e.which!==0){allow=true;if(e.which==46){allow=false}}else if(e.keyCode!==0&&e.charCode===0&&e.which===0){allow=true}}}if(decimal&&key==decimal.charCodeAt(0)){if($.inArray(decimal,value.split(""))==-1){allow=true}else{allow=false}}}else{allow=true;if(decimal&&decimalPlaces>0){var dot=$.inArray(decimal,$(this).val().split(""));if(dot>=0&&$(this).val().length>dot+decimalPlaces){allow=false}}}return allow};$.fn.numeric.keyup=function(e){var val=$(this).val();if(val&&val.length>0){var carat=$.fn.getSelectionStart(this);var selectionEnd=$.fn.getSelectionEnd(this);var decimal=$.data(this,"numeric.decimal");var negative=$.data(this,"numeric.negative");var decimalPlaces=$.data(this,"numeric.decimalPlaces");if(decimal!==""&&decimal!==null){var dot=$.inArray(decimal,val.split(""));if(dot===0){this.value="0"+val;carat++;selectionEnd++}if(dot==1&&val.charAt(0)=="-"){this.value="-0"+val.substring(1);carat++;selectionEnd++}val=this.value}var validChars=[0,1,2,3,4,5,6,7,8,9,"-",decimal];var length=val.length;for(var i=length-1;i>=0;i--){var ch=val.charAt(i);if(i!==0&&ch=="-"){val=val.substring(0,i)+val.substring(i+1)}else if(i===0&&!negative&&ch=="-"){val=val.substring(1)}var validChar=false;for(var j=0;j0){for(var k=length-1;k>firstDecimal;k--){var chch=val.charAt(k);if(chch==decimal){val=val.substring(0,k)+val.substring(k+1)}}}if(decimal&&decimalPlaces>0){var dot=$.inArray(decimal,val.split(""));if(dot>=0){val=val.substring(0,dot+decimalPlaces+1);selectionEnd=Math.min(val.length,selectionEnd)}}this.value=val;$.fn.setSelection(this,[carat,selectionEnd])}};$.fn.numeric.blur=function(){var decimal=$.data(this,"numeric.decimal");var callback=$.data(this,"numeric.callback");var negative=$.data(this,"numeric.negative");var val=this.value;if(val!==""){var re=new RegExp(negative?"-?":""+"^\\d+$|^\\d*"+decimal+"\\d+$");if(!re.exec(val)){callback.apply(this)}}};$.fn.removeNumeric=function(){return this.data("numeric.decimal",null).data("numeric.negative",null).data("numeric.callback",null).data("numeric.decimalPlaces",null).unbind("keypress",$.fn.numeric.keypress).unbind("keyup",$.fn.numeric.keyup).unbind("blur",$.fn.numeric.blur)};$.fn.getSelectionStart=function(o){if(o.type==="number"){return undefined}else if(o.createTextRange&&document.selection){var r=document.selection.createRange().duplicate();r.moveEnd("character",o.value.length);if(r.text=="")return o.value.length;return Math.max(0,o.value.lastIndexOf(r.text))}else{try{return o.selectionStart}catch(e){return 0}}};$.fn.getSelectionEnd=function(o){if(o.type==="number"){return undefined}else if(o.createTextRange&&document.selection){var r=document.selection.createRange().duplicate();r.moveStart("character",-o.value.length);return r.text.length}else return o.selectionEnd};$.fn.setSelection=function(o,p){if(typeof p=="number"){p=[p,p]}if(p&&p.constructor==Array&&p.length==2){if(o.type==="number"){o.focus()}else if(o.createTextRange){var r=o.createTextRange();r.collapse(true);r.moveStart("character",p[0]);r.moveEnd("character",p[1]-p[0]);r.select()}else{o.focus();try{if(o.setSelectionRange){o.setSelectionRange(p[0],p[1])}}catch(e){}}}}})(jQuery); From b711578781e810fecd927c70cb617aed2699222c Mon Sep 17 00:00:00 2001 From: Louis Date: Fri, 20 Mar 2015 19:05:29 +0100 Subject: [PATCH 18/24] Added AMD support --- numeric/jquery.numeric.js | 10 ++++++++-- numeric/jquery.numeric.min.js | 2 +- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/numeric/jquery.numeric.js b/numeric/jquery.numeric.js index f7b63e2..3410238 100644 --- a/numeric/jquery.numeric.js +++ b/numeric/jquery.numeric.js @@ -8,7 +8,13 @@ * Demo: http://www.texotela.co.uk/code/jquery/numeric/ * */ -(function($) { +(function(factory){ + if(typeof define === 'function' && define.amd){ + define(['jquery'], factory); + }else{ + factory(window.jQuery); + } +}(function($) { /* * Allows only valid characters to be entered into input boxes. * Note: fixes value when pasting via Ctrl+V, but not when using the mouse to paste @@ -336,4 +342,4 @@ $.fn.setSelection = function(o, p) } }; -})(jQuery); +})); diff --git a/numeric/jquery.numeric.min.js b/numeric/jquery.numeric.min.js index dd0bb58..425828f 100644 --- a/numeric/jquery.numeric.min.js +++ b/numeric/jquery.numeric.min.js @@ -8,4 +8,4 @@ * Demo: http://www.texotela.co.uk/code/jquery/numeric/ * */ -(function($){$.fn.numeric=function(config,callback){if(typeof config==="boolean"){config={decimal:config,negative:true,decimalPlaces:-1}}config=config||{};if(typeof config.negative=="undefined"){config.negative=true}var decimal=config.decimal===false?"":config.decimal||".";var negative=config.negative===true?true:false;var decimalPlaces=typeof config.decimalPlaces=="undefined"?-1:config.decimalPlaces;callback=typeof callback=="function"?callback:function(){};return this.data("numeric.decimal",decimal).data("numeric.negative",negative).data("numeric.callback",callback).data("numeric.decimalPlaces",decimalPlaces).keypress($.fn.numeric.keypress).keyup($.fn.numeric.keyup).blur($.fn.numeric.blur)};$.fn.numeric.keypress=function(e){var decimal=$.data(this,"numeric.decimal");var negative=$.data(this,"numeric.negative");var decimalPlaces=$.data(this,"numeric.decimalPlaces");var key=e.charCode?e.charCode:e.keyCode?e.keyCode:0;if(key==13&&this.nodeName.toLowerCase()=="input"){return true}else if(key==13){return false}var allow=false;if(e.ctrlKey&&key==97||e.ctrlKey&&key==65){return true}if(e.ctrlKey&&key==120||e.ctrlKey&&key==88){return true}if(e.ctrlKey&&key==99||e.ctrlKey&&key==67){return true}if(e.ctrlKey&&key==122||e.ctrlKey&&key==90){return true}if(e.ctrlKey&&key==118||e.ctrlKey&&key==86||e.shiftKey&&key==45){return true}if(key<48||key>57){var value=$(this).val();if($.inArray("-",value.split(""))!==0&&negative&&key==45&&(value.length===0||parseInt($.fn.getSelectionStart(this),10)===0)){return true}if(decimal&&key==decimal.charCodeAt(0)&&$.inArray(decimal,value.split(""))!=-1){allow=false}if(key!=8&&key!=9&&key!=13&&key!=35&&key!=36&&key!=37&&key!=39&&key!=46){allow=false}else{if(typeof e.charCode!="undefined"){if(e.keyCode==e.which&&e.which!==0){allow=true;if(e.which==46){allow=false}}else if(e.keyCode!==0&&e.charCode===0&&e.which===0){allow=true}}}if(decimal&&key==decimal.charCodeAt(0)){if($.inArray(decimal,value.split(""))==-1){allow=true}else{allow=false}}}else{allow=true;if(decimal&&decimalPlaces>0){var dot=$.inArray(decimal,$(this).val().split(""));if(dot>=0&&$(this).val().length>dot+decimalPlaces){allow=false}}}return allow};$.fn.numeric.keyup=function(e){var val=$(this).val();if(val&&val.length>0){var carat=$.fn.getSelectionStart(this);var selectionEnd=$.fn.getSelectionEnd(this);var decimal=$.data(this,"numeric.decimal");var negative=$.data(this,"numeric.negative");var decimalPlaces=$.data(this,"numeric.decimalPlaces");if(decimal!==""&&decimal!==null){var dot=$.inArray(decimal,val.split(""));if(dot===0){this.value="0"+val;carat++;selectionEnd++}if(dot==1&&val.charAt(0)=="-"){this.value="-0"+val.substring(1);carat++;selectionEnd++}val=this.value}var validChars=[0,1,2,3,4,5,6,7,8,9,"-",decimal];var length=val.length;for(var i=length-1;i>=0;i--){var ch=val.charAt(i);if(i!==0&&ch=="-"){val=val.substring(0,i)+val.substring(i+1)}else if(i===0&&!negative&&ch=="-"){val=val.substring(1)}var validChar=false;for(var j=0;j0){for(var k=length-1;k>firstDecimal;k--){var chch=val.charAt(k);if(chch==decimal){val=val.substring(0,k)+val.substring(k+1)}}}if(decimal&&decimalPlaces>0){var dot=$.inArray(decimal,val.split(""));if(dot>=0){val=val.substring(0,dot+decimalPlaces+1);selectionEnd=Math.min(val.length,selectionEnd)}}this.value=val;$.fn.setSelection(this,[carat,selectionEnd])}};$.fn.numeric.blur=function(){var decimal=$.data(this,"numeric.decimal");var callback=$.data(this,"numeric.callback");var negative=$.data(this,"numeric.negative");var val=this.value;if(val!==""){var re=new RegExp(negative?"-?":""+"^\\d+$|^\\d*"+decimal+"\\d+$");if(!re.exec(val)){callback.apply(this)}}};$.fn.removeNumeric=function(){return this.data("numeric.decimal",null).data("numeric.negative",null).data("numeric.callback",null).data("numeric.decimalPlaces",null).unbind("keypress",$.fn.numeric.keypress).unbind("keyup",$.fn.numeric.keyup).unbind("blur",$.fn.numeric.blur)};$.fn.getSelectionStart=function(o){if(o.type==="number"){return undefined}else if(o.createTextRange&&document.selection){var r=document.selection.createRange().duplicate();r.moveEnd("character",o.value.length);if(r.text=="")return o.value.length;return Math.max(0,o.value.lastIndexOf(r.text))}else{try{return o.selectionStart}catch(e){return 0}}};$.fn.getSelectionEnd=function(o){if(o.type==="number"){return undefined}else if(o.createTextRange&&document.selection){var r=document.selection.createRange().duplicate();r.moveStart("character",-o.value.length);return r.text.length}else return o.selectionEnd};$.fn.setSelection=function(o,p){if(typeof p=="number"){p=[p,p]}if(p&&p.constructor==Array&&p.length==2){if(o.type==="number"){o.focus()}else if(o.createTextRange){var r=o.createTextRange();r.collapse(true);r.moveStart("character",p[0]);r.moveEnd("character",p[1]-p[0]);r.select()}else{o.focus();try{if(o.setSelectionRange){o.setSelectionRange(p[0],p[1])}}catch(e){}}}}})(jQuery); +(function(factory){if(typeof define === 'function' && define.amd){define(['jquery'], factory);}else{factory(window.jQuery);}}(function($){$.fn.numeric=function(config,callback){if(typeof config==="boolean"){config={decimal:config,negative:true,decimalPlaces:-1}}config=config||{};if(typeof config.negative=="undefined"){config.negative=true}var decimal=config.decimal===false?"":config.decimal||".";var negative=config.negative===true?true:false;var decimalPlaces=typeof config.decimalPlaces=="undefined"?-1:config.decimalPlaces;callback=typeof callback=="function"?callback:function(){};return this.data("numeric.decimal",decimal).data("numeric.negative",negative).data("numeric.callback",callback).data("numeric.decimalPlaces",decimalPlaces).keypress($.fn.numeric.keypress).keyup($.fn.numeric.keyup).blur($.fn.numeric.blur)};$.fn.numeric.keypress=function(e){var decimal=$.data(this,"numeric.decimal");var negative=$.data(this,"numeric.negative");var decimalPlaces=$.data(this,"numeric.decimalPlaces");var key=e.charCode?e.charCode:e.keyCode?e.keyCode:0;if(key==13&&this.nodeName.toLowerCase()=="input"){return true}else if(key==13){return false}var allow=false;if(e.ctrlKey&&key==97||e.ctrlKey&&key==65){return true}if(e.ctrlKey&&key==120||e.ctrlKey&&key==88){return true}if(e.ctrlKey&&key==99||e.ctrlKey&&key==67){return true}if(e.ctrlKey&&key==122||e.ctrlKey&&key==90){return true}if(e.ctrlKey&&key==118||e.ctrlKey&&key==86||e.shiftKey&&key==45){return true}if(key<48||key>57){var value=$(this).val();if($.inArray("-",value.split(""))!==0&&negative&&key==45&&(value.length===0||parseInt($.fn.getSelectionStart(this),10)===0)){return true}if(decimal&&key==decimal.charCodeAt(0)&&$.inArray(decimal,value.split(""))!=-1){allow=false}if(key!=8&&key!=9&&key!=13&&key!=35&&key!=36&&key!=37&&key!=39&&key!=46){allow=false}else{if(typeof e.charCode!="undefined"){if(e.keyCode==e.which&&e.which!==0){allow=true;if(e.which==46){allow=false}}else if(e.keyCode!==0&&e.charCode===0&&e.which===0){allow=true}}}if(decimal&&key==decimal.charCodeAt(0)){if($.inArray(decimal,value.split(""))==-1){allow=true}else{allow=false}}}else{allow=true;if(decimal&&decimalPlaces>0){var dot=$.inArray(decimal,$(this).val().split(""));if(dot>=0&&$(this).val().length>dot+decimalPlaces){allow=false}}}return allow};$.fn.numeric.keyup=function(e){var val=$(this).val();if(val&&val.length>0){var carat=$.fn.getSelectionStart(this);var selectionEnd=$.fn.getSelectionEnd(this);var decimal=$.data(this,"numeric.decimal");var negative=$.data(this,"numeric.negative");var decimalPlaces=$.data(this,"numeric.decimalPlaces");if(decimal!==""&&decimal!==null){var dot=$.inArray(decimal,val.split(""));if(dot===0){this.value="0"+val;carat++;selectionEnd++}if(dot==1&&val.charAt(0)=="-"){this.value="-0"+val.substring(1);carat++;selectionEnd++}val=this.value}var validChars=[0,1,2,3,4,5,6,7,8,9,"-",decimal];var length=val.length;for(var i=length-1;i>=0;i--){var ch=val.charAt(i);if(i!==0&&ch=="-"){val=val.substring(0,i)+val.substring(i+1)}else if(i===0&&!negative&&ch=="-"){val=val.substring(1)}var validChar=false;for(var j=0;j0){for(var k=length-1;k>firstDecimal;k--){var chch=val.charAt(k);if(chch==decimal){val=val.substring(0,k)+val.substring(k+1)}}}if(decimal&&decimalPlaces>0){var dot=$.inArray(decimal,val.split(""));if(dot>=0){val=val.substring(0,dot+decimalPlaces+1);selectionEnd=Math.min(val.length,selectionEnd)}}this.value=val;$.fn.setSelection(this,[carat,selectionEnd])}};$.fn.numeric.blur=function(){var decimal=$.data(this,"numeric.decimal");var callback=$.data(this,"numeric.callback");var negative=$.data(this,"numeric.negative");var val=this.value;if(val!==""){var re=new RegExp(negative?"-?":""+"^\\d+$|^\\d*"+decimal+"\\d+$");if(!re.exec(val)){callback.apply(this)}}};$.fn.removeNumeric=function(){return this.data("numeric.decimal",null).data("numeric.negative",null).data("numeric.callback",null).data("numeric.decimalPlaces",null).unbind("keypress",$.fn.numeric.keypress).unbind("keyup",$.fn.numeric.keyup).unbind("blur",$.fn.numeric.blur)};$.fn.getSelectionStart=function(o){if(o.type==="number"){return undefined}else if(o.createTextRange&&document.selection){var r=document.selection.createRange().duplicate();r.moveEnd("character",o.value.length);if(r.text=="")return o.value.length;return Math.max(0,o.value.lastIndexOf(r.text))}else{try{return o.selectionStart}catch(e){return 0}}};$.fn.getSelectionEnd=function(o){if(o.type==="number"){return undefined}else if(o.createTextRange&&document.selection){var r=document.selection.createRange().duplicate();r.moveStart("character",-o.value.length);return r.text.length}else return o.selectionEnd};$.fn.setSelection=function(o,p){if(typeof p=="number"){p=[p,p]}if(p&&p.constructor==Array&&p.length==2){if(o.type==="number"){o.focus()}else if(o.createTextRange){var r=o.createTextRange();r.collapse(true);r.moveStart("character",p[0]);r.moveEnd("character",p[1]-p[0]);r.select()}else{o.focus();try{if(o.setSelectionRange){o.setSelectionRange(p[0],p[1])}}catch(e){}}}}})); From b0fe2510dcd3d5839cf6a7c5cc032a35586417b9 Mon Sep 17 00:00:00 2001 From: Borin Ouch Date: Thu, 9 Apr 2015 18:21:28 -0700 Subject: [PATCH 19/24] Fix input numeric input when decimal places full --- numeric/jquery.numeric.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/numeric/jquery.numeric.js b/numeric/jquery.numeric.js index 3410238..e388548 100644 --- a/numeric/jquery.numeric.js +++ b/numeric/jquery.numeric.js @@ -146,8 +146,10 @@ $.fn.numeric.keypress = function(e) // remove extra decimal places if(decimal && decimalPlaces > 0) { + var selectionStart = $.fn.getSelectionStart(this); + var selectionEnd = $.fn.getSelectionEnd(this); var dot = $.inArray(decimal, $(this).val().split('')); - if (dot >= 0 && $(this).val().length > dot + decimalPlaces) { + if (selectionStart === selectionEnd && dot >= 0 && selectionStart > dot && $(this).val().length > dot + decimalPlaces) { allow = false; } } From 8a7ade600636acc7fb9d9b7251bd824871a9c850 Mon Sep 17 00:00:00 2001 From: Renato Moura Date: Tue, 12 May 2015 13:48:12 -0300 Subject: [PATCH 20/24] Update regexp validation --- numeric/jquery.numeric.js | 2 +- numeric/jquery.numeric.min.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/numeric/jquery.numeric.js b/numeric/jquery.numeric.js index e388548..fc1a057 100644 --- a/numeric/jquery.numeric.js +++ b/numeric/jquery.numeric.js @@ -267,7 +267,7 @@ $.fn.numeric.blur = function() var val = this.value; if(val !== "") { - var re = new RegExp(negative?"-?":"" + "^\\d+$|^\\d*" + decimal + "\\d+$"); + var re = new RegExp("^" + (negative?"-?":"") + "\\d+$|^" + (negative?"-?":"") + "\\d*" + decimal + "\\d+$"); if(!re.exec(val)) { callback.apply(this); diff --git a/numeric/jquery.numeric.min.js b/numeric/jquery.numeric.min.js index 425828f..52f37a4 100644 --- a/numeric/jquery.numeric.min.js +++ b/numeric/jquery.numeric.min.js @@ -8,4 +8,4 @@ * Demo: http://www.texotela.co.uk/code/jquery/numeric/ * */ -(function(factory){if(typeof define === 'function' && define.amd){define(['jquery'], factory);}else{factory(window.jQuery);}}(function($){$.fn.numeric=function(config,callback){if(typeof config==="boolean"){config={decimal:config,negative:true,decimalPlaces:-1}}config=config||{};if(typeof config.negative=="undefined"){config.negative=true}var decimal=config.decimal===false?"":config.decimal||".";var negative=config.negative===true?true:false;var decimalPlaces=typeof config.decimalPlaces=="undefined"?-1:config.decimalPlaces;callback=typeof callback=="function"?callback:function(){};return this.data("numeric.decimal",decimal).data("numeric.negative",negative).data("numeric.callback",callback).data("numeric.decimalPlaces",decimalPlaces).keypress($.fn.numeric.keypress).keyup($.fn.numeric.keyup).blur($.fn.numeric.blur)};$.fn.numeric.keypress=function(e){var decimal=$.data(this,"numeric.decimal");var negative=$.data(this,"numeric.negative");var decimalPlaces=$.data(this,"numeric.decimalPlaces");var key=e.charCode?e.charCode:e.keyCode?e.keyCode:0;if(key==13&&this.nodeName.toLowerCase()=="input"){return true}else if(key==13){return false}var allow=false;if(e.ctrlKey&&key==97||e.ctrlKey&&key==65){return true}if(e.ctrlKey&&key==120||e.ctrlKey&&key==88){return true}if(e.ctrlKey&&key==99||e.ctrlKey&&key==67){return true}if(e.ctrlKey&&key==122||e.ctrlKey&&key==90){return true}if(e.ctrlKey&&key==118||e.ctrlKey&&key==86||e.shiftKey&&key==45){return true}if(key<48||key>57){var value=$(this).val();if($.inArray("-",value.split(""))!==0&&negative&&key==45&&(value.length===0||parseInt($.fn.getSelectionStart(this),10)===0)){return true}if(decimal&&key==decimal.charCodeAt(0)&&$.inArray(decimal,value.split(""))!=-1){allow=false}if(key!=8&&key!=9&&key!=13&&key!=35&&key!=36&&key!=37&&key!=39&&key!=46){allow=false}else{if(typeof e.charCode!="undefined"){if(e.keyCode==e.which&&e.which!==0){allow=true;if(e.which==46){allow=false}}else if(e.keyCode!==0&&e.charCode===0&&e.which===0){allow=true}}}if(decimal&&key==decimal.charCodeAt(0)){if($.inArray(decimal,value.split(""))==-1){allow=true}else{allow=false}}}else{allow=true;if(decimal&&decimalPlaces>0){var dot=$.inArray(decimal,$(this).val().split(""));if(dot>=0&&$(this).val().length>dot+decimalPlaces){allow=false}}}return allow};$.fn.numeric.keyup=function(e){var val=$(this).val();if(val&&val.length>0){var carat=$.fn.getSelectionStart(this);var selectionEnd=$.fn.getSelectionEnd(this);var decimal=$.data(this,"numeric.decimal");var negative=$.data(this,"numeric.negative");var decimalPlaces=$.data(this,"numeric.decimalPlaces");if(decimal!==""&&decimal!==null){var dot=$.inArray(decimal,val.split(""));if(dot===0){this.value="0"+val;carat++;selectionEnd++}if(dot==1&&val.charAt(0)=="-"){this.value="-0"+val.substring(1);carat++;selectionEnd++}val=this.value}var validChars=[0,1,2,3,4,5,6,7,8,9,"-",decimal];var length=val.length;for(var i=length-1;i>=0;i--){var ch=val.charAt(i);if(i!==0&&ch=="-"){val=val.substring(0,i)+val.substring(i+1)}else if(i===0&&!negative&&ch=="-"){val=val.substring(1)}var validChar=false;for(var j=0;j0){for(var k=length-1;k>firstDecimal;k--){var chch=val.charAt(k);if(chch==decimal){val=val.substring(0,k)+val.substring(k+1)}}}if(decimal&&decimalPlaces>0){var dot=$.inArray(decimal,val.split(""));if(dot>=0){val=val.substring(0,dot+decimalPlaces+1);selectionEnd=Math.min(val.length,selectionEnd)}}this.value=val;$.fn.setSelection(this,[carat,selectionEnd])}};$.fn.numeric.blur=function(){var decimal=$.data(this,"numeric.decimal");var callback=$.data(this,"numeric.callback");var negative=$.data(this,"numeric.negative");var val=this.value;if(val!==""){var re=new RegExp(negative?"-?":""+"^\\d+$|^\\d*"+decimal+"\\d+$");if(!re.exec(val)){callback.apply(this)}}};$.fn.removeNumeric=function(){return this.data("numeric.decimal",null).data("numeric.negative",null).data("numeric.callback",null).data("numeric.decimalPlaces",null).unbind("keypress",$.fn.numeric.keypress).unbind("keyup",$.fn.numeric.keyup).unbind("blur",$.fn.numeric.blur)};$.fn.getSelectionStart=function(o){if(o.type==="number"){return undefined}else if(o.createTextRange&&document.selection){var r=document.selection.createRange().duplicate();r.moveEnd("character",o.value.length);if(r.text=="")return o.value.length;return Math.max(0,o.value.lastIndexOf(r.text))}else{try{return o.selectionStart}catch(e){return 0}}};$.fn.getSelectionEnd=function(o){if(o.type==="number"){return undefined}else if(o.createTextRange&&document.selection){var r=document.selection.createRange().duplicate();r.moveStart("character",-o.value.length);return r.text.length}else return o.selectionEnd};$.fn.setSelection=function(o,p){if(typeof p=="number"){p=[p,p]}if(p&&p.constructor==Array&&p.length==2){if(o.type==="number"){o.focus()}else if(o.createTextRange){var r=o.createTextRange();r.collapse(true);r.moveStart("character",p[0]);r.moveEnd("character",p[1]-p[0]);r.select()}else{o.focus();try{if(o.setSelectionRange){o.setSelectionRange(p[0],p[1])}}catch(e){}}}}})); +(function(factory){if(typeof define === 'function' && define.amd){define(['jquery'], factory);}else{factory(window.jQuery);}}(function($){$.fn.numeric=function(config,callback){if(typeof config==="boolean"){config={decimal:config,negative:true,decimalPlaces:-1}}config=config||{};if(typeof config.negative=="undefined"){config.negative=true}var decimal=config.decimal===false?"":config.decimal||".";var negative=config.negative===true?true:false;var decimalPlaces=typeof config.decimalPlaces=="undefined"?-1:config.decimalPlaces;callback=typeof callback=="function"?callback:function(){};return this.data("numeric.decimal",decimal).data("numeric.negative",negative).data("numeric.callback",callback).data("numeric.decimalPlaces",decimalPlaces).keypress($.fn.numeric.keypress).keyup($.fn.numeric.keyup).blur($.fn.numeric.blur)};$.fn.numeric.keypress=function(e){var decimal=$.data(this,"numeric.decimal");var negative=$.data(this,"numeric.negative");var decimalPlaces=$.data(this,"numeric.decimalPlaces");var key=e.charCode?e.charCode:e.keyCode?e.keyCode:0;if(key==13&&this.nodeName.toLowerCase()=="input"){return true}else if(key==13){return false}var allow=false;if(e.ctrlKey&&key==97||e.ctrlKey&&key==65){return true}if(e.ctrlKey&&key==120||e.ctrlKey&&key==88){return true}if(e.ctrlKey&&key==99||e.ctrlKey&&key==67){return true}if(e.ctrlKey&&key==122||e.ctrlKey&&key==90){return true}if(e.ctrlKey&&key==118||e.ctrlKey&&key==86||e.shiftKey&&key==45){return true}if(key<48||key>57){var value=$(this).val();if($.inArray("-",value.split(""))!==0&&negative&&key==45&&(value.length===0||parseInt($.fn.getSelectionStart(this),10)===0)){return true}if(decimal&&key==decimal.charCodeAt(0)&&$.inArray(decimal,value.split(""))!=-1){allow=false}if(key!=8&&key!=9&&key!=13&&key!=35&&key!=36&&key!=37&&key!=39&&key!=46){allow=false}else{if(typeof e.charCode!="undefined"){if(e.keyCode==e.which&&e.which!==0){allow=true;if(e.which==46){allow=false}}else if(e.keyCode!==0&&e.charCode===0&&e.which===0){allow=true}}}if(decimal&&key==decimal.charCodeAt(0)){if($.inArray(decimal,value.split(""))==-1){allow=true}else{allow=false}}}else{allow=true;if(decimal&&decimalPlaces>0){var dot=$.inArray(decimal,$(this).val().split(""));if(dot>=0&&$(this).val().length>dot+decimalPlaces){allow=false}}}return allow};$.fn.numeric.keyup=function(e){var val=$(this).val();if(val&&val.length>0){var carat=$.fn.getSelectionStart(this);var selectionEnd=$.fn.getSelectionEnd(this);var decimal=$.data(this,"numeric.decimal");var negative=$.data(this,"numeric.negative");var decimalPlaces=$.data(this,"numeric.decimalPlaces");if(decimal!==""&&decimal!==null){var dot=$.inArray(decimal,val.split(""));if(dot===0){this.value="0"+val;carat++;selectionEnd++}if(dot==1&&val.charAt(0)=="-"){this.value="-0"+val.substring(1);carat++;selectionEnd++}val=this.value}var validChars=[0,1,2,3,4,5,6,7,8,9,"-",decimal];var length=val.length;for(var i=length-1;i>=0;i--){var ch=val.charAt(i);if(i!==0&&ch=="-"){val=val.substring(0,i)+val.substring(i+1)}else if(i===0&&!negative&&ch=="-"){val=val.substring(1)}var validChar=false;for(var j=0;j0){for(var k=length-1;k>firstDecimal;k--){var chch=val.charAt(k);if(chch==decimal){val=val.substring(0,k)+val.substring(k+1)}}}if(decimal&&decimalPlaces>0){var dot=$.inArray(decimal,val.split(""));if(dot>=0){val=val.substring(0,dot+decimalPlaces+1);selectionEnd=Math.min(val.length,selectionEnd)}}this.value=val;$.fn.setSelection(this,[carat,selectionEnd])}};$.fn.numeric.blur=function(){var decimal=$.data(this,"numeric.decimal");var callback=$.data(this,"numeric.callback");var negative=$.data(this,"numeric.negative");var val=this.value;if(val!==""){var re=new RegExp("^" + (negative?"-?":"") + "\\d+$|^" + (negative?"-?":"") + "\\d*" + decimal + "\\d+$");if(!re.exec(val)){callback.apply(this)}}};$.fn.removeNumeric=function(){return this.data("numeric.decimal",null).data("numeric.negative",null).data("numeric.callback",null).data("numeric.decimalPlaces",null).unbind("keypress",$.fn.numeric.keypress).unbind("keyup",$.fn.numeric.keyup).unbind("blur",$.fn.numeric.blur)};$.fn.getSelectionStart=function(o){if(o.type==="number"){return undefined}else if(o.createTextRange&&document.selection){var r=document.selection.createRange().duplicate();r.moveEnd("character",o.value.length);if(r.text=="")return o.value.length;return Math.max(0,o.value.lastIndexOf(r.text))}else{try{return o.selectionStart}catch(e){return 0}}};$.fn.getSelectionEnd=function(o){if(o.type==="number"){return undefined}else if(o.createTextRange&&document.selection){var r=document.selection.createRange().duplicate();r.moveStart("character",-o.value.length);return r.text.length}else return o.selectionEnd};$.fn.setSelection=function(o,p){if(typeof p=="number"){p=[p,p]}if(p&&p.constructor==Array&&p.length==2){if(o.type==="number"){o.focus()}else if(o.createTextRange){var r=o.createTextRange();r.collapse(true);r.moveStart("character",p[0]);r.moveEnd("character",p[1]-p[0]);r.select()}else{o.focus();try{if(o.setSelectionRange){o.setSelectionRange(p[0],p[1])}}catch(e){}}}}})); From 9450debf4c6ffccf21abe27d62fe3ee9382ea4fd Mon Sep 17 00:00:00 2001 From: Abiezer Matos Date: Thu, 28 May 2015 09:51:30 -0400 Subject: [PATCH 21/24] Dont allow keys using shift (#, $, %) --- numeric/jquery.numeric.js | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/numeric/jquery.numeric.js b/numeric/jquery.numeric.js index e388548..9da87c0 100644 --- a/numeric/jquery.numeric.js +++ b/numeric/jquery.numeric.js @@ -70,6 +70,10 @@ $.fn.numeric.keypress = function(e) { return false; } + //dont allow #, $, % + else if(key == 35 || key == 36 || key == 37){ + return false; + } var allow = false; // allow Ctrl+A if((e.ctrlKey && key == 97 /* firefox */) || (e.ctrlKey && key == 65) /* opera */) { return true; } From c9ebb658adb258212a8b561dfc38a0f768e0263a Mon Sep 17 00:00:00 2001 From: MaRoed Date: Thu, 10 Dec 2015 08:23:13 +0100 Subject: [PATCH 22/24] upgrade altDecimal Define an alternative key as decimal separator. example: Press the key for the standard decimal separator (.) or the alternative separator (,). In both cases the standard separator (.) is inserted into the input field. This can be useful for keyboards with comma on the number pad. --- numeric/jquery.numeric.js | 27 ++++++++++++++++++++------- 1 file changed, 20 insertions(+), 7 deletions(-) diff --git a/numeric/jquery.numeric.js b/numeric/jquery.numeric.js index 6f31f69..2342d4e 100644 --- a/numeric/jquery.numeric.js +++ b/numeric/jquery.numeric.js @@ -27,6 +27,7 @@ * @example $(".numeric").numeric(); * @example $(".numeric").numeric(","); // use , as separator * @example $(".numeric").numeric({ decimal : "," }); // use , as separator + * @example $(".numeric").numeric({ altDecimal : "," }); // accept , as alternative separator, but use . as separator in output * @example $(".numeric").numeric({ negative : false }); // do not allow negative values * @example $(".numeric").numeric({ decimalPlaces : 2 }); // only allow 2 decimal places * @example $(".numeric").numeric(null, callback); // use default values, pass on the 'callback' function @@ -43,14 +44,16 @@ $.fn.numeric = function(config, callback) if(typeof config.negative == "undefined") { config.negative = true; } // set decimal point var decimal = (config.decimal === false) ? "" : config.decimal || "."; + // set alternative key as decimal point + var altDecimal = (config.altDecimal === false) ? "" : config.altDecimal || decimal; // allow negatives var negative = (config.negative === true) ? true : false; - // set decimal places + // set decimal places var decimalPlaces = (typeof config.decimalPlaces == "undefined") ? -1 : config.decimalPlaces; // callback function callback = (typeof(callback) == "function" ? callback : function() {}); // set data and methods - return this.data("numeric.decimal", decimal).data("numeric.negative", negative).data("numeric.callback", callback).data("numeric.decimalPlaces", decimalPlaces).keypress($.fn.numeric.keypress).keyup($.fn.numeric.keyup).blur($.fn.numeric.blur); + return this.data("numeric.decimal", decimal).data("numeric.altDecimal", altDecimal).data("numeric.negative", negative).data("numeric.callback", callback).data("numeric.decimalPlaces", decimalPlaces).keypress($.fn.numeric.keypress).keyup($.fn.numeric.keyup).blur($.fn.numeric.blur); }; $.fn.numeric.keypress = function(e) @@ -58,7 +61,9 @@ $.fn.numeric.keypress = function(e) // get decimal character and determine if negatives are allowed var decimal = $.data(this, "numeric.decimal"); var negative = $.data(this, "numeric.negative"); - var decimalPlaces = $.data(this, "numeric.decimalPlaces"); + var decimalPlaces = $.data(this, "numeric.decimalPlaces"); + // get an alternative decimal separator + var altDecimal = $.data(this, "numeric.altDecimal"); // get the key that was pressed var key = e.charCode ? e.charCode : e.keyCode ? e.keyCode : 0; // allow enter/return key (only when in an input box) @@ -131,8 +136,8 @@ $.fn.numeric.keypress = function(e) } } } - // if key pressed is the decimal and it is not already in the field - if(decimal && key == decimal.charCodeAt(0)) + // if key pressed is the decimal or altDecimal and decimal is not already in the field + if(decimal && key == decimal.charCodeAt(0) || altDecimal && key == altDecimal.charCodeAt(0)) { if($.inArray(decimal, value.split('')) == -1) { @@ -173,7 +178,9 @@ $.fn.numeric.keyup = function(e) // get decimal character and determine if negatives are allowed var decimal = $.data(this, "numeric.decimal"); var negative = $.data(this, "numeric.negative"); - var decimalPlaces = $.data(this, "numeric.decimalPlaces"); + var decimalPlaces = $.data(this, "numeric.decimalPlaces"); + // get an alternative decimal separator + var altDecimal = $.data(this, "numeric.altDecimal"); // prepend a 0 if necessary if(decimal !== "" && decimal !== null) @@ -226,6 +233,12 @@ $.fn.numeric.keyup = function(e) break; } } + // if not a valid character and character is altDecimal, replace + if(!validChar && ch == altDecimal) + { + val = val.substring(0, i) + decimal + val.substring(i + 1); + validChar = true; + } // if not a valid character, or a space, remove if(!validChar || ch == " ") { @@ -281,7 +294,7 @@ $.fn.numeric.blur = function() $.fn.removeNumeric = function() { - return this.data("numeric.decimal", null).data("numeric.negative", null).data("numeric.callback", null).data("numeric.decimalPlaces", null).unbind("keypress", $.fn.numeric.keypress).unbind("keyup", $.fn.numeric.keyup).unbind("blur", $.fn.numeric.blur); + return this.data("numeric.decimal", null).data("numeric.altDecimal", null).data("numeric.negative", null).data("numeric.callback", null).data("numeric.decimalPlaces", null).unbind("keypress", $.fn.numeric.keypress).unbind("keyup", $.fn.numeric.keyup).unbind("blur", $.fn.numeric.blur); }; // Based on code from http://javascript.nwbox.com/cursor_position/ (Diego Perini ) From a9417702a727296d84035a43610a039e1ea95cec Mon Sep 17 00:00:00 2001 From: MaRoed Date: Thu, 10 Dec 2015 08:42:22 +0100 Subject: [PATCH 23/24] upgrade alternative decimal separator Define an alternative key as decimal separator. example: Press the key for the standard decimal separator (.) or the alternative separator (,). In both cases the standard separator (.) is inserted into the input field. This can be useful for keyboards with comma on the number pad. --- numeric/jquery.numeric.min.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/numeric/jquery.numeric.min.js b/numeric/jquery.numeric.min.js index 52f37a4..f21817c 100644 --- a/numeric/jquery.numeric.min.js +++ b/numeric/jquery.numeric.min.js @@ -8,4 +8,4 @@ * Demo: http://www.texotela.co.uk/code/jquery/numeric/ * */ -(function(factory){if(typeof define === 'function' && define.amd){define(['jquery'], factory);}else{factory(window.jQuery);}}(function($){$.fn.numeric=function(config,callback){if(typeof config==="boolean"){config={decimal:config,negative:true,decimalPlaces:-1}}config=config||{};if(typeof config.negative=="undefined"){config.negative=true}var decimal=config.decimal===false?"":config.decimal||".";var negative=config.negative===true?true:false;var decimalPlaces=typeof config.decimalPlaces=="undefined"?-1:config.decimalPlaces;callback=typeof callback=="function"?callback:function(){};return this.data("numeric.decimal",decimal).data("numeric.negative",negative).data("numeric.callback",callback).data("numeric.decimalPlaces",decimalPlaces).keypress($.fn.numeric.keypress).keyup($.fn.numeric.keyup).blur($.fn.numeric.blur)};$.fn.numeric.keypress=function(e){var decimal=$.data(this,"numeric.decimal");var negative=$.data(this,"numeric.negative");var decimalPlaces=$.data(this,"numeric.decimalPlaces");var key=e.charCode?e.charCode:e.keyCode?e.keyCode:0;if(key==13&&this.nodeName.toLowerCase()=="input"){return true}else if(key==13){return false}var allow=false;if(e.ctrlKey&&key==97||e.ctrlKey&&key==65){return true}if(e.ctrlKey&&key==120||e.ctrlKey&&key==88){return true}if(e.ctrlKey&&key==99||e.ctrlKey&&key==67){return true}if(e.ctrlKey&&key==122||e.ctrlKey&&key==90){return true}if(e.ctrlKey&&key==118||e.ctrlKey&&key==86||e.shiftKey&&key==45){return true}if(key<48||key>57){var value=$(this).val();if($.inArray("-",value.split(""))!==0&&negative&&key==45&&(value.length===0||parseInt($.fn.getSelectionStart(this),10)===0)){return true}if(decimal&&key==decimal.charCodeAt(0)&&$.inArray(decimal,value.split(""))!=-1){allow=false}if(key!=8&&key!=9&&key!=13&&key!=35&&key!=36&&key!=37&&key!=39&&key!=46){allow=false}else{if(typeof e.charCode!="undefined"){if(e.keyCode==e.which&&e.which!==0){allow=true;if(e.which==46){allow=false}}else if(e.keyCode!==0&&e.charCode===0&&e.which===0){allow=true}}}if(decimal&&key==decimal.charCodeAt(0)){if($.inArray(decimal,value.split(""))==-1){allow=true}else{allow=false}}}else{allow=true;if(decimal&&decimalPlaces>0){var dot=$.inArray(decimal,$(this).val().split(""));if(dot>=0&&$(this).val().length>dot+decimalPlaces){allow=false}}}return allow};$.fn.numeric.keyup=function(e){var val=$(this).val();if(val&&val.length>0){var carat=$.fn.getSelectionStart(this);var selectionEnd=$.fn.getSelectionEnd(this);var decimal=$.data(this,"numeric.decimal");var negative=$.data(this,"numeric.negative");var decimalPlaces=$.data(this,"numeric.decimalPlaces");if(decimal!==""&&decimal!==null){var dot=$.inArray(decimal,val.split(""));if(dot===0){this.value="0"+val;carat++;selectionEnd++}if(dot==1&&val.charAt(0)=="-"){this.value="-0"+val.substring(1);carat++;selectionEnd++}val=this.value}var validChars=[0,1,2,3,4,5,6,7,8,9,"-",decimal];var length=val.length;for(var i=length-1;i>=0;i--){var ch=val.charAt(i);if(i!==0&&ch=="-"){val=val.substring(0,i)+val.substring(i+1)}else if(i===0&&!negative&&ch=="-"){val=val.substring(1)}var validChar=false;for(var j=0;j0){for(var k=length-1;k>firstDecimal;k--){var chch=val.charAt(k);if(chch==decimal){val=val.substring(0,k)+val.substring(k+1)}}}if(decimal&&decimalPlaces>0){var dot=$.inArray(decimal,val.split(""));if(dot>=0){val=val.substring(0,dot+decimalPlaces+1);selectionEnd=Math.min(val.length,selectionEnd)}}this.value=val;$.fn.setSelection(this,[carat,selectionEnd])}};$.fn.numeric.blur=function(){var decimal=$.data(this,"numeric.decimal");var callback=$.data(this,"numeric.callback");var negative=$.data(this,"numeric.negative");var val=this.value;if(val!==""){var re=new RegExp("^" + (negative?"-?":"") + "\\d+$|^" + (negative?"-?":"") + "\\d*" + decimal + "\\d+$");if(!re.exec(val)){callback.apply(this)}}};$.fn.removeNumeric=function(){return this.data("numeric.decimal",null).data("numeric.negative",null).data("numeric.callback",null).data("numeric.decimalPlaces",null).unbind("keypress",$.fn.numeric.keypress).unbind("keyup",$.fn.numeric.keyup).unbind("blur",$.fn.numeric.blur)};$.fn.getSelectionStart=function(o){if(o.type==="number"){return undefined}else if(o.createTextRange&&document.selection){var r=document.selection.createRange().duplicate();r.moveEnd("character",o.value.length);if(r.text=="")return o.value.length;return Math.max(0,o.value.lastIndexOf(r.text))}else{try{return o.selectionStart}catch(e){return 0}}};$.fn.getSelectionEnd=function(o){if(o.type==="number"){return undefined}else if(o.createTextRange&&document.selection){var r=document.selection.createRange().duplicate();r.moveStart("character",-o.value.length);return r.text.length}else return o.selectionEnd};$.fn.setSelection=function(o,p){if(typeof p=="number"){p=[p,p]}if(p&&p.constructor==Array&&p.length==2){if(o.type==="number"){o.focus()}else if(o.createTextRange){var r=o.createTextRange();r.collapse(true);r.moveStart("character",p[0]);r.moveEnd("character",p[1]-p[0]);r.select()}else{o.focus();try{if(o.setSelectionRange){o.setSelectionRange(p[0],p[1])}}catch(e){}}}}})); +(function(factory){if(typeof define === 'function' && define.amd){define(['jquery'], factory);}else{factory(window.jQuery);}}(function($){$.fn.numeric=function(config,callback){if(typeof config==="boolean"){config={decimal:config,negative:true,decimalPlaces:-1}}config=config||{};if(typeof config.negative=="undefined"){config.negative=true}var decimal=config.decimal===false?"":config.decimal||".";var altDecimal=config.altDecimal===false?"": config.altDecimal||decimal;var negative=config.negative===true?true:false;var decimalPlaces=typeof config.decimalPlaces=="undefined"?-1:config.decimalPlaces;callback=typeof callback=="function"?callback:function(){};return this.data("numeric.decimal",decimal).data("numeric.altDecimal",altDecimal).data("numeric.negative",negative).data("numeric.callback",callback).data("numeric.decimalPlaces",decimalPlaces).keypress($.fn.numeric.keypress).keyup($.fn.numeric.keyup).blur($.fn.numeric.blur)};$.fn.numeric.keypress=function(e){var decimal=$.data(this,"numeric.decimal");var negative=$.data(this,"numeric.negative");var decimalPlaces=$.data(this,"numeric.decimalPlaces");var altDecimal=$.data(this,"numeric.altDecimal");var key=e.charCode?e.charCode:e.keyCode?e.keyCode:0;if(key==13&&this.nodeName.toLowerCase()=="input"){return true}else if(key==13){return false}var allow=false;if(e.ctrlKey&&key==97||e.ctrlKey&&key==65){return true}if(e.ctrlKey&&key==120||e.ctrlKey&&key==88){return true}if(e.ctrlKey&&key==99||e.ctrlKey&&key==67){return true}if(e.ctrlKey&&key==122||e.ctrlKey&&key==90){return true}if(e.ctrlKey&&key==118||e.ctrlKey&&key==86||e.shiftKey&&key==45){return true}if(key<48||key>57){var value=$(this).val();if($.inArray("-",value.split(""))!==0&&negative&&key==45&&(value.length===0||parseInt($.fn.getSelectionStart(this),10)===0)){return true}if(decimal&&key==decimal.charCodeAt(0)&&$.inArray(decimal,value.split(""))!=-1){allow=false}if(key!=8&&key!=9&&key!=13&&key!=35&&key!=36&&key!=37&&key!=39&&key!=46){allow=false}else{if(typeof e.charCode!="undefined"){if(e.keyCode==e.which&&e.which!==0){allow=true;if(e.which==46){allow=false}}else if(e.keyCode!==0&&e.charCode===0&&e.which===0){allow=true}}}if(decimal&&key==decimal.charCodeAt(0)||altDecimal&&key==altDecimal.charCodeAt(0)){if($.inArray(decimal,value.split(""))==-1){allow=true}else{allow=false}}}else{allow=true;if(decimal&&decimalPlaces>0){var dot=$.inArray(decimal,$(this).val().split(""));if(dot>=0&&$(this).val().length>dot+decimalPlaces){allow=false}}}return allow};$.fn.numeric.keyup=function(e){var val=$(this).val();if(val&&val.length>0){var carat=$.fn.getSelectionStart(this);var selectionEnd=$.fn.getSelectionEnd(this);var decimal=$.data(this,"numeric.decimal");var negative=$.data(this,"numeric.negative");var decimalPlaces=$.data(this,"numeric.decimalPlaces");var altDecimal=$.data(this,"numeric.altDecimal");if(decimal!==""&&decimal!==null){var dot=$.inArray(decimal,val.split(""));if(dot===0){this.value="0"+val;carat++;selectionEnd++}if(dot==1&&val.charAt(0)=="-"){this.value="-0"+val.substring(1);carat++;selectionEnd++}val=this.value}var validChars=[0,1,2,3,4,5,6,7,8,9,"-",decimal];var length=val.length;for(var i=length-1;i>=0;i--){var ch=val.charAt(i);if(i!==0&&ch=="-"){val=val.substring(0,i)+val.substring(i+1)}else if(i===0&&!negative&&ch=="-"){val=val.substring(1)}var validChar=false;for(var j=0;j0){for(var k=length-1;k>firstDecimal;k--){var chch=val.charAt(k);if(chch==decimal){val=val.substring(0,k)+val.substring(k+1)}}}if(decimal&&decimalPlaces>0){var dot=$.inArray(decimal,val.split(""));if(dot>=0){val=val.substring(0,dot+decimalPlaces+1);selectionEnd=Math.min(val.length,selectionEnd)}}this.value=val;$.fn.setSelection(this,[carat,selectionEnd])}};$.fn.numeric.blur=function(){var decimal=$.data(this,"numeric.decimal");var callback=$.data(this,"numeric.callback");var negative=$.data(this,"numeric.negative");var val=this.value;if(val!==""){var re=new RegExp("^" + (negative?"-?":"") + "\\d+$|^" + (negative?"-?":"") + "\\d*" + decimal + "\\d+$");if(!re.exec(val)){callback.apply(this)}}};$.fn.removeNumeric=function(){return this.data("numeric.decimal",null).data("numeric.altDecimal",null).data("numeric.negative",null).data("numeric.callback",null).data("numeric.decimalPlaces",null).unbind("keypress",$.fn.numeric.keypress).unbind("keyup",$.fn.numeric.keyup).unbind("blur",$.fn.numeric.blur)};$.fn.getSelectionStart=function(o){if(o.type==="number"){return undefined}else if(o.createTextRange&&document.selection){var r=document.selection.createRange().duplicate();r.moveEnd("character",o.value.length);if(r.text=="")return o.value.length;return Math.max(0,o.value.lastIndexOf(r.text))}else{try{return o.selectionStart}catch(e){return 0}}};$.fn.getSelectionEnd=function(o){if(o.type==="number"){return undefined}else if(o.createTextRange&&document.selection){var r=document.selection.createRange().duplicate();r.moveStart("character",-o.value.length);return r.text.length}else return o.selectionEnd};$.fn.setSelection=function(o,p){if(typeof p=="number"){p=[p,p]}if(p&&p.constructor==Array&&p.length==2){if(o.type==="number"){o.focus()}else if(o.createTextRange){var r=o.createTextRange();r.collapse(true);r.moveStart("character",p[0]);r.moveEnd("character",p[1]-p[0]);r.select()}else{o.focus();try{if(o.setSelectionRange){o.setSelectionRange(p[0],p[1])}}catch(e){}}}}})); From 8961c1da5e2f2830cf11e1b368fe4c1f9f6f94d1 Mon Sep 17 00:00:00 2001 From: MaRoed Date: Thu, 10 Dec 2015 08:48:51 +0100 Subject: [PATCH 24/24] upgrade examples alternative decimal separators Added examples for altDecimal and reverse use of altDecimal. --- numeric/test.html | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/numeric/test.html b/numeric/test.html index 54fe2df..62f91be 100644 --- a/numeric/test.html +++ b/numeric/test.html @@ -20,6 +20,12 @@

Numbers with up to 2 decimal places: +

+ Alternative (,) changes to standard (.) decimal separator: + +

+ Reverse change from alternative (.) to standard (,) decimal separator: +

Remove numeric @@ -28,12 +34,14 @@ $(".integer").numeric(false, function() { alert("Integers only"); this.value = ""; this.focus(); }); $(".positive").numeric({ negative: false }, function() { alert("No negative values"); this.value = ""; this.focus(); }); $(".positive-integer").numeric({ decimal: false, negative: false }, function() { alert("Positive integers only"); this.value = ""; this.focus(); }); - $(".decimal-2-places").numeric({ decimalPlaces: 2 }); + $(".decimal-2-places").numeric({ decimalPlaces: 2 }); + $(".alternative-decimal-separator").numeric({ altDecimal: "," }); + $(".alternative-decimal-separator-reverse").numeric({ altDecimal: ".", decimal : "," }); $("#remove").click( function(e) { e.preventDefault(); - $(".numeric,.integer,.positive,.positive-integer,.decimal-2-places").removeNumeric(); + $(".numeric,.integer,.positive,.positive-integer,.decimal-2-places,.alternative-decimal-separator,.alternative-decimal-separator-reverse").removeNumeric(); } );