Длина Max для HTML <текстовая область>

Хотя этот популярный ответ даст вам желаемый синтаксис индексации, он вдвойне неэффективен: большой и медленный как в пространстве, так и во времени.

Почему этот ответ большой и медленный

Предлагаемое решение состоит в создании динамического массива указателей, а затем инициализации каждого указателя на собственный независимый динамический массив. Преимущество этого подхода состоит в том, что он дает вам синтаксис индексации, к которому вы привыкли, поэтому, если вы хотите найти значение матрицы в позиции x, y, вы скажете:

int val = matrix[ x ][ y ];

работает, потому что матрица [x] возвращает указатель на массив, который затем индексируется с помощью [y]. Разрушение:

int* row = matrix[ x ];
int  val = row[ y ];

Удобно, да? Нам нравится наш синтаксис [x] [y].

Но решение имеет большой недостаток, который заключается в том, что он как жирный, так и медленный.

Почему?

Причина, по которой это как жир, так и медленный, на самом деле то же самое. Каждая «строка» в матрице представляет собой отдельно распределенный динамический массив. Создание распределения кучи является дорогостоящим как во времени, так и в пространстве. Распределитель занимает время, чтобы сделать выделение, иногда выполняя алгоритмы O (n), чтобы сделать это. И распределитель «прокладывает» каждый из ваших массивов строк с дополнительными байтами для бухгалтерии и выравнивания. Это дополнительное пространство стоит ... ну ... дополнительное пространство. Освобождение будет также взять дополнительное время, когда вы идете на освобождение матрицы, тщательно освобождая каждое выделение каждой строки. Получает меня в поту, просто думая об этом.

Есть еще одна причина, по которой это медленно. Эти отдельные распределения, как правило, живут в прерывистых частях памяти. Одна строка может быть по адресу 1000, другая по адресу 100 000 - вы получите эту идею. Это означает, что когда вы проходите матрицу, вы прыгаете через память, как дикий человек. Это, как правило, приводит к промахам в кеше, которые значительно замедляют время обработки.

Итак, если вы абсолютный должен иметь свой симпатичный синтаксис [x] [y], используйте это решение. Если вы хотите быстроту и малость (и если вам все равно, почему вы работаете на C ++?), Вам нужно другое решение.

Другое решение

Лучшее решение состоит в том, чтобы выделить всю вашу матрицу в виде единого динамического массива, а затем использовать (слегка) умную математическую индексацию для доступа к ячейкам. Матрица индексирования только немного умна; nah, это не умно: это очевидно.

class Matrix
{
    ...
    size_t index( int x, int y ) const { return x + m_width * y; }
};

Учитывая эту функцию index() (которую я представляю, является членом класса, потому что он должен знать m_width вашего матрица), вы можете получить доступ к ячейкам в матричном массиве. Матричный массив выделяется следующим образом:

array = new int[ width * height ];

Таким образом, эквивалент этого в медленном, жирном решении:

array[ x ][ y ]

... это в быстрой, малой Решение:

array[ index( x, y )]

Грустный, я знаю. Но вы привыкнете к этому. И ваш процессор поблагодарит вас.

16
задан Michał Perłakowski 31 March 2016 в 13:55
поделиться

1 ответ

Эти TEXTAREA тег не имеет MAXLENGTH, приписывают способ, которым INPUT тег делает, по крайней мере, не в большинстве стандартных браузеров. Очень простой и эффективный способ ограничить количество символов, которые могут быть , ввел в TEXTAREA, тег:

<textarea onKeyPress="return ( this.value.length < 50 );"></textarea>

Примечание: onKeyPress, собирается предотвратить любое нажатие кнопки, любая кнопка включая [1 120] клавиша Backspace.

Это работает, потому что булево выражение сравнивает длину поля, прежде чем новый символ будет добавлен к максимальной длине, которую Вы хотите (50 в этом примере, используйте свое собственное здесь), и возвращает true, если существует комната для еще одного, false если нет. Возвращение false от большинства событий отменяет действие по умолчанию. Таким образом, если текущая длина уже равняется 50 (или больше), обработчик возвращает false, KeyPress, действие отменяется, и символ не добавляется.

Одной ложкой дегтя в бочке меда является возможность вставки в TEXTAREA, который не заставляет KeyPress событие стрелять, обходя эту проверку. Internet Explorer 5 + содержит onPaste событие, обработчик которого может содержать проверку. Однако обратите внимание, что необходимо также принять во внимание, сколько символов ожидает в буфере обмена, чтобы знать, собирается ли общее количество взять Вас по пределу или нет. К счастью, IE также содержит объект буфера обмена от объекта окна. 1 Таким образом:

<textarea onKeyPress="return ( this.value.length < 50 );"
onPaste="return (( this.value.length +
window.clipboardData.getData('Text').length) < 50 );"></textarea>

Снова, onPaste событие и clipboardData объект IE 5 + только. Для решения перекрестного браузера необходимо будет просто использовать OnChange или OnBlur обработчик для проверки длины, и обработать его однако Вы хотите (усеките значение тихо, уведомьте пользователя, и т.д.). К сожалению, это не фиксирует ошибку, как это происходит, только когда пользователь пытается покинуть поле, который является не совсем как дружественный.

Источник

кроме того, существует иначе здесь, включая законченный сценарий, который Вы могли включать в свою страницу:

http://cf-bill.blogspot.com/2005/05/textarea-maxlength-revisited.html

20
ответ дан 30 November 2019 в 21:46
поделиться
Другие вопросы по тегам:

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