【问题标题】:Limit number of characters per line in multiline field限制多行字段中每行的字符数
【发布时间】:2018-05-15 13:37:53
【问题描述】:

我需要具有 TextArea 的功能

  1. 每行最多只能有 30 个字符
  2. 不想在键入时修剪任何值,一行中超过 30 个的下一个字符需要自动出现在下一行

我正在使用下面的代码,但它会在粘贴包含 30 多个字符的行时修剪下一行的第一个字符。

<textarea id="textareainput"></textarea>


var input= document.getElementById("textareainput");
var lines = input.value.split("\n");
var start = input.selectionStart;
var end = input.selectionEnd;

for (var i = 0; i < lines.length; i++) {
  if (lines[i].length <= 30) continue;
  var j = 0; space = 30;
  while (j++ <= 30) {
    if (lines[i].charAt(j) === " ") space = j;
  }
  lines[i + 1] = lines[i].substring(space + 1) + (lines[i + 1] ? " " + lines[i + 1] : "");
  lines[i] = lines[i].substring(0, space);
}

input.value = lines.slice(0, lines.length).join("\n");

if (start == end) {
  input.setSelectionRange(start, end);
}

【问题讨论】:

标签: javascript jquery html textarea


【解决方案1】:

尝试以下(您的代码稍作改动)

   $('#textareainput').on('input focus keydown keyup', function() {
    var input= document.getElementById("textareainput");
var lines = input.value.split("\n");
var start = input.selectionStart;
var end = input.selectionEnd;

for (var i = 0; i < lines.length; i++) {
  if (lines[i].length <= 30) continue;
  var j = 0; space = 30;
  while (j++ <= 30) {
    if (lines[i].charAt(j) === " ") space = j;
  }
  lines[i + 1] = lines[i].substring(space) + (lines[i + 1] ? " " + lines[i + 1] : "");
  lines[i] = lines[i].substring(0, space);
}

input.value = lines.slice(0, lines.length).join("\n");


});

由于光标定位问题更新解决方案:

 function setSelectionRange(input, selectionStart, selectionEnd) {
  if (input.setSelectionRange) {
    input.focus();
    input.setSelectionRange(selectionStart, selectionEnd);
  }
  else if (input.createTextRange) {
    var range = input.createTextRange();
    range.collapse(true);
    range.moveEnd('character', selectionEnd);
    range.moveStart('character', selectionStart);
    range.select();
  }
}

function setCaretToPos (input, pos) {
  setSelectionRange(input, pos, pos);
}
 function formatStr(str, n) {
   var a = [], start=0;
   while(start<str.length) {
      a.push(str.slice(start, start+n));
      start+=n;
   }
  return a.join("\n");
}

$('#textareainput').on('input focus keydown keyup', function() {
    var input= document.getElementById("textareainput");
var lines = input.value.split("\n");
var start = input.selectionStart;
var end = input.selectionEnd;

var v = input.value;
        var vl = v.replace(/(\r\n|\n|\r)/gm,""); //remove all newlines  

        input.value = formatStr(vl,30);

        var lines1 = input.value.split("\n");

        if (start == end)   {
            if(lines1.length!=lines.length)
                setCaretToPos(input, end+1);
            else
            setCaretToPos(input, end); 
        }
});

【讨论】:

  • 谢谢 IStepashka。我尝试了代码,结果正确,但选择范围不正确。因为我正在使用 input.setSelectionRange(start, end);。你能帮我解决这个问题吗
  • 请解释一下为什么需要line input.setSelectionRange(start, end)?无论如何,光标将位于字符行的末尾...
  • 我需要它,因为如果用户需要在开头添加一些评论/添加其他文本。如果我没有设置 SelectionRange,光标会在尝试键入输入文本之间的任何位置时自动重定向到结束。
  • 感谢您的解决方案。我完成了解决方案,但它在每行中吐出 10 个字符。我想要一个解决方案,比如用户输入“你好,我喜欢你”(从第一个字符“H”开始计算,第 10 个字符是“L”但它是整个单词“Like”,它不应该中断并继续下一个行例如当前单词如下 Hello, IL ike 需要增强代码以将整个单词移到下一行,如下所示:Hello, I Like You
  • 另外,如果我输入 1234567890 1234567890 它会正确分割行,但是当我尝试在开头输入“ab”时,它应该如下所示
    ab12345678
    9012345678 90,但使用当前代码,它得到 a1b2345678 9012345678 90
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-31
  • 2011-02-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多