【问题标题】:textarea - prevent user to type more lines than specifiedtextarea - 防止用户输入多于指定的行数
【发布时间】:2026-01-27 09:20:03
【问题描述】:

我的文本区域是rows = "3",需要防止用户输入超过 3 行。

此代码阻止输入到第四行,但无论如何设置了该行。

如果已经存在三行,如何按Enter 防止输入新行?

$('.tx').on('keypress', function () {
   let max = parseInt($(this).attr('rows'));
   let a = $(this).val();
   let x = a.split("\n").length - 1;
   if(x == max){return false;}
});
.tx{
display:block;
width:100%;
background:gold;
line-height:1.3em;
text-transform:uppercase;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<textarea class='tx' rows = "3"></textarea>

【问题讨论】:

  • @Jeto 请将您链接上的答案与Certain Performance'ssolution 进行比较?如果某个问题已经在本网站的历史中 - 并不意味着它包含最佳答案并且永远有效
  • 所选答案处理复制和粘贴,问题也有多种答案(有和没有 jQuery)并且受到保护,因此它应该仍然有效。它可能使用较旧的 Javascript 语法(因为答案有点过时)是唯一的。
  • 不是a bit dated - 它是10 years dated。你们的管理员应该停止这种不良做法。
  • 我不是管理员,这只是一个投票。只有当足够多的人同意时才会关闭问题(并首先查看这个问题)。如果愿意,只需使用@CertainPerformance 的(很棒的)答案。

标签: javascript jquery textarea


【解决方案1】:

如果按下的键是Enter,并且当前行数达到最大值,则应阻止该事件:

$('.tx').on('keypress', function(e) {
  const maxRows = Number($(this).attr('rows'));
  const currRows = $(this).val().split("\n").length;
  if (maxRows === currRows && e.key === 'Enter') {
    e.preventDefault();
  }
});
.tx {
  display: block;
  width: 100%;
  background: gold;
  line-height: 1.3em;
  text-transform: uppercase;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<textarea class='tx' rows="3"></textarea>

请注意,这种技术仅适用于 键入 字符 - 通过粘贴、单击拖动等方式输入的字符仍可能包含不需要的 \ns,因此您可能会用换行符和 @ 分割987654326@ 改为修剪它们:

$('.tx').on('keypress paste', function(e) {
  setTimeout(() => tryReplace(e.target));
});

function tryReplace(textarea) {
  const maxRows = textarea.rows;
  textarea.value = textarea.value
    .split('\n')
    .slice(0, 3)
    .join('\n');
}
.tx {
  display: block;
  width: 100%;
  background: gold;
  line-height: 1.3em;
  text-transform: uppercase;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<textarea class='tx' rows="3"></textarea>

【讨论】:

  • 请注意,这不会阻止复制和粘贴(但问题没有提到这一点,因此可能不需要)。
  • let max = parseInt($(this).attr('rows')); vs const maxRows = Number($(this).attr('rows')); - 有什么特殊原因吗?
  • 另请注意,如果用户只是键入输入而不按回车键,则此技术不起作用。在这种情况下,我们可以输入 n 行。不确定是否需要满足此条件,因为问题提到“限制为 3 行”。
  • @Santhoshmp,我明白了,你是对的,也许 css white-space:nowrap 有帮助