【问题标题】:jQuery - auto-expanding textarea doesn't handle pasted inputjQuery - 自动扩展文本区域不处理粘贴的输入
【发布时间】:2017-10-27 17:12:10
【问题描述】:

我正在尝试根据输入的文本自动扩展/缩小文本区域。 textarea 的指定高度为250px,并且可以在overfow: auto 使用滚动条进入之前自动扩展到450px。在文本区域中输入文本时它可以完美运行,但在粘贴大量文本时效果不佳。

在此处查看小提琴:https://jsfiddle.net/ynv6yta8/1/

还有一个sn-p:

// auto-expand/shrink text area
$('#mytextarea').bind('input propertychange paste', function() {
  var oldHeight = parseInt($(this).height());
  
  if (this.scrollHeight < 450) {
    $(this).height(0).height(this.scrollHeight);
  }
}).change();
#mytextarea {
  height: 250px;
  width: 450px;
  min-height: 250px;
  min-width: 450px;
  resize: none;
  overflow: auto;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<textarea id="mytextarea"></textarea>

我没有在小提琴中留下任何调试语句,但该事件确实在粘贴时被正确触发,但 this.scrollHeight 总是评估为 250px 附近的东西,即使粘贴的文本非常大。我猜this.scrollHeightpaste 事件被触发时还没有更新?我该如何解决这个问题?

【问题讨论】:

  • 我无法在 Chrome 61、Firefox 56 或 Safari 11 中重现该问题。
  • 是的,您的猜测是正确的,粘贴在值实际更改之前触发。您可以在延迟函数中对文本区域进行更改,或者使用input 事件而不是您拥有的所有事件。请注意,propertychange(仅限 IE?)很容易导致无限循环。

标签: javascript jquery html css


【解决方案1】:

这对我有用:

$(document).on("input", "textarea", function()
{
   $(this).prop('style').cssText = 'height:auto;';
   $(this).prop('style').cssText = 'height:' + $(this).prop('scrollHeight') + 'px';
});

CSS:

textarea
{
    resize:none;
    max-height:450px;
    min-height:250px;
}

灵感来自https://codepen.io/vsync/pen/czgrf

jsfiddle:Here

【讨论】:

  • 为什么包含'height:auto;'的行必要的?没有那条线也可以工作。
  • 看来你是对的,没有那条线它也能工作。 ?
  • 我收回了,没有高度:自动;盒子膨胀,从不收缩。试试这个 Fiddle 以获得一个想法。 jsfiddle.net/TheKimster/3dvqrpty/1
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-06
  • 2016-09-26
  • 1970-01-01
  • 1970-01-01
  • 2020-11-02
相关资源
最近更新 更多