JSFiddle - React, Tailwind, and code Playground

by darkajax

HTML

<html>
    <head>
        <title>Textarea Characters, Words Counter and Characters Limitation</title>
        
    </head>
    <body>
        
        <h2>Message1</h2>
        <textarea id="testTextarea" cols="50" rows="10"></textarea>
        <div id="showData1"></div>
        <h2>Message2</h2>
        <textarea id="testTextarea2" cols="50" rows="10"></textarea>
        <div id="showData2"></div>
        <h2>Message3</h2>
        <textarea id="testTextarea3" cols="50" rows="10"></textarea>
        <div id="showData3"></div>
        <div id="overallpoints">Overall points: <div id="showData4"></div></div>
        
    </body>
</html>

CSS

body {
                font-size: 12px;
                font-family: Arial, Helvetica, sans-serif;
                line-height: 20px;
                color: #333333;
            }
            h2 {
    font-weight:bold;
    font-size:20px;
    margin:10px 0;
}
#overallpoints {
position:fixed;
    top:0px;
    right:20px;
}       
            a {
                color: #333333;
                text-decoration: none;
            }
            
            .overview {
                background: #FFEC9D;
                padding: 10px;
                width: 90%;
                border: 1px solid #CCCCCC;
            }
            
            .originalTextareaInfo {
                font-size: 12px;
                color: #000000;
                font-family: Tahoma, sans-serif;
                text-align: right
            }
            
            .warningTextareaInfo {
                font-size: 12px;
                color: #FF0000;
                font-family: Tahoma, sans-serif;
                text-align: right
            }
            
            #showData {
                height: 70px;
                width: 200px;
                border: 1px solid #CCCCCC;
                padding: 10px;
                margin: 10px;
            }

JavaScript

(function($){  
    $.fn.textareaCount = function(options, fn) {   
        var defaults = {  
            maxCharacterSize: -1,  
            originalStyle: 'originalTextareaInfo',
            warningStyle: 'warningTextareaInfo',  
            warningNumber: 20,
            displayFormat: '#input characters | #words words'
        };  
        var options = $.extend(defaults, options);
        
        var container = $(this);
        
        $("<div class='charleft'>&nbsp;</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);});
        
        
        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.length;
            
            //Start Cut
            if(options.maxCharacterSize > 0){
                //If copied content is already more than maxCharacterSize, chop it to maxCharacterSize.
                if(contentLength >= options.maxCharacterSize) {
                    content = content.substring(0,...