• 首页 首页 icon
  • 工具库 工具库 icon
    • IP查询 IP查询 icon
  • 内容库 内容库 icon
    • 快讯库 快讯库 icon
    • 精品库 精品库 icon
    • 问答库 问答库 icon
  • 更多 更多 icon
    • 服务条款 服务条款 icon

textarea js实现限制每行个数,限制行数,限制字节数

武飞扬头像
一笙箫
帮助1

标题在工作上需要用到一个自定义控件,多行文本框,需要限制文本框的行数,文字个数,以及字节数,这是用js实现的

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <script src="https://code.jquery.com/jquery-3.1.1.min.js"></script>
</head>
<style>
    #foo {
        width: 200px;
        height: 200px;
        resize: none;
    }
</style>

<body>
    <div>
        <textarea id="foo"></textarea>
    </div>

</body>

<script>
    $(document).ready(function () {


        var textArea = $('#foo');

        var maxLines = 5;

        var maxLineLength = 4;

        var maxByteLength = 1000;

        var MaxLineByteLength = 1000;

        var flag = true;

        var newstr;

        var ctrlv = false;


        textArea.on('keydown', function (e) {


            var text = textArea.val();

            var lines = text.split('\n');

            if (e.keyCode == 13) { //回车事件处理

                var caret = textArea.get(0).selectionStart; //获取当前光标位置

                var line = 0;

                var charCount = 0;


                if (getLen(textArea.val()) >= maxByteLength) {

                    return false;
                }
                if (lines.length < maxLines) { //现在页面的总行数小于设置的总行数,则回车键执行

                    return true;

                } else {

                    $.each(lines, function (i, e) {

                        charCount  = e.length;

                        if (caret <= charCount) {

                            line = i;

                            return false;

                        }

                        charCount  = 1;

                    });

                    if (line   1 < maxLines) { //现在光标位置所在的行数小于总行数

                        charCount  = lines[line].length; //当前行数的字符个数

                        if (caret <= charCount) { //光标位置小于字符个数

                            lines.splice(maxLines - 1, 1); //去掉最后一行

                            newstr = lines.join("\n");

                            newstr = newstr.slice(0, caret)   '\n'   newstr.slice(caret);

                            flag = false;

                            if (flag == false && e.keyCode == 13) {
                                textArea.val(newstr);
                            }
                            flag = true;

                            return false;
                        }


                    } else {

                        return lines.length < maxLines;
                    }
                }

            } else if (e.keyCode == 8 || (e.keyCode >= 37 && e.keyCode <= 40)) {


            } else if (e.ctrlKey && e.keyCode == 86) {

                // var caret = textArea.get(0).selectionStart; //获取当前光标位置
                // var line = 0;//当前行数
                // var charCount = 0;

                // $.each(lines, function (i, e) {

                //     charCount  = e.length;

                //     if (caret <= charCount) {

                //         line = i;

                //         return false;

                //     }

                //     charCount  = 1;

                // });

                // if (line == maxLines) {
                //     return false;
                // } else {
                    ctrlv = true;
                // }



            } else {

                var caret = textArea.get(0).selectionStart;

                var line = 0;

                var charCount = 0;

                $.each(lines, function (i, e) {

                    charCount  = e.length;

                    if (caret <= charCount) {
                        line = i;
                        return false;
                    }
                    charCount  = 1;

                });

                if (getLen(textArea.val()) >= maxByteLength) { //限制字节数

                    return false;

                }

                var theLine = lines[line];

                if (getLen(theLine) >= MaxLineByteLength) {

                    return false;
                }

                return theLine.length < maxLineLength;

            }
        });

        textArea.on('input', function (e) {
            var text = textArea.val();

            var lines = text.split('\n');



            if (flag == false && e.keyCode == 13) {
                textArea.val(newstr);
            } else if (ctrlv) {

                var zuo = "";
                var you = "";

                var caret = textArea.get(0).selectionStart;

                var line = 0;

                var charCount = 0;

                $.each(lines, function (i, e) {

                    charCount  = e.length;

                    if (caret <= charCount) {
                        line = i;
                        return false;
                    }
                    charCount  = 1;

                });



                var zhantie = lines[line].substring(0, maxLineLength);


                //将上面的字符便厉,然后后面加换行
                for (let index = 0; index < line; index  ) {
                    zuo  = lines[index]   '\n';

                }

                //将下面的字符遍历,最后一行不加换行,其余的也加换行
                for (let index = line   1; index < lines.length; index  ) {

                    if (index == lines.length - 1) {

                        you = '\n'   you   lines[index];

                    } else {

                        you = you   lines[index]   '\n';
                    }
                }


                var zong = zuo   zhantie    you;

                textArea.val(zong);

                ctrlv = false;

                if (getLen(textArea.val()) >= maxByteLength) { //限制字节数

                    return false;

                }

                var theLine = lines[line];

                if (getLen(theLine) >= MaxLineByteLength) {

                    return false;
                }

                return theLine.length < maxLineLength;




            } else if (flag == true && e.keyCode == 13) {
                var aa = textArea.val().split('\n');
                var bb = aa.join('\n');
                textArea.val(bb);

            }

            flag = true;

        });



        textArea.on('compositionend', function (e) {
            console.warn('中文输入确认后触发了');
            var textvalue = textArea.val();
            var lines = textArea.val().split('\n');
            var caret = textArea.get(0).selectionStart;
            var line = 0;
            var charCount = 0;

            var liuAttr = [];

            $.each(lines, function (i, e) {

                charCount  = e.length;

                if (caret <= charCount) { //光标位置小于字符个数

                    if (maxLineLength / 2 < MaxLineByteLength / 2) { //如果每行个数小于每行字节个数

                        lines[i] = lines[i].substring(0, maxLineLength);

                        var newstr = lines.join('\n');

                        textArea.val(newstr);

                        line = i;
                    } else {

                        //每行的数是否满足最大行字节数
                        if (getLen(lines[i]) > MaxLineByteLength) {
                            let len = 0;

                            const chinese = /[^\x00-\xff]/ig;

                            for (let l = 0; l < lines[i].length; l  ) {
                                if (lines[i].charAt(l).match(chinese)) {
                                    len  = 2;
                                } else {
                                    len  = 1;
                                }
                                if (len > MaxLineByteLength) {

                                    var a = lines[i].slice(0, l);
                                    liuAttr[i] = a;
                                    textArea.val(liuAttr.join('\n'));
                                    return;
                                }
                            }

                        }

                    }

                }
                liuAttr[i] = lines[i];
                textArea.val(liuAttr.join('\n'));
                charCount  = 1;



                if (getLen(textvalue) > maxByteLength) { //字节数大于总的字节数

                    let len = 0;

                    const chinese = /[^\x00-\xff]/ig;

                    for (let i = 0; i < textvalue.length; i  ) {
                        if (textvalue.charAt(i).match(chinese)) {
                            len  = 2;
                        } else {
                            len  = 1;
                        }
                        if (len > maxByteLength) {
                            return textArea.val(textvalue.slice(0, i));
                        }
                    }
                    return textArea.val(textvalue);

                }

            });
        })


        //获取字节
        function getLen(str) {
            const chinese = /[^\x00-\xff]/g;
            const lineBreak = /[\r\n]/g;
            let newVal = str.replace(chinese, "**");
            newVal = newVal.replace(lineBreak, "**")
            return newVal.length;
        }


    });
</script>

</html>
学新通

现在主要的部分写完了,之后还会在进行补充更新
添加了复制粘贴功能

这篇好文章是转载于:学新通技术网

  • 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
  • 本站站名: 学新通技术网
  • 本文地址: /boutique/detail/tanhghaeak
系列文章
更多 icon
同类精品
更多 icon
继续加载