【问题标题】:Count Textarea Lines计算 Textarea 行数
【发布时间】:2016-10-29 05:17:15
【问题描述】:

我有一个文本区域,允许用户输入 16 行。我已经为此目的构建了一个指令,如果用户点击回车,一切正常。

但我也想防止超过16行,即使用户没有按回车,而是输入了很长的文本,显示为多行(强制换行)。

这个问题的背景如下:我有一张明信片,用户应该可以在这张明信片上输入文字。明信片具有固定的宽度/高度。 textarea 应该代表明信片的固定宽度/高度,以便用户可以看到他们还剩下多少空间来填写明信片(不超过 16 行)。

用 JS 可以吗?

到目前为止我的代码:

HTML

<textarea placeholder="Enter text" rows="16" ng-trim="false" id="message-textarea" maxlines="16" maxlines-prevent-enter="true"></textarea>

JS 指令

app.directive('maxlines', function() {
  return {
    restrict: 'A',
    require: 'ngModel',
    link: function(scope, elem, attrs, ngModel) {
      var maxLines = 1;
      attrs.$observe('maxlines', function(val) {
        maxLines = parseInt(val);
      });
      ngModel.$validators.maxlines = function(modelValue, viewValue) {
        var numLines = (modelValue || '').split("\n").length;
        var diffLines = maxLines - numLines;
        scope.$emit('cliked-from-directive-maxlines', {diffLines});
        return numLines <= maxLines;
      };
      attrs.$observe('maxlinesPreventEnter', function(preventEnter) {
        // if attribute value starts with 'f', treat as false. Everything else is true
        preventEnter = (preventEnter || '').toLocaleLowerCase().indexOf('f') !== 0;
        if (preventEnter) {
          addKeypress();
        } else {
          removeKeypress();
        }
      });

      function addKeypress() {
        elem.on('keypress', function(event) {
          // test if adding a newline would cause the validator to fail
          if (event.keyCode == 13 && !ngModel.$validators.maxlines(ngModel.$modelValue + '\n', ngModel.$viewValue + '\n')) {
            event.preventDefault();
          }
        });
      }

      function removeKeypress() {
        elem.off('.maxlines');
      }

      scope.$on('$destroy', removeKeypress);
    }
  };
});

【问题讨论】:

标签: javascript jquery css angularjs ionic-framework


【解决方案1】:

AFAIk 没有办法读取或限制文本区域的行数。恕我直言,您最好的机会是使用 16 个单行输入,并在用户达到每行字符数限制时关注下一行。

【讨论】:

    【解决方案2】:

    试试这个

    function addKeypress() {
       var lines = 16;
       elem.on('keypress', function(e) {
            var newLines = elem.val().split("\n").length;
            if(e.keyCode == 13 && newLines >= lines) {
                return false;
            }
        });
      });
    }
    

    【讨论】:

      【解决方案3】:

      也许你可以做类似this:

      JavaScript

      $(".limit").on("input", function(evt) {
        var $limit = $(this);
        var limit = this;
        if($limit.innerHeight() !== limit.scrollHeight) {
          $limit.val($limit.data("before"));
          evt.preventDefault();
          return false;
        } else {
          $limit.data("before", $limit.val());
        }
      }).each(function(index, el) {
        $(el).data("before", $(el).val());
      });
      

      HTML

      <textarea class="limit" rows="10"></textarea>
      

      CSS

      .limit {
        max-width: 300px;
        min-width: 300px;
        resize: none;
        overflow: hidden;
      }
      

      【讨论】:

      • 谢谢,这很好用。问题:当我输入一些文本到限制(直到最后一行和最后一个字符),并在重新输入 textarea-view 后,当我在最后一行输入一个字母时,所有内容都会被删除(它只发生在最后一行)。你知道为什么吗?
      • 重新进入是指在浏览器历史中来回切换。
      • @JohnBrunner 是的,这是因为 $limit.data("before"); 没有设置。您可以在页面加载时设置它以将其初始化为一个值。 (致$limit.data("before", $limit.val());)。查看更新的答案。
      猜你喜欢
      • 1970-01-01
      • 2015-07-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-28
      • 1970-01-01
      相关资源
      最近更新 更多