title: textarea autogrow functionality jitters with every keystroke
body: <p>I was playing around with the jquery autogrow plugin, which expands the height of the text automatically as the text needs it. The problem is that with every key down, the bottom border of the textarea jitters in a noticeable way. I'm not sure what the problem could be, so I'm going to go out on a limb and post the 132 lines of this GPL plugin here. Any hints where the problem could be or how to circumvent it?</p>
  
  <pre><code>         /* 
  
        Auto Expanding Text Area (1.2.2)  by Chrys Bader */
  
          (function(jQuery) {
             var self = null;     
             jQuery.fn.autogrow = function(o){
               return this.each(function() {  
                  new jQuery.autogrow(this, o);
               });
             };
  
  
        /**
        * The autogrow object.
        *
        * @constructor
        * @name jQuery.autogrow
        * @param Object e The textarea to create the autogrow for.
        * @param Hash o A set of key/value pairs to set as configuration properties.
        * @cat Plugins/autogrow
        */        
  
       jQuery.autogrow = function (e, o) {
          this.options = o || {};         
          this.dummy = null;
          this.interval = null;
          this.line_height = this.options.lineHeight || parseInt(jQuery(e).css('line-height'));
          this.min_height = this.options.minHeight || parseInt(jQuery(e).css('min-height'));
          this.max_height = this.options.maxHeight || parseInt(jQuery(e).css('max-height'));;
          this.textarea = jQuery(e);
  
         if(this.line_height == NaN) this.line_height = 0;
  
         // Only one textarea activated at a time, the one being used
         this.init();     
      };  
  
      jQuery.autogrow.fn = jQuery.autogrow.prototype = { autogrow: '1.2.2' };
      jQuery.autogrow.fn.extend = jQuery.autogrow.extend = jQuery.extend;
      jQuery.autogrow.fn.extend({ init: function(){
         var self = this;
         this.textarea.css({overflow: 'hidden', display: 'block'});
         this.textarea.bind('focus', function(){ self.startExpand() }).bind('blur', function() { self.stopExpand() });
         this.checkExpand();
      },
  
      startExpand: function() { 
          var self = this;
          this.interval = window.setInterval(function() { self.checkExpand()}, 400); },
      stopExpand: function() { clearInterval(this.interval); },
      checkExpand: function() { 
         if (this.dummy == null) {
            this.dummy = jQuery('&lt;div&gt;&lt;/div&gt;');
            this.dummy.css({
               'font-size'  : this.textarea.css('font-size'),
               'font-family': this.textarea.css('font-family'),
               'width'      : this.textarea.css('width'),
               'padding'    : this.textarea.css('padding'),
               'line-height': this.line_height + 'px',
               'overflow-x' : 'hidden',
               'position'   : 'absolute',
               'top'        : 0,
               'left'    : -9999
            }).appendTo('body');
        }
  // Strip HTML tags          
  var html = this.textarea.val().replace(/(&lt;|&gt;)/g,'');
  // IE is different, as per usual            
  if ($.browser.msie){
      html = html.replace(/\n/g, '&lt;BR&gt;new');
  } else {
      html = html.replace(/\n/g, '&lt;br&gt;new');
  }
  
  if (this.dummy.html() != html){
     this.dummy.html(html);
  
  if (this.max_height &gt; 0 &amp;&amp; (this.dummy.height() + this.line_height &gt; this.max_height)){
      this.textarea.css('overflow-y', 'auto');
  } else { 
      this.textarea.css('overflow-y', 'hidden');
      if (this.textarea.height() &lt; this.dummy.height() + this.line_height || (this.dummy.height() &lt; this.textarea.height())) {
      this.textarea.animate({height: (this.dummy.height() + this.line_height) + 'px'}, 100); 
  }
  }
  } 
  }
  }); 
  })(jQuery);
  </code></pre>