В настоящее время я работаю над приложением внутренних продаж для компании, в которой работаю, и у меня есть форма, которая позволяет пользователю изменять адрес доставки.
Теперь я думаю, что было бы намного лучше, если бы текстовое поле, которое я использую для основных деталей адреса, просто занимало бы область текста в нем и автоматически изменяло бы размер, если текст был изменен.
Вот его скриншот.
Любые идеи?
@Крис
Хороший момент, но есть причины, по которым я хочу изменить его размер. Я хочу, чтобы область, которую он занимает, была областью содержащейся в нем информации. Как вы можете видеть на снимке экрана, если у меня есть фиксированное текстовое поле, оно занимает изрядное количество вертикального пространства.
Я могу уменьшить шрифт, но мне нужно, чтобы адрес был большим и читабельным. Теперь я могу уменьшить размер текстовой области, но тогда у меня возникают проблемы с людьми, у которых адресная строка занимает 3 или 4 (одна занимает 5) строк. Главное, чтобы пользователь использовал полосу прокрутки.
Думаю, мне следует быть более конкретным. Я хочу изменить размер по вертикали, и ширина не имеет большого значения. Единственная проблема, которая возникает с этим, - это то, что номер ISO (большая «1») вставляется под адресом, когда ширина окна слишком мала (как вы можете видеть на скриншоте).
Дело не в уловке; речь идет о текстовом поле, которое пользователь может редактировать, которое не будет занимать лишнее пространство, но будет отображать весь текст в нем.
Хотя, если кто-то предложит другой способ подойти к проблеме, я тоже открыт для этого.
Я немного изменил код, потому что он вел себя немного странно. Я изменил его на активацию при нажатии клавиши, потому что он не будет учитывать только что набранный символ.
resizeIt = function() {
var str = $('iso_address').value;
var cols = $('iso_address').cols;
var linecount = 0;
$A(str.split("\n")).each(function(l) {
linecount += 1 + Math.floor(l.length / cols); // Take into account long lines
})
$('iso_address').rows = linecount;
};
Ответы:
Facebook делает это, когда вы пишете на стенах людей, но меняет размер только по вертикали.
Горизонтальное изменение размера кажется мне беспорядком из-за переноса слов, длинных строк и так далее, но вертикальное изменение размера кажется довольно безопасным и приятным.
Никто из знакомых мне новичков, использующих Facebook, никогда не упоминал об этом и не был запутан. Я бы использовал это как анекдотическое свидетельство, чтобы сказать «давай, реализуй это».
Некоторый код JavaScript для этого с использованием Prototype (потому что это то, с чем я знаком):
PS: Очевидно, этот код JavaScript очень наивен и плохо протестирован, и вы, вероятно, не захотите использовать его в текстовых полях с романами в них, но вы понимаете общую идею.
источник
<textarea cols='5'>0 12345 12345 0</textarea>
. (Я написал почти идентичную реализацию и заметил это только через месяц использования.) Она также не работает с пустыми строками.Одно из усовершенствований некоторых из этих ответов - позволить CSS выполнять большую часть работы.
Базовый маршрут выглядит так:
textarea
и скрытыйdiv
textarea
синхронизируйте содержимоеdiv
сdiv
, мы избегаем явной установкиtextarea
высоты.источник
var text = $("#textArea").val().replace(/\n/g, '<br/>') + ' ';
гарантирует, что вы не получите рывков при переходе от пустой новой строки в конце текстового поля к непустой, так как скрытый div гарантирует перенос на nbsp.Вот еще один метод автоматического изменения размера текстового поля.
Код: (простой ванильный JavaScript)
Демо: (использует jQuery, цели в текстовой области, которую я сейчас набираю - если у вас установлен Firebug , вставьте оба образца в консоль и протестируйте на этой странице)
источник
clientHeight
иscrollHeight
не равен, поэтому вы не можете использовать этот метод, если хотите, чтобы текстовое поле уменьшалось, а также увеличивалось.if (text.clientHeight == text.scrollHeight) text.style.height = "20px";
Наверное, самое короткое решение:
Таким образом, вам не нужны скрытые div или что-то в этом роде.
Примечание: вам, возможно, придется поиграть в
this.style.height = (this.scrollHeight) + "px";
зависимости от того, как вы стилизуете текстовое поле (высота строки, отступы и тому подобное).источник
keyup
может быть достаточно, но я не уверен. Я был так счастлив, что понял это, что перестал пробовать что-либо еще.Вот прототипная версия изменения размера текстовой области, которая не зависит от количества столбцов в текстовой области. Это превосходный метод, поскольку он позволяет вам управлять текстовой областью с помощью CSS, а также иметь текстовую область переменной ширины. Кроме того, в этой версии отображается количество оставшихся символов. Хотя это и не запрашивается, это довольно полезная функция, и ее легко удалить, если она не нужна.
Создайте виджет, позвонив
new Widget.Textarea('element_id')
. Параметры по умолчанию можно переопределить, передав их как объект, напримерnew Widget.Textarea('element_id', { max_length: 600, min_height: 50})
. Если вы хотите создать его для всех текстовых полей на странице, сделайте что-нибудь вроде:источник
Вот решение с
JQuery
:abc
это аteaxtarea
.источник
Проверьте ссылку ниже: http://james.padolsey.com/javascript/jquery-plugin-autoresize/
источник
Просто вернувшись к этому, я сделал его немного аккуратнее (хотя кто-то, кто уже знаком с Prototype / JavaScript, может предложить улучшения?).
Просто позвоните с помощью:
источник
Я кое-что сделал довольно легко. Сначала я поместил TextArea в DIV. Во-вторых, я вызвал
ready
функцию этого скрипта.Просто. Это максимальная высота блока div после его визуализации, деленная на высоту одного TextArea одной строки.
источник
Мне эта функция нужна была для себя, но ни одна из них не работала так, как мне было нужно.
Поэтому я использовал код Ориона и изменил его.
Я добавил минимальную высоту, чтобы при разрушении она не стала слишком маленькой.
источник
Как и ответ @memical.
Однако я обнаружил некоторые улучшения. Вы можете использовать
height()
функцию jQuery . Но помните о пикселях padding-top и padding-bottom. В противном случае ваше текстовое поле будет расти слишком быстро.источник
Мое решение, не использующее jQuery (потому что иногда они не обязательно должны быть одинаковыми), приведено ниже. Хотя он был протестирован только в Internet Explorer 7 , поэтому сообщество может указать на все причины, по которым это неверно:
Пока мне очень нравится, как это работает, и меня не интересуют другие браузеры, поэтому я, вероятно, применим его ко всем своим текстовым областям:
источник
Вот расширение виджета Prototype, которое Джереми опубликовал 4 июня:
Он не позволяет пользователю вводить больше символов, если вы используете ограничения в текстовых полях. Он проверяет, остались ли символы. Если пользователь копирует текст в текстовое поле, текст обрезается по максимуму. длина:
источник
У @memical было отличное решение для установки высоты текстового поля при загрузке страницы с помощью jQuery, но для моего приложения я хотел иметь возможность увеличивать высоту текстового поля по мере добавления пользователем большего количества контента. Я построил решение memical следующим образом:
Это не очень гладко, но это также не клиентское приложение, поэтому плавность на самом деле не имеет значения. (Если бы это было для клиента, я бы, вероятно, просто использовал плагин jQuery для автоматического изменения размера.)
источник
Для тех, кто пишет код для IE и сталкивается с этой проблемой. В IE есть небольшая хитрость, которая делает его на 100% CSS.
Вы даже можете указать значение для rows = "n", которое IE проигнорирует, но другие браузеры будут использовать. Я действительно ненавижу кодирование, реализующее взломы IE, но этот очень полезен. Возможно, это работает только в режиме Quirks.
источник
Пользователи Internet Explorer, Safari, Chrome и Opera должны не забыть явно установить значение высоты строки в CSS. Я делаю таблицу стилей, которая устанавливает начальные свойства для всех текстовых полей следующим образом.
источник
Вот функция, которую я только что написал в jQuery, чтобы сделать это - вы можете перенести ее в Prototype , но они не поддерживают «живучесть» jQuery, поэтому элементы, добавленные запросами Ajax, не будут отвечать.
Эта версия не только расширяется, но и сжимается при нажатии клавиши удаления или возврата.
Эта версия основана на jQuery 1.4.2.
Наслаждаться ;)
http://pastebin.com/SUKeBtnx
Использование:
или (например, любой селектор jQuery)
Он был протестирован в Internet Explorer 7 / Internet Explorer 8 , Firefox 3.5 и Chrome. Все нормально работает.
источник
Используя ASP.NET, просто сделайте следующее:
источник