berikiushi
4/20/2017 - 9:28 PM

jQuery autoResize (textarea auto-resizer)

jQuery autoResize (textarea auto-resizer)

/*
 * jQuery autoResize (textarea auto-resizer)
 * @copyright James Padolsey http://james.padolsey.com
 * @version 1.04
 *
 * cracked by icyleaf <icyleaf.cn@gmail.com>
 * Search and Find the keyword '[NEW ADDED]' for details.
 */

(function($){
    
    $.fn.autoResize = function(options) {
        
        // Just some abstracted details,
        // to make plugin users happy:
        var settings = $.extend({
            onResize : function(){},
            animate : true,
            animateDuration : 150,
            animateCallback : function(){},
            extraSpace : 20,
            limit: 500
        }, options);
		
        // Only textarea's auto-resize:
        this.filter('textarea').each(function(){
            
            // Get rid of scrollbars and disable WebKit resizing:
            var textarea = $(this).css({resize:'none','overflow-y':'hidden'}),
      
			// Cache original height, for use later:
			origHeight = textarea.height(),
			
			// Need clone of textarea, hidden off screen:
			clone = (function(){
				
				// Properties which may effect space taken up by chracters:
				var props = ['height','width','lineHeight','textDecoration','letterSpacing'],
					propOb = {};
					
				// Create object of styles to apply:
				$.each(props, function(i, prop){
					propOb[prop] = textarea.css(prop);
				});
				
				// Clone the actual textarea removing unique properties
				// and insert before original textarea:
				return textarea.clone().removeAttr('id').removeAttr('name').css({
					position: 'absolute',
					top: 0,
					left: -9999
				}).css(propOb).attr('tabIndex','-1').insertBefore(textarea);
				
			})(),
			lastScrollTop = null,
			updateSize = function() {
			
				// Prepare the clone:
				clone.height(0).val($(this).val()).scrollTop(10000);
				
				// Find the height of text:
				var scrollTop = Math.max(clone.scrollTop(), origHeight) + settings.extraSpace,
					toChange = $(this).add(clone);

				// Don't do anything if scrollTip hasen't changed:
				if (lastScrollTop === scrollTop) { return; }
				lastScrollTop = scrollTop;
				
				// Check for limit:
				if ( scrollTop >= settings.limit ) {
					// [NEW ADDED] 
					// Do NOT limit height when limit = 0
					if ( settings.limit != 0) {
						// Applied limit height
						$(this).css('overflow-y','').css('height', settings.limit+'px');
						return;
					}
				}
				// Fire off callback:
				settings.onResize.call(this);
				
				// Either animate or directly apply height:
				settings.animate && textarea.css('display') === 'block' ?
					toChange.stop().animate({height:scrollTop}, settings.animateDuration, settings.animateCallback)
					: toChange.height(scrollTop);
			};
		
            // Bind namespaced handlers to appropriate events:
            textarea
                .unbind('.dynSiz')
                .bind('keyup.dynSiz', updateSize)
                .bind('keydown.dynSiz', updateSize)
                .bind('change.dynSiz', updateSize);
            
        });
        
        // Chain:
        return this;
        
    };
    
    
    
})(jQuery);