jQuery-скрипт для авторастяжки текстового поля textarea

Однажды я уже писал о таком скрипте, но он оказался не совершенен, и в результате я им так и не стал пользоваться. Однако задача найти подходящий скрипт для авторастяжки этого поля все-таки стояла передо мной.

И я нашел красивое решение, в виде jQuery-скрипта под названием jGrow. Проверял его в разных браузерах, в целом все нормально, заметил только один недочет – в Опере появляется горизонтальная прокрутка.

Размер самого скрипта совсем небольшой, выглядит вот так:

var $j = jQuery.noConflict();
$j.fn.jGrow = function(options) {
	var opts = $j.extend({}, $j.fn.jGrow.defaults, options);
	return this.each(function() {
		$j(this).css({ overflow: "hidden" }).bind("keypress", function() {
			$this = $j(this);
			var o = $j.meta ? $j.extend({}, opts, $this.data()) : opts;
			if(o.rows == 0 && (this.scrollHeight > this.clientHeight)) {
				this.rows += 1;
			} else if((this.rows <= o.rows) && (this.scrollHeight > this.clientHeight)) {
				this.rows += 1;
			} else if(o.rows != 0 && this.rows > o.rows) {
				$this.css({ overflow: "auto" });
			}
			$this.html();
		});
	});
}
$j.fn.jGrow.defaults = { rows: 0 };
$j(document).ready(function() { $j("#comment").jGrow({ rows: 25 }); })

Здесь нам интересна в плане настроек лишь последняя строка, а, вернее, вот эта ее часть:

$j("#comment").jGrow({ rows: 25 });

#comment – это идентификатор поля textarea, к которому хотим прицепить скрипт.
rows: 25 – максимальное количество строк, до которых будет происходить авторастяжка. Если содержимое поля станет больше этого количества строк, то появляется прокрутка.

Если сделать вот так:

$j("#comment").jGrow();

то снимается ограничение на максимальную высоту textarea, т.е., в зависимости от количества текста, это поле может растягиваться бесконечно.

Прошу заметить следующий момент. Cрипт не работает, если тегу <textarea> задана высота через CSS, поэтому взамен нужно воспользоваться параметром rows:

<textarea name="comment" id="comment" cols="70" rows="8"></textarea>

Протестировать работу скрипта авторастяжки можно прямо на моем блоге.

Надеюсь, кому-то пригодится.

Комментарии (23)

  1. 17 ноября 2008 г. в 18:44

    Я не очень понял… а что нельзя обнулить заданное через CSS свойство height? Дома попробую…

  2. 17 ноября 2008 г. в 19:23

    Надеюсь, кому-то пригодится.

    Пригодится пригодится и еще как :)
    Спасибо.

  3. 17 ноября 2008 г. в 19:29

    Спасибо, поставил у себя, тоже искал. Находил для друпала какой-то скрипт с рястягиваемой мышкой границей но вытаскивать лень было, ждал покуда что для jquery попроще будет.

    На родительские элементы тоже высоту видимо ставить нельзя, у меня плавать начинал поверх

  4. 17 ноября 2008 г. в 19:45

    Steward, что имеешь в виду под словом “обнулить”?

    Sonikelf, пожалуйста ;)

    2Артём Курапов:

    На родительские элементы тоже высоту видимо ставить нельзя, у меня плавать начинал поверх

    Да, действительно, родительский блок должен быть “резиновым”.

  5. 18 ноября 2008 г. в 15:33

    Во FF3 если писать много текста в одну строку, то его не переносит… а просто обрезает :( и скролбар горизонтальный не появляется.

  6. 18 ноября 2008 г. в 15:35

    А меня прёт реализация в Safari. надо много текста взял мышкой и растянул текстареа.

  7. 18 ноября 2008 г. в 16:17

    Во FF3 если писать много текста в одну строку, то его не переносит… а просто обрезает :( и скролбар горизонтальный не появляется.

    Не наблюдаю ни того, ни другого.

    А меня прёт реализация в Safari. надо много текста взял мышкой и растянул текстареа.

    Согласен, очень удобная вещь. Разработчикам остальных браузеров нужно брать в пример данную фичу.

  8. Разработчик всякой хрени
    18 ноября 2008 г. в 21:55

    Не совсем понятно нафига это нужно. Во первых как уже говорилось можно через CSS, если уж так хочется. Да, еще момент. Если это присутствует на данном блоге, то в шестом ишаке какие то пятнашки получаются. Я пока набирал все дважы слева на право скакнуло.

    Хотя чисто с точки зрения разработчика достаточно интересно.

  9. 19 ноября 2008 г. в 12:57

    Во первых как уже говорилось можно через CSS

    Во-первых, где такое говорилось? Во-вторых, сначала разберитесь в сути вопроса, прежде чем это писать.

    Если это присутствует на данном блоге, то в шестом ишаке какие то пятнашки получаются. Я пока набирал все дважы слева на право скакнуло.

    К скрипту это отношения не имеет. Пользуйтесь современным браузером.

  10. Сергей
    19 ноября 2008 г. в 22:30

    Если скопипастить текст в textarea, то размер не меняется, пока кнопками курсора до конца текста не добежишь :-) FF3

  11. 20 ноября 2008 г. в 13:11

    Сергей, да, есть такое. Но применительно к комментариями это не существенно – комментатор же, как правило, постепенно пишет весь текст, а не копирует его откуда-то. Да и в других случаях использования textarea это в основном происходит так же.

    1. Касперский
      20 августа 2011 г. в 22:16 / ответ на коммент Dimox

      Скрипт говно! Автор во-первых не умеет писать плагины jqueryь а во вторых как уже было сказано не отслеживает достаточно событий. Я копирую комментарии в больших объемах.

  12. 22 ноября 2008 г. в 04:03

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

  13. 22 ноября 2008 г. в 14:28

    Евгений, спасибо. Рад, что тебе нравится ;)

  14. Равиль
    31 мая 2009 г. в 02:19

    Я новичок. Недавно устновил себе wp. Что значит авто растягивание текстового поля? Какое именно поле будет растягиваться?

    1. Поле, в котором вы пишите текст комментария.

  15. Равиль
    31 мая 2009 г. в 10:11

    Ясно, Спасибо

  16. xxx
    8 января 2010 г. в 21:17

    в ie 7 вобще не работает

  17. Master
    22 мая 2010 г. в 18:31

    Здравствуйте, Дмитрий.
    Возможно мой вопрос будет не совсем по теме, но меня заинтересовал Ваш вариант растяжки “правила комментирования”.
    Если Вам не трудно, подскажите, как реализовать эту функцию ?

    1. 23 мая 2010 г. в 07:50 / ответ на коммент Master

      Вот здесь описывал.

      1. Master
        23 мая 2010 г. в 15:10 / ответ на коммент Dimox

        Спасибо большое, Дмитрий! Простите за беспокойство – не нашел в первый раз этот пост.
        Очень полезная и нужная функция… для тех, кто понимает!
        Удачи Вам в творчестве и новых интересных публикаций для нас!

  18. Владимир
    30 сентября 2010 г. в 21:25

    А зачем там функция noConflict() ?

    1. 1 октября 2010 г. в 17:19 / ответ на коммент Владимир

      Для предотвращения конфликтов с другими JS-фреймворками.

Ваш комментарий

Жирный текст

Ссылка

Цитата

Внутристрочный код

CSS-код

HTML-код

JavaScript-код

PHP-код