Gravity Forms uses a jQuery character count plugin called ‘jQuery Textarea Characters Counter Plugin v 2.0’ to handle the character counting and associated functions for form fields.
The plugin lives in a file located at \wp-plugins\gravityforms\js\jquery.textareaCounter.plugin.js
The code below is a copy of this plugin, but has been adapted to only count characters and not spaces.
To implement you need to replace this code with the copy on your Gravity Forms install.
Please note: because we are replacing a file you will need to replace the file each time you update Gravity Forms.
Download: jquery.textareaCounter.plugin.js (right-click -> save as)
/* * jQuery Textarea Characters Counter Plugin v 2.0 * Examples and documentation at: http://roy-jin.appspot.com/jsp/textareaCounter.jsp * Copyright (c) 2010 Roy Jin * Version: 2.0 (11-JUN-2010) * Dual licensed under the MIT and GPL licenses: * http://www.opensource.org/licenses/mit-license.php * http://www.gnu.org/licenses/gpl.html * Requires: jQuery v1.4.2 or later */ (function($){ $.fn.textareaCount = function(options, fn) { var defaults = { maxCharacterSize: -1, originalStyle: 'originalTextareaInfo', warningStyle: 'warningTextareaInfo', warningNumber: 0, displayFormat: '#input characters | #words words' }; var options = $.extend(defaults, options); var container = $(this); $("<div class='charleft'> </div>").insertAfter(container); //create charleft css var charLeftCss = { 'width' : container.width() }; var charLeftInfo = getNextCharLeftInformation(container); charLeftInfo.addClass(options.originalStyle); //charLeftInfo.css(charLeftCss); var numInput = 0; var maxCharacters = options.maxCharacterSize; var numLeft = 0; var numWords = 0; container.bind('keyup', function(event){limitTextAreaByCharacterCount();}) .bind('mouseover', function(event){setTimeout(function(){limitTextAreaByCharacterCount();}, 10);}) .bind('paste', function(event){setTimeout(function(){limitTextAreaByCharacterCount();}, 10);}); limitTextAreaByCharacterCount(); function limitTextAreaByCharacterCount(){ charLeftInfo.html(countByCharacters()); //function call back if(typeof fn != 'undefined'){ fn.call(this, getInfo()); } return true; } function countByCharacters(){ var content = container.val(); var contentLength = content.replace(/\s/g, "").length; var term = "\\s*(?:\\S\\s*){0,"+options.maxCharacterSize+"}"; // RegEx - unlimited spaces, characters up to set character limit var rgxp = new RegExp(term, "g"); // query for characters to character limit, excluding spaces var xxx = content.match(rgxp) ? content.match(rgxp) : ' ' ; // get characters to amount var rgxp2 = new RegExp(" ", "g"); // query to count spaces in set amount var contentSpaceCount = String(xxx).match(rgxp2) ? String(xxx).match(rgxp2).length : 0; // count spaces in amount //Start Cut if(options.maxCharacterSize > 0){ var num = options.maxCharacterSize + contentSpaceCount; //If copied content is already more than maxCharacterSize, chop it to maxCharacterSize. if(contentLength >= options.maxCharacterSize) { content = content.substring(0, options.maxCharacterSize + contentSpaceCount); } var newlineCount = getNewlineCount(content); // newlineCount new line character. For windows, it occupies 2 characters var systemmaxCharacterSize = options.maxCharacterSize - newlineCount; if (!isWin()){ systemmaxCharacterSize = options.maxCharacterSize } if(contentLength > systemmaxCharacterSize ){ //avoid scroll bar moving var originalScrollTopPosition = this.scrollTop; container.val(content.substring(0, systemmaxCharacterSize + contentSpaceCount)); this.scrollTop = originalScrollTopPosition; } charLeftInfo.removeClass(options.warningStyle); if(systemmaxCharacterSize - contentLength <= options.warningNumber){ charLeftInfo.addClass(options.warningStyle); } numInput = container.val().replace(/\s/g, "").length + newlineCount; if(!isWin()){ numInput = container.val().replace(/\s/g, "").length; } numWords = countWord(getCleanedWordString(container.val())); numLeft = maxCharacters - numInput; } else { //normal count, no cut var newlineCount = getNewlineCount(content); numInput = container.val().replace(/\s/g, "").length + newlineCount; if(!isWin()){ numInput = container.val().replace(/\s/g, "").length; } numWords = countWord(getCleanedWordString(container.val())); } return formatDisplayInfo(); } function formatDisplayInfo(){ var format = options.displayFormat; format = format.replace('#input', numInput); format = format.replace('#words', numWords); //When maxCharacters <= 0, #max, #left cannot be substituted. if(maxCharacters > 0){ format = format.replace('#max', maxCharacters); format = format.replace('#left', numLeft); } return format; } function getInfo(){ var info = { input: numInput, max: maxCharacters, left: numLeft, words: numWords }; return info; } function getNextCharLeftInformation(container){ return container.next('.charleft'); } function isWin(){ var strOS = navigator.appVersion; if (strOS.toLowerCase().indexOf('win') != -1){ return true; } return false; } function getNewlineCount(content){ var newlineCount = 0; for(var i=0; i<content.length;i++){ if(content.charAt(i) == '\n'){ newlineCount++; } } return newlineCount; } function getCleanedWordString(content){ var fullStr = content + " "; var initial_whitespace_rExp = /^[^A-Za-z0-9]+/gi; var left_trimmedStr = fullStr.replace(initial_whitespace_rExp, ""); var non_alphanumerics_rExp = rExp = /[^A-Za-z0-9]+/gi; var cleanedStr = left_trimmedStr.replace(non_alphanumerics_rExp, " "); var splitString = cleanedStr.split(" "); return splitString; } function countWord(cleanedWordString){ var word_count = cleanedWordString.length-1; return word_count; } }; })(jQuery);