jQuery - Textarea自动增长插件跨浏览器兼容

时间:2012-03-20 09:55:31

标签: jquery plugins textarea

我需要一个跨浏览器兼容的插件,当内部文本被写入或删除时,textrea会自动增长和缩小。

我尝试了Elastic插件和Padolsey autoresize插件。两者都在Firefox 3.6中失败。

6 个答案:

答案 0 :(得分:7)

我一直在使用以下代码段:Autogrow script @ Javascript Bindings for the Google AppEngine Data Store Project on Google Code

万一URL可能已关闭或删除,请输入以下代码:

(function($) {

/*
 * Auto-growing textareas; technique ripped from Facebook
 */
$.fn.autogrow = function(options) {

    this.filter('textarea').each(function() {

        var $this       = $(this),
            minHeight   = $this.height(),
            lineHeight  = $this.css('lineHeight');

        var shadow = $('<div></div>').css({
            position:   'absolute',
            top:        -10000,
            left:       -10000,
            width:      $(this).width() - parseInt($this.css('paddingLeft')) - parseInt($this.css('paddingRight')),
            fontSize:   $this.css('fontSize'),
            fontFamily: $this.css('fontFamily'),
            lineHeight: $this.css('lineHeight'),
            resize:     'none'
        }).appendTo(document.body);

        var update = function() {

            var times = function(string, number) {
                for (var i = 0, r = ''; i < number; i ++) r += string;
                return r;
            };

            var val = this.value.replace(/</g, '&lt;')
                                .replace(/>/g, '&gt;')
                                .replace(/&/g, '&amp;')
                                .replace(/\n$/, '<br/>&nbsp;')
                                .replace(/\n/g, '<br/>')
                                .replace(/ {2,}/g, function(space) { return times('&nbsp;', space.length -1) + ' ' });

            shadow.html(val);
            $(this).css('height', Math.max(shadow.height() + 20, minHeight));

        }

        $(this).change(update).keyup(update).keydown(update);

        update.apply(this);

    });

    return this;

} })(jQuery);

要使用,只需在想要自动增长的textareas上调用它。

示例:

$('textarea').autogrow();

答案 1 :(得分:2)

jQuery expandable -

  

一个jQuery插件,可以自动扩展textareas以适应用户输入的内容

这是另一个伟大的textarea自动增长插件,与@Lashae发布的方法相同,但没有额外的功能,如动画。

答案 2 :(得分:1)

在1.6+中你不再需要一个插件来实现这一点,只需将一个改变事件绑定到这个函数,你的textareas就会慷慨地扩展:

function form_autosize(this_element){

    //Catch the current scroll position to stop it from jumping about in some browsers

    this_scroll = $(window).scrollTop();

    //Clear any existing height settings

    $(this_element).css('height', '');

    //Set the textarea to scroll so that you can capture its height

    $(this_element).css('overflow', 'scroll');

    //Set the element height to the current scroll height

    $(this_element).height($(this_element).prop('scrollHeight'));

    //Hide the scrollbars

    $(this_element).css('overflow', 'hidden');

    //Re-apply the scroll position

    $(window).scrollTop(this_scroll);

这似乎在Chrome,Opera,Firefox和Safari的最新版本中运行良好。尚未尝试过Internet Explorer或旧版本。

合适的变更事件可能是:

$(this_element).on('keyup change paste', function() { form_autosize(this_element) });

答案 3 :(得分:0)

这是一个基于上述代码段的插件,但修复了IE&lt; = 8问题,并且还支持textareas的水平增长。

https://github.com/dgbeck/jquery.autogrow-textarea

答案 4 :(得分:0)

我在jQuery中使用了这个方法。

setInterval(function(){
      $(name_textarea).css('height', $(name_textarea)[0].scrollHeight+2+'px')
},100);

尝试一下,你可以在scrollHeight后面使用de number来获得最佳效果。

答案 5 :(得分:0)

我刚刚为它编写了一个angular指令(没有jQuery依赖), 看看:angular-autogrow directive(GitHub)