使用 jQuery 限制 textarea 中的行数和显示行数

IT技术 javascript jquery html validation textarea
2021-02-10 09:19:43

使用 jQuery 我想:

  • 将用户可以在 textarea 中输入的行数限制为设定的数量
  • 出现一个行计数器,在输入行时更新行数
  • 返回键或 \n 将计为行
$(document).ready(function(){
  $('#countMe').keydown(function(event) {
    // If number of lines is > X (specified by me) return false
    // Count number of lines/update as user enters them turn red if over limit.

  });   
});


<form class="lineCount">
  <textarea id="countMe" cols="30" rows="5"></textarea><br>
  <input type="submit" value="Test Me">
</form>

<div class="theCount">Lines used = X (updates as lines entered)<div>

对于此示例,假设将允许的行数限制为 10。

5个回答

html:

<textarea id="countMe" cols="30" rows="5"></textarea>
<div class="theCount">Lines used: <span id="linesUsed">0</span><div>

js:

$(document).ready(function(){

    var lines = 10;
    var linesUsed = $('#linesUsed');

    $('#countMe').keydown(function(e) {

        newLines = $(this).val().split("\n").length;
        linesUsed.text(newLines);

        if(e.keyCode == 13 && newLines >= lines) {
            linesUsed.css('color', 'red');
            return false;
        }
        else {
            linesUsed.css('color', '');
        }
    });
});

小提琴:http : //jsfiddle.net/XNCkH/17/

Samuel Liew,非常感谢!我相信这会对很多人有帮助。
2021-03-22 09:19:43
您可以在文本区域使用“粘贴”事件
2021-03-26 09:19:43
当我粘贴大量行时,返回 false 似乎不起作用。如果超过允许的行数,是否可以修改此方法以确保用户无法提交表单?
2021-04-04 09:19:43
有没有办法将其转换为“点击”(按钮)方法?
2021-04-09 09:19:43

这里有一些改进的代码。在前面的示例中,您可以粘贴带有更多行的文本。

HTML

<textarea data-max="10"></textarea>
<div class="theCount">Lines used: <span id="linesUsed">0</span></div>

JS

jQuery('document').on('keyup change', 'textarea', function(e){

        var maxLines = jQuery(this).attr('data-max');        
        newLines = $(this).val().split("\n").length;

        console.log($(this).val().split("\n"));

        if(newLines >= maxLines) {
            lines = $(this).val().split("\n").slice(0, maxLines);
            var newValue = lines.join("\n");
            $(this).val(newValue);
            $("#linesUsed").html(newLines);
            return false;
        }

    });
在 HTML 部分,关闭的 div 没有关闭。
2021-04-04 09:19:43

对于将新值设置为 state 并将其转发给 props 的 React 功能组件:

const { onTextChanged,  numberOfLines, maxLength } = props;
const textAreaOnChange = useCallback((newValue) => {
        let text = newValue;
        if (maxLength && text.length > maxLength) return
        if (numberOfLines) text = text.split('\n').slice(0, numberOfLines ?? undefined)
        setTextAreaValue(text); onTextChanged(text)
    }, [numberOfLines, maxLength])

一个非常丑陋但以某种方式工作的示例指定文本区域的行

<textarea rows="3"></textarea>

然后在js中

   $("textarea").on('keydown keypress keyup',function(e){
       if(e.keyCode == 8 || e.keyCode == 46){
           return true;
       }
       var maxRowCount = $(this).attr("rows") || 2;
        var lineCount = $(this).val().split('\n').length;
        if(e.keyCode == 13){
            if(lineCount == maxRowCount){
                return false;
            }
        }
        var jsElement = $(this)[0];
        if(jsElement.clientHeight < jsElement.scrollHeight){
            var text = $(this).val();
            text= text.slice(0, -1);
            $(this).val(text);
            return false;
        }

    });
您仍然可以使用此代码粘贴 3 行以上。
2021-03-23 09:19:43

对于那里React粉丝,以及可能对 vanilla JS 事件处理程序的灵感:

onChange={({ target: { value } }) => {
    const returnChar = /\n/gi
    const a = value.match(returnChar)
    const b = title.match(returnChar)
    if (value.length > 80 || (a && b && a.length > 1 && b.length === 1)) return
    dispatch(setState('title', value))
}}

本示例将一个 textarea 限制为 2 行或总共 80 个字符。

它防止用新值更新状态,防止 React 将该值添加到 textarea。