简体   繁体   English

在textarea中限制单行中的行数和字母数

[英]Limiting number of lines and letters in single line in textarea

Problem: 问题:
I am trying to limit number of lines AND letters in each line in a textbox. 我试图限制文本框中每行的行数和字母数。

What i got so far: 到目前为止我得到了什么:
So far i managed to limit lines count using this: 到目前为止,我设法限制行计数使用此:

var text = $(this).val();
var lines = text.split("\n");

if(e.keyCode == 13 && lines.length >= $(this).attr('rows')) { 
        return false;
    }

This won't allow user to push return key (keyCode 13) if the limit of lines is reached. 如果达到行数限制,则不允许用户按下返回键(keyCode 13)。

The problem: 问题:
Now i am trying to limit number of letters in a single line too, because if i reach end of my textarea (with return key) i still can hold a letter/write tons of text, and it will jump to another line when it reaches end of line. 现在我也试图限制一行中的字母数量,因为如果我到达我的textarea的末尾(带有返回键)我仍然可以持有一个字母/写入大量文本,当它到达时它将跳转到另一行行结束。 That way this limitation can be "cheated" and i am looking for a solution for that. 这样,这种限制可能会被“欺骗”,我正在寻找解决方案。

My ideas, not solving the problem: 我的想法,没有解决问题:

else{
    for(var i = 0; i < lines.length && e.keyCode != 13; i++) {
         if(lines[i].length >= $(this).attr('cols')) {
             return false; // prevent characters from appearing
         }
     }
}

I tried this to limit number of letters. 我试过这个来限制字母数量。 That works, but it got flaws. 这有效,但它有缺陷。 If i reach max letters in one line ( ANY ), i CANT TYPE IN ANY LINE anymore. 如果我在一行中找到最大字母( ANY ),我就可以在任何行中输入

I have no idea how to check only line i am typing in RIGHT NOW. 我不知道如何只检查我正在输入的行。

Tested in chrome : http://jsfiddle.net/3e3EH/1/ 用chrome测试: http//jsfiddle.net/3e3EH/1/

$(document).ready(function(){
    var textArea = $('#foo');
    var maxRows = textArea.attr('rows');
    var maxChars = textArea.attr('cols');
    textArea.keypress(function(e){
        var text = textArea.val();
        var lines = text.split('\n');
        if (e.keyCode == 13){
            return lines.length < maxRows;
        }
        else{
            var caret = textArea.get(0).selectionStart;
            console.log(caret);

            var line = 0;
            var charCount = 0;
            $.each(lines, function(i,e){
                charCount += e.length;
                if (caret <= charCount){
                    line = i;
                    return false;
                }
                //\n count for 1 char;
                charCount += 1;
            });

            var theLine = lines[line];
            return theLine.length < maxChars;
        }
    });

});​

Edit 编辑

As jbabey pointed out, ctrl+v or right-click -> paste can be an issue. 正如jbabey指出的那样,ctrl + v或右击 - >粘贴可能是一个问题。 right click can easily be prevented. 右键单击很容易被阻止。 for ctrl+v, you probable can detect it too... Just disabling javascript will obviously break the thing, too. 对于ctrl + v,你可能也可以检测到它......只是禁用javascript也会明显破坏它。 Anyways, as any client-side validation, you have to double check on server-side. 无论如何,作为任何客户端验证,您必须在服务器端进行双重检查。

Here's what I came up with. 这就是我想出来的。 Fairly clean and seems to work for all the tests I can give it. 相当干净,似乎适用于我可以给它的所有测试。

JavaScript: JavaScript的:

$(function () {
    $('textarea').on('keypress', function (event) {
        var text = $('textarea').val();
        var lines = text.split("\n");
        var currentLine = this.value.substr(0, this.selectionStart).split("\n").length;
        console.log(lines);
        console.log(currentLine);
        console.log(lines[currentLine - 1]);
        if (event.keyCode == 13) {
            if (lines.length >= $(this).attr('rows')) return false;
        } else {
            if (lines[currentLine - 1].length >= $(this).attr('cols')) {
                return false; // prevent characters from appearing
            }
        }
    });
});

HTML: HTML:

<textarea rows="10" cols="15"></textarea>

DEMO DEMO

Instead of looping over each line get the current line number of your cursor and check only the character length of that line. 获取光标的当前行号并仅检查该行的字符长度,而不是遍历每一行。 See this SO answer for implementation details. 有关实施细节,请参阅此SO答案

Then change your else statement to look like this: 然后将您的else语句更改为如下所示:

else{
    var currLine = getLineNumber();
    if (lines[currLine].length >= $(this.attr('cols')) {
        return false; // prevent characters from appearing
    }
}

A little late, but i made this plugin https://github.com/luisdalmolin/jquery-limitLines . 有点晚了,但我制作了这个插件https://github.com/luisdalmolin/jquery-limitLines

Can be usefull sometimes. 有时可以有用。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM