javascript - 限制文本区域中的行数

标签 javascript jquery textarea

我正在寻找可以限制用户能够在 textarea 中输入的行数的 javascript(按行我的意思是用户按键盘上的 enter 键结束的一些文本)。我找到了一些解决方案,但它们根本不起作用或表现得很奇怪。 最好的解决方案是可以完成这项工作的 jquery 插件 - 类似于 CharLimit , 但它应该能够限制文本行数而不是字符数。

最佳答案

可能有帮助(可能最好使用 jQuery、onDomReady 和不显眼地将 keydown 事件添加到文本区域)但在 IE7 和 FF3 中测试:

<html>
  <head><title>Test</title></head>
  <body>
    <script type="text/javascript">
      var keynum, lines = 1;

      function limitLines(obj, e) {
        // IE
        if(window.event) {
          keynum = e.keyCode;
        // Netscape/Firefox/Opera
        } else if(e.which) {
          keynum = e.which;
        }

        if(keynum == 13) {
          if(lines == obj.rows) {
            return false;
          }else{
            lines++;
          }
        }
      }
      </script>
    <textarea rows="4" onkeydown="return limitLines(this, event)"></textarea>
  </body>
</html>

*编辑 - 解释:如果按下 ENTER 键,它会捕获按键,如果文本区域中的行与文本区域的行数相同,则不会添加新行。否则它会增加行数。

编辑#2:考虑到人们仍然在回答这个问题,我想我会更新它以尽可能地处理粘贴、删除和剪切。

<html>

<head>
    <title>Test</title>
    <style>
        .limit-me {
            height: 500px;
            width: 500px;
        }
    </style>
</head>

<body>
<textarea rows="4" class="limit-me"></textarea>

<script>
    var lines = 1;

    function getKeyNum(e) {
        var keynum;
        // IE
        if (window.event) {
            keynum = e.keyCode;
            // Netscape/Firefox/Opera
        } else if (e.which) {
            keynum = e.which;
        }

        return keynum;
    }

    var limitLines = function (e) {
        var keynum = getKeyNum(e);

        if (keynum === 13) {
            if (lines >= this.rows) {
                e.stopPropagation();
                e.preventDefault();
            } else {
                lines++;
            }
        }
    };

    var setNumberOfLines = function (e) {
        lines = getNumberOfLines(this.value);
    };

    var limitPaste = function (e) {
        var clipboardData, pastedData;

        // Stop data actually being pasted into div
        e.stopPropagation();
        e.preventDefault();

        // Get pasted data via clipboard API
        clipboardData = e.clipboardData || window.clipboardData;
        pastedData = clipboardData.getData('Text');

        var pastedLines = getNumberOfLines(pastedData);

        // Do whatever with pasteddata
        if (pastedLines <= this.rows) {
            lines = pastedLines;
            this.value = pastedData;
        }
        else if (pastedLines > this.rows) {
            // alert("Too many lines pasted ");
            this.value = pastedData
                .split(/\r\n|\r|\n/)
                .slice(0, this.rows)
                .join("\n ");
        }
    };

    function getNumberOfLines(str) {
        if (str) {
            return str.split(/\r\n|\r|\n/).length;
        }

        return 1;
    }

    var limitedElements = document.getElementsByClassName('limit-me');

    Array.from(limitedElements).forEach(function (element) {
        element.addEventListener('keydown', limitLines);
        element.addEventListener('keyup', setNumberOfLines);
        element.addEventListener('cut', setNumberOfLines);
        element.addEventListener('paste', limitPaste);
    });
</script>
</body>
</html>

关于javascript - 限制文本区域中的行数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/556767/

相关文章:

javascript - 如何将模型对象数组转换为以模型 ID 作为键的对象?

javascript - 如果我有线性渐变,则更改滚动上的颜色背景

javascript - 使用正则表达式获取标签中的第一个单词

javascript - Display CSS 属性设置为 none 后视频自动播放

javascript - 禁用 HTML 之外的 iframe 上的导航

jquery - 如何使用 JQuery 在 TextArea 中对通配符应用写保护?

c++ - 在 C++ 中创建编辑框的最简单方法是什么

javascript - 如何实现所需的视频背景

javascript - 从 C# Web 应用程序背后的代码调用 javascript 函数

c# - 无法弄清楚这个 jQuery 代码是如何工作的