是否有用于文本字段的jQuery自动增长插件?


68

我找到了各种插件来自动增长textarea,但没有输入文本字段。有人知道是否存在吗?


只是要澄清一下:您是否正在寻找某个人,当文本对于文本字段而言太大时,该字段会不断扩大以一次显示所有文本?
Paolo Bergantino,2009年

Answers:


146

这是一个插件,可以满足您的需求:

编辑:我已经按照Mathias的评论修复了插件。:)

在此处查看演示:http : //jsfiddle.net/rRHzY

插件:

(function($){

    $.fn.autoGrowInput = function(o) {

        o = $.extend({
            maxWidth: 1000,
            minWidth: 0,
            comfortZone: 70
        }, o);

        this.filter('input:text').each(function(){

            var minWidth = o.minWidth || $(this).width(),
                val = '',
                input = $(this),
                testSubject = $('<tester/>').css({
                    position: 'absolute',
                    top: -9999,
                    left: -9999,
                    width: 'auto',
                    fontSize: input.css('fontSize'),
                    fontFamily: input.css('fontFamily'),
                    fontWeight: input.css('fontWeight'),
                    letterSpacing: input.css('letterSpacing'),
                    whiteSpace: 'nowrap'
                }),
                check = function() {

                    if (val === (val = input.val())) {return;}

                    // Enter new content into testSubject
                    var escaped = val.replace(/&/g, '&amp;').replace(/\s/g,'&nbsp;').replace(/</g, '&lt;').replace(/>/g, '&gt;');
                    testSubject.html(escaped);

                    // Calculate new width + whether to change
                    var testerWidth = testSubject.width(),
                        newWidth = (testerWidth + o.comfortZone) >= minWidth ? testerWidth + o.comfortZone : minWidth,
                        currentWidth = input.width(),
                        isValidWidthChange = (newWidth < currentWidth && newWidth >= minWidth)
                                             || (newWidth > minWidth && newWidth < o.maxWidth);

                    // Animate width
                    if (isValidWidthChange) {
                        input.width(newWidth);
                    }

                };

            testSubject.insertAfter(input);

            $(this).bind('keyup keydown blur update', check);

        });

        return this;

    };

})(jQuery);

2
很棒的插件,詹姆斯!但是,有一个建议:如果删除文本时INPUT的大小也减小,那可能会很酷。
Mathias Bynens,2009年

1
感谢Mathias; 刚刚修复了它-它现在应该会按预期减少:)
詹姆斯

1
完善!您应该完全写博客。
Mathias Bynens,2009年

13
大!这完全是我一直在寻找的,您绝对应该在博客上进行搜索,并获得一些与此相关的链接诱饵,以便其他人可以在Google中找到它。
布拉德·盖斯勒

1
邪恶的剧本,詹姆斯!不知道我是否会使用它,但是自从我上次感觉到漂亮的javascript创造出的喜悦之情已经过去了一段时间!
Morten Bergfall

9

我在GitHub上有一个jQuery插件:https : //github.com/MartinF/jQuery.Autosize.Input

它使用与James回答相同的方法,但有一些注释中提到的更改。

您可以在此处看到一个实时示例:http : //jsfiddle.net/mJMpw/6/

例:

<input type="text" value="" placeholder="Autosize" data-autosize-input='{ "space": 40 }' />

input[type="data-autosize-input"] {
  width: 90px;
  min-width: 90px;
  max-width: 300px;
  transition: width 0.25s;    
}

您只需要使用CSS来设置最小/最大宽度,并在宽度上使用过渡效果即可。

您可以在输入元素上的data-autosize-input属性中以JSON表示法的值指定到末尾的距离。

当然,您也可以使用jQuery对其进行初始化

$("selector").autosizeInput();

7

好插件,谢谢!我更改了两个似乎在我的项目中更有效的方法。

  1. 我将TESTER标记更改为DIV,以避免收到“对方法或属性访问的意外调用”。在IE8中使用(即使您的演示在IE8中也可以使用。使用自定义HTML标记是否有特定原因?
  2. 在代码结尾附近的bind语句之后,我添加了对check()的调用,以在加载页面后立即调整文本框的大小,以防文本框在启动时已经在其中包含内容。

希望这可以帮助。


2
最后也使用了check()
斯塔福德·威廉姆斯,

当我在加载页面后运行检查功能时,什么都没有发生,但是onblur,onkeyup等工作正常。有谁知道为什么?
kuboslav 2012年

4

只是想分享James出色插件的一些小改进。将此代码添加到tester元素的CSS声明中,以解决文本缩进:

textIndent: 0

没有它,在某些情况下,测试器元素可能会无意间继承了其他地方的文本缩进,从而降低了输入的大小。

像JP一样,我也想从一开始就将输入的大小调整为正确的大小,这与我稍有不同,方法是将“ trigger('keyup')”链接到autoGrowInput方法调用,例如:

$('#contact_form').autoGrowInput({comfortZone: 7, minWidth: 10, maxWidth: 200}).trigger('keyup');

附带说明一下,我注册该网站纯粹是为了评论James的解决方案,我很生气地发现我不能,因为我没有足够的声誉点。抱歉,如果我错过了一些事情,但这似乎意味着我必须在主要问题上发表这则评论,而不是更恰当地阐述詹姆斯的解决方案。


2

我也换了

$(this).bind('keyup keydown blur update', check)

$(this).bind('keyup blur update', check).bind('keydown', function() {
    setTimeout(check);
});

为了在浏览器重新渲染后立即调整大小。它将使该领域摆脱混乱。


2

我为输入文本类型创建了一个插件,可重新创建此行为。它还有其他一些独特的功能。您可以查看示例并查看插件的文档。@james答案在将大文本粘贴到输入中时存在一些问题。为了解决这个问题,我对他的代码做了一些修改。这是此示例的演示

(function($){        
    $.fn.autoGrowInput = function(o) {

        o = $.extend({
            maxWidth: 200,
            minWidth: 1,
            comfortZone: 1,
          width: 1
        }, o);

        this.filter('input:text').each(function(){

            var minWidth = o.minWidth || $(this).width(),
                maxWidth = o.maxWidth,
                val = '',
                input = $(this),
                testSubject = $('<tester/>').css({
                    position: 'absolute',
                    top: -9999,
                    left: -9999,
                    width: 'auto',
                    fontSize: input.css('fontSize'),
                    fontFamily: input.css('fontFamily'),
                    fontWeight: input.css('fontWeight'),
                    letterSpacing: input.css('letterSpacing'),
                    whiteSpace: 'nowrap'
                }),
                check = function() {

                    if (val === (val = input.val())) {return;}

                    // Enter new content into testSubject
                    var escaped = val.replace(/&/g, '&amp;').replace(/\s/g,'&nbsp;').replace(/</g, '&lt;').replace(/>/g, '&gt;');
                    testSubject.html(escaped);

                    // Calculate new width + whether to change
                    var testerWidth = testSubject.width(),
                    newWidth = testerWidth + o.comfortZone,
                    currentWidth = input.width();

                   if (testerWidth < minWidth) {
                       newWidth = minWidth;
                   } else if (testerWidth > maxWidth) {
                       newWidth = maxWidth;
                   } 

                   input.width(newWidth + o.comfortZone);  
            };

            testSubject.insertAfter(input);

            $(this).bind('input', check);

        });

        return this;

    };

})(jQuery);

“输入”事件很棒!请注意:该事件在IE中无法正常工作:删除字符不会在IE9中触发此事件,而较早的版本根本没有该事件。
西蒙·斯坦伯格2014年

0

如果您希望文本框在其中的字符串超出宽度时增长,那么类似的方法可能对您有用...它将检测文本框的size属性。如果字符串的长度超过该属性,则它将在keyup上将文本框扩展为字符串的长度。

在以下脚本中,“#test”是文本框ID。

<script language="javascript" type="text/javascript">
$(document).ready(function(){
    $("#test").keyup(function(){
        if($("#test").attr("size") < $("#test").val().length){
            size = $("#test").val().length;
            $("#test").attr("size",size);
        }
    })
});
</script>

1
这取决于文本是固定宽度的字体。因此它不适用于Arial,verdana等字体。–
詹姆斯

0

在IE溢出中足够有趣:可见性非常重视。您可以通过应用overflow:在输入元素上可见来实现此效果。不知道现代浏览器是否存在任何类似的CSS技巧。


0

令人敬畏的插件James!谢谢。最后,我确实添加了JP的检查建议,尽管非常有效。

我也增加了一些改变。如果更改的宽度超过了maxWidth,我想将输入的大小设置为最大大小,所以我添加了:

else if (widthexceeds){
    input.width(o.maxWidth);
}

在isValidWidthChange的if检查下面,其中 widthexceeds = newWidth > o.maxWidth


0

我创建了一个插件input-autogrow来解决我自己的项目中的此问题。该插件最初基于James的答案,但已在许多方面进行了改进。

https://github.com/westonganger/input-autogrow

input-autogrow是用于自动增长输入的插件。该插件与其他插件不同,因为大多数插件通常以textarea标签为目标,而该库则以输入标签为目标。需要DOM库,例如jQuery,Zepto或任何支持$ .fn插件的库。

这是一些用法示例。

/* Makes elements readonly if they already have the readonly attribute */
$('input.autogrow').inputAutogrow();

/* Manually trigger update */
$('input.autogrow').trigger('autogrow');
/* or */
$('input.autogrow').trigger('change');

/* Custom Options */
$('input.autogrow').inputAutogrow({maxWidth: 500, minWidth: 25, trailingSpace: 10});

/* Remove autogrow from input */
$('input.autogrow').inputAutogrow('destroy');
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.