From d77eb384ff47d700810e5d12ee07ed432742768a Mon Sep 17 00:00:00 2001 From: Eric Hankinson Date: Sun, 26 Sep 2010 23:50:53 -0400 Subject: [PATCH] Converted events to use bind, added namespace to events, added support for pasting in text. --- .gitignore | 2 ++ js/jquery.NobleCount.js | 54 ++++++++++++++++++++++++++++++++++--- js/jquery.NobleCount.min.js | 2 +- 3 files changed, 53 insertions(+), 5 deletions(-) create mode 100644 .gitignore diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..fafff2e --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +.DS_Store +Thumbs.db diff --git a/js/jquery.NobleCount.js b/js/jquery.NobleCount.js index 5ccecb8..9b78a1a 100644 --- a/js/jquery.NobleCount.js +++ b/js/jquery.NobleCount.js @@ -282,24 +282,68 @@ event_internals(t_obj, char_area, c_settings, max_char, true); // then attach the events -- seem to work better than keypress - $(t_obj).keydown(function(e) { + $(t_obj).bind('keydown.noblecount', function(e) { event_internals(t_obj, char_area, c_settings, max_char, false); // to block text entry, return false if (check_block_negative(e, t_obj, c_settings, max_char) == false) { + trim_input(t_obj, char_area, c_settings, max_char); return false; - } + } }); - $(t_obj).keyup(function(e) { + $(t_obj).bind('keyup.noblecount', function(e) { event_internals(t_obj, char_area, c_settings, max_char, false); // to block text entry, return false if (check_block_negative(e, t_obj, c_settings, max_char) == false) { return false; - } + } + }); + + $(t_obj).bind('paste.noblecount', function(e) { + event_internals(t_obj, char_area, c_settings, max_char, false); + + // You need a slight pause + setTimeout(function() { + if (check_block_negative(e, t_obj, c_settings, max_char) == false) { + trim_input(t_obj, char_area, c_settings, max_char); + return false; + } + }, 5); }); } + + /********************************************************************************** + + FUNCTION + check_block_negative + + DESCRIPTION + determines whether or not text entry within t_obj should be prevented + + PRE + e EXISTS + t_obj VALID + c_settings and max_char initialized / calculated + + POST + if t_obj text entry should be prevented FALSE is returned + otherwise TRUE returned + + TODO + improve selection detection and permissible behaviors experience + ALSO + doesnt CURRENTLY block from the pasting of large chunks of text that + exceed max_char + + **********************************************************************************/ + + function trim_input(t_obj, char_area, c_settings, max_char){ + var content = $(t_obj).val(); + $(t_obj).val(content.substr(0, max_char)); + event_internals(t_obj, char_area, c_settings, max_char, false); + } /********************************************************************************** @@ -348,6 +392,8 @@ // block text entry return false; + } else if ((find_remaining(t_obj, max_char) < 1) && e.type == "paste") { + return false; } } diff --git a/js/jquery.NobleCount.min.js b/js/jquery.NobleCount.min.js index ceb90ca..34b258d 100644 --- a/js/jquery.NobleCount.min.js +++ b/js/jquery.NobleCount.min.js @@ -1,3 +1,3 @@ /* jQuery.NobleCount v 1.0 http://tpgblog.com/noblecount/ compiled by http://yui.2clics.net/ */ -(function(c){c.fn.NobleCount=function(i,h){var j;var g=false;if(typeof i=="string"){j=c.extend({},c.fn.NobleCount.settings,h);if(typeof h!="undefined"){g=((typeof h.max_chars=="number")?true:false)}return this.each(function(){var k=c(this);f(k,i,j,g)})}return this};c.fn.NobleCount.settings={on_negative:null,on_positive:null,on_update:null,max_chars:140,block_negative:false,cloak:false,in_dom:false};function f(g,m,n,h){var l=n.max_chars;var j=c(m);if(!h){var k=j.text();var i=(/^[1-9]\d*$/).test(k);if(i){l=k}}b(g,j,n,l,true);c(g).keydown(function(o){b(g,j,n,l,false);if(a(o,g,n,l)==false){return false}});c(g).keyup(function(o){b(g,j,n,l,false);if(a(o,g,n,l)==false){return false}})}function a(k,g,l,j){if(l.block_negative){var h=k.which;var i;if(typeof document.selection!="undefined"){i=(document.selection.createRange().text.length>0)}else{i=(g[0].selectionStart!=g[0].selectionEnd)}if((!((e(g,j)<1)&&(h>47||h==32||h==0||h==13)&&!k.ctrlKey&&!k.altKey&&!i))==false){return false}}return true}function e(g,h){return h-(c(g).val()).length}function b(g,i,l,j,h){var k=e(g,j);if(k<0){d(l.on_negative,l.on_positive,g,i,l,k)}else{d(l.on_positive,l.on_negative,g,i,l,k)}if(l.cloak){if(l.in_dom){i.attr("data-noblecount",k)}}else{i.text(k)}if(!h&&jQuery.isFunction(l.on_update)){l.on_update(g,i,l,k)}}function d(i,g,h,j,l,k){if(i!=null){if(typeof i=="string"){j.addClass(i)}else{if(jQuery.isFunction(i)){i(h,j,l,k)}}}if(g!=null){if(typeof g=="string"){j.removeClass(g)}}}})(jQuery); \ No newline at end of file +(function(c){c.fn.NobleCount=function(j,i){var k;var h=false;if(typeof j=="string"){k=c.extend({},c.fn.NobleCount.settings,i);if(typeof i!="undefined"){h=((typeof i.max_chars=="number")?true:false)}return this.each(function(){var l=c(this);g(l,j,k,h)})}return this};c.fn.NobleCount.settings={on_negative:null,on_positive:null,on_update:null,max_chars:140,block_negative:false,cloak:false,in_dom:false};function g(h,n,o,i){var m=o.max_chars;var k=c(n);if(!i){var l=k.text();var j=(/^[1-9]\d*$/).test(l);if(j){m=l}}b(h,k,o,m,true);c(h).bind("keydown.noblecount",function(p){b(h,k,o,m,false);if(a(p,h,o,m)==false){d(h,k,o,m);return false}});c(h).bind("keyup.noblecount",function(p){b(h,k,o,m,false);if(a(p,h,o,m)==false){return false}});c(h).bind("paste.noblecount",function(p){b(h,k,o,m,false);setTimeout(function(){if(a(p,h,o,m)==false){d(h,k,o,m);return false}},5)})}function d(h,i,l,k){var j=c(h).val();c(h).val(j.substr(0,k));b(h,i,l,k,false)}function a(l,h,m,k){if(m.block_negative){var i=l.which;var j;if(typeof document.selection!="undefined"){j=(document.selection.createRange().text.length>0)}else{j=(h[0].selectionStart!=h[0].selectionEnd)}if((!((f(h,k)<1)&&(i>47||i==32||i==0||i==13)&&!l.ctrlKey&&!l.altKey&&!j))==false){return false}else{if((f(h,k)<1)&&l.type=="paste"){return false}}}return true}function f(h,i){return i-(c(h).val()).length}function b(h,j,m,k,i){var l=f(h,k);if(l<0){e(m.on_negative,m.on_positive,h,j,m,l)}else{e(m.on_positive,m.on_negative,h,j,m,l)}if(m.cloak){if(m.in_dom){j.attr("data-noblecount",l)}}else{j.text(l)}if(!i&&jQuery.isFunction(m.on_update)){m.on_update(h,j,m,l)}}function e(j,h,i,k,m,l){if(j!=null){if(typeof j=="string"){k.addClass(j)}else{if(jQuery.isFunction(j)){j(i,k,m,l)}}}if(h!=null){if(typeof h=="string"){k.removeClass(h)}}}})(jQuery); \ No newline at end of file