jQuery auto resize function causes jumping in browser
<p>I like this text expander because it doesn't lock up the keyboard occasionally like others seem to do as they are calculating the resize.  However, when I use it the browser sometimes jumps to the top of the page when it resizes (rather than staying put at the point in the page I've scrolled to).  Any suggestions on how to fix this?</p>

<pre><code>/**
 * TextAreaExpander plugin for jQuery
 * v1.0
 * Expands or contracts a textarea height depending on the
 * quatity of content entered by the user in the box.
 *
 * By Craig Buckler, Optimalworks.net
 *
 * As featured on SitePoint.com:
 * http://www.sitepoint.com/blogs/2009/07/29/build-auto-expanding-textarea-1/
 *
 * Please use as you wish at your own risk.
 */

/**
 * Usage:
 *
 * From JavaScript, use:
 *     $(&lt;node&gt;).TextAreaExpander(&lt;minHeight&gt;, &lt;maxHeight&gt;);
 *     where:
 *       &lt;node&gt; is the DOM node selector, e.g. "textarea"
 *       &lt;minHeight&gt; is the minimum textarea height in pixels (optional)
 *       &lt;maxHeight&gt; is the maximum textarea height in pixels (optional)
 *
 * Alternatively, in you HTML:
 *     Assign a class of "expand" to any &lt;textarea&gt; tag.
 *     e.g. &lt;textarea name="textarea1" rows="3" cols="40" class="expand"&gt;&lt;/textarea&gt;
 *
 *     Or assign a class of "expandMIN-MAX" to set the &lt;textarea&gt; minimum and maximum height.
 *     e.g. &lt;textarea name="textarea1" rows="3" cols="40" class="expand50-200"&gt;&lt;/textarea&gt;
 *     The textarea will use an appropriate height between 50 and 200 pixels.
 */

(function($) {

    // jQuery plugin definition
    $.fn.TextAreaExpander = function(minHeight, maxHeight) {

        var hCheck = !($.browser.msie || $.browser.opera);

        // resize a textarea
        function ResizeTextarea(e) {

            // event or initialize element?
            e = e.target || e;

            // find content length and box width
            var vlen = e.value.length, ewidth = e.offsetWidth;
            if (vlen != e.valLength || ewidth != e.boxWidth) {

                if (hCheck &amp;&amp; (vlen &lt; e.valLength || ewidth != e.boxWidth)) e.style.height = "0px";
                var h = Math.max(e.expandMin, Math.min(e.scrollHeight, e.expandMax));

                e.style.overflow = (e.scrollHeight &gt; h ? "auto" : "hidden");
                e.style.height = h + "px";

                e.valLength = vlen;
                e.boxWidth = ewidth;
            }

            return true;
        };

        // initialize
        this.each(function() {

            // is a textarea?
            if (this.nodeName.toLowerCase() != "textarea") return;

            // set height restrictions
            var p = this.className.match(/expand(\d+)\-*(\d+)*/i);
            this.expandMin = minHeight || (p ? parseInt('0'+p[1], 10) : 0);
            this.expandMax = maxHeight || (p ? parseInt('0'+p[2], 10) : 99999);

            // initial resize
            ResizeTextarea(this);

            // zero vertical padding and add events
            if (!this.Initialized) {
                this.Initialized = true;
                $(this).css("padding-top", 0).css("padding-bottom", 0);
                $(this).bind("keyup", ResizeTextarea).bind("focus", ResizeTextarea);
            }
        });

        return this;
    };

})(jQuery);
</code></pre>
