Фокусы с Textarea
Чем textarea больше - тем туда удобнее вводить текст. Всё видно, ничего не надо скроллить. Только вот не всегда это красиво показывать на странице такие огромные текстовые поля. Более элегантный способ - это показать небольшую textarea, и если текст в неё не влезает - увеличить её размер динамически. Так мы и сделали на Qype.co.uk
Для работы скрипта нужны Prototype и Script.aculo.us.
JavaScript:
-
Qype.ResizableTextArea = Class.create({
-
-
min_height: 7,
-
margin: 1.2,
-
unit: "em",
-
-
initialize: function(field) {
-
this.element = $(field);
-
this.element.setStyle({
-
height: this.min_height + this.unit,
-
overflow: "hidden"
-
});
-
this._resize();
-
this.element.observe('keyup', this._resize.bind(this));
-
},
-
-
_resize: function() {
-
this.rows = this._calcRows();
-
this.height = (this.rows*this.margin) + this.margin;
-
if (this.height <this.min_height) this.height = this.min_height;
-
this.element.morph({height: (this.height + this.unit)}, {duration: .2});
-
},
-
-
_calcRows: function() {
-
this.cols = this.element.getWidth() / 8;
-
this.rows = Math.floor(this.element.value.length / this.cols) + this.element.value.split("\n").length;
-
return this.rows
-
}
-
-
});
Теперь в HEAD достаточно написать:
HTML:
-
<script type="text/javascript">
-
document.observe('dom:loaded', function()
-
{
-
$$('textarea').each(function(el) {
-
new Qype.ResizableTextArea(el);
-
});
-
});
-
</script>
и все textarea на сайте станут менять свой размер динамически.
Посмотреть на скрипт в действии можно тут. Снизу есть форма Add Review и в ней textarea.
del.icio.us Забобрить!15 Comments so far
Leave a reply
Очень интересно и полезно. ИМХО, надо ввести это повсеместно. Правда скрипт в хедере мне не нравится.
отлично! недавно видел это на jQuery, а вот теперь и на любимом прототайпе появилось
Пробовал использовать, но почемуто ни в какую textarea не хочет изменяться
Тормозит при быстром наборе, как собственно и все аналогичные скрипты (правда всего один на самом деле), которые я до этого видел
Я думаю если пересчитывать размер поля не при каждом нажатии клавиатуры, как сейчас, то будет работать быстрее.
имхо супер, с удовольствием использую в новом движке своего сайта =). Замечу что это не первый финт который понравился, и очень нужен для развития ( веб лего )
Написал все как у Вас,
рядом с этим htm файлом лежат js библиотеки,
но размер окна ввода динамически не меняется.
Подскажите, что я делаю на так.
ResizableTextArea
Qype.ResizableTextArea = Class.create({
min_height: 7,
margin: 1.2,
unit: “em”,
initialize: function(field) {
this.element = $(field);
this.element.setStyle({
height: this.min_height + this.unit,
overflow: “hidden”
});
this._resize();
this.element.observe(’keyup’, this._resize.bind(this));
},
_resize: function() {
this.rows = this._calcRows();
this.height = (this.rows*this.margin) + this.margin;
if (this.height <this.min_height) this.height = this.min_height;
this.element.morph({height: (this.height + this.unit)}, {duration: .2});
},
_calcRows: function() {
this.cols = this.element.getWidth() / 8;
this.rows = Math.floor(this.element.value.length / this.cols) + this.element.value.split(”\n”).length;
return this.rows
}
});
document.observe(’dom:loaded’, function()
{
$$(’textarea’).each(function(el) {
new Qype.ResizableTextArea(el);
});
});
сорри, обрезало текст, все не поместилось(
вот здесь разместил:
http://www.adm-world.jino-net.ru/textarea/dynamic_txt.htm
dimon: Если ты внимательно почитаешь ошибки на своей странице то увидишь вот такую:
Qype is not defined
перед этой строкой
Qype.ResizableTextArea = Class.create({
напиши
var Qype = {};
и всё заработает. Рекомендую выбрать другое имя для своего именного пространства. Мы выбрали Qype, потому что так называется наш сайт.
ура!!!
Большое спасибо, Александр!!! Все заработало!
Ты супер!!! Теперь буду разбираться, КАК все это работает)
хм, получился странный глюк, новые строки добавляются нормально, но если строка слишком длинная, то
не появляется полоса прокрутки (
dimon: действительно
попробуй заменить
overflow: “hidden”
на
‘overflow-y’: “hidden”
Кавычки исправь только. Wordpress их поганит.
спасибо за советы)