【问题标题】:Getting line breaks in a text area在文本区域中获取换行符
【发布时间】:2018-05-01 05:06:16
【问题描述】:

我想为文本区域中的电子邮件创建一种提前输入机制。

如果我在 textarea 中键入,控件将自动换行文本,因此我知道光标当前在哪里(即它的 x、y 位置)取决于这些换行符发生的位置。 (选择位置就是光标所在位置的字符数。)

我需要 x any y 位置,以便可以将可能的完成列表定位在光标下方。

有没有办法从控件中提取这个换行信息,或者我必须修改它并执行“滚动你自己的”文本换行算法(这很棘手,因为测量文本宽度并不容易在javascript中。)

任何帮助将不胜感激。

【问题讨论】:

  • 很少有办法做到这一点。将文本复制到隐藏或关闭的视口div 并获取它的宽度。如果div 的宽度大于文本字段的宽度,您就知道文本将换行。您的 Y 将增加line-height。对每一行重复,然后您也可以检测最后 X 的行宽。不是很容易,但可能会工作。

标签: javascript textarea selection


【解决方案1】:

用 jQuery 把所有东西放在一起。如果您需要 JavaScript 块,请告诉我。

$(function() {
  var textProps = [0, 0];
  $("textarea.allow-overflow").keyup(function(e) {
    var self = $(this);
    var text_width = $(".hidden").text(self.val()).css({
      'font-weight': self.css("font-weight"),
      'font-size': self.css("font-size"),
      'font-family': self.css("font-family"),
      'white-space': 'nowrap',
      'position': 'absolute',
      'display': 'block',
      'width': 'auto'
    }).hide().width();
    textProps[0] = $(".hidden").width();
    textProps[1] = $(".hidden").height();
    var overflows = text_width > self.width();
    var lines = 1;
    if (overflows) {
      lines = Math.floor(self.prop("scrollHeight") / $(".hidden").height());
      textProps[0] = textProps[0] - (self.width() * (lines - 1));
      textProps[1] = $(".hidden").height() * lines;
    }
    $(".report").html("X (Left): " + textProps[0] + "px, Y (Top): " + textProps[1] + "px, Wrap: " + overflows.toString() + ", Lines: " + lines);
  });
});
.widget label {
  display: block;
}

.widget .allow-overflow,
.report {
  width: 240px;
  font-family: Arial, "Helvetica Neue", Helvetica, sans-serif;
  font-size: 13px;
  font-weight: 400;
}

.report {
  border: 1px dashed #ccc;
  font-size: 9px;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div class="widget">
  <label>Type in me</label>
  <textarea class="allow-overflow"></textarea>
</div>
<div class="report">&nbsp;</div>
<div class="hidden"></div>

我们需要知道一些事情。

  1. 当我们溢出并在文本框中换行时。
  2. 文本框的宽度和字体属性
  3. 文本的行高

然后我们可以从文本框的[X (Left), Y (Top)] 计算当前光标位置。当我们输入文本时,它会增加隐藏div的widthheight

在第一行,这很简单,x = widthy = height。包装完毕后,我们现在必须计算偏移量和行数。

number of lines = floor( text box scroll height / hidden height )
x pos on line = hidden width - (width of text box * number of lines)
y pos = line height * number of lines

您可以将其推送到函数中并将结果数据清​​理到数组或对象中。

如果您允许调整大小,那么我们不能指望文本框的静态宽度和高度。所以,对于我的例子,我每次都抓住那个细节。

希望对您有所帮助。

【讨论】:

  • 这有点帮助,谢谢你把它放在一起,但是,问题是我需要知道换行符在哪里,而不仅仅是总行数。光标可能在文本中的任何位置,最终它是我需要的光标位置。
  • @FraserOrr 从技术上讲,没有换行符。换行符或回车换行 (\r\n) 是行尾 (EOL) 的唯一指示符。您正在尝试识别将文本换行到下一行的溢出点。这个没有分隔符,只能通过度量来实现。
  • 好的,谢谢大家,仅供参考,我把字体改成了等宽字体,这样可以更快地进行测量运算。使用 DOM 进行测量太慢了。
猜你喜欢
  • 2010-09-22
  • 2017-03-17
  • 1970-01-01
  • 2023-03-14
相关资源
最近更新 更多