Ограничение количества строк в текстовой области

Во-первых, вы пропустили часть данных при записи файла. После ширины и высоты вам нужно добавить максимальное значение, которое может принять канал. Таким образом, ваш файл должен выглядеть примерно так:

P2
300 200
255
<...image data...>

Далее вы передаете ширину и высоту прямоугольника в drawRect, но он обрабатывает их так, как если бы они были справа и снизу от прямоугольника. , Когда вы передаете 25 и 50 для высоты и ширины, левый и верхний уже больше, чем, поэтому внешний цикл даже не выполняется ни разу. Вам нужно сделать свой цикл в drawRect следующим образом:

for (int rectRow = rectTop; rectRow < rectTop + rectHeight; rectRow++)
{
    for (int rectCol = rectLeft; rectCol < rectLeft + rectWidth; rectCol++)
        image[rectRow][rectCol] = { grayLevel };
}
34
задан A-Sharabiani 5 November 2018 в 06:52
поделиться

3 ответа

Это могло бы справка (вероятно, лучше всего использовать 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>

*Edit - объяснение: Это ловит нажатие клавиши, если клавиша 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>
23
ответ дан marktucks 27 November 2019 в 16:56
поделиться

Количество видимых / строк дисплея для данного блока текста менялось бы в зависимости от различных браузеров, используемые шрифты, и т.д. Необходимо было бы установить определенный шрифт и размер шрифта, как минимум, чтобы смочь полунадежно считать строки дисплея.

ОБНОВЛЕНИЕ: Я вижу редактирование. Затем что-то как код kevchadders должно сделать прекрасный для Вас. Вам будет нужен js, который считает символы и '\r\n и проверки по сравнению с пользовательским пределом. Кроме того, если Вы не используете его сценарий, удостоверьтесь, что Вы используете тот, который вовлекает любого проверка временного интервала и/или onKeyDown/onKeyUp события текстовой области. Это может быть то, почему некоторые сценарии, которые Вы протестировали, кажется, "ведут себя странно".

3
ответ дан alphadogg 27 November 2019 в 16:56
поделиться

Это - в основном то же как ответ Ivan, с помощью jQuery. Я протестировал его на мой собственный проект; кажется, хорошо работает.

<script type="text/javascript" charset="utf-8">
  $(function() 
  {
    function getLines(id)
    {
      return $('#' + id).val().split("\n").length
    }

  $('#testing').keyup(function() 
  {
    var allowedNumberOfLines = 4;

    if(getLines('testing') > allowedNumberOfLines)
    {
      modifiedText = $(this).val().split("\n").slice(0, allowedNumberOfLines);
      $(this).val(modifiedText.join("\n"));
    }
  });
});
</script>
1
ответ дан 27 November 2019 в 16:56
поделиться
Другие вопросы по тегам:

Похожие вопросы: