Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   раскрыть textarea (https://javascript.ru/forum/misc/32266-raskryt-textarea.html)

bes 09.10.2012 17:14

раскрыть textarea
 
Как более эффективно раскрыть textarea на максимальную высоту и ширину его содержимого?

Моё замудрёное решение.
<style>
#test {
	resize: none;
	overflow: hidden;
	outline: none;
	border: none;
}
</style>

<textarea id="test" wrap="off" readonly="readonly">
<script>
	window.onload = function () {
		alert('hy');
	}
</script>
</textarea>

<script>
window.onload = function () {
	var ta = document.getElementById('test');
	var mas = ta.value.match(/(?=^).*(?=$)/gm);
	ta.rows = mas.length;
	 ta.cols = mas.map(function (el) {
			return el.length;
		}).sort(function (a, b) {
			return b - a;
		})[0] + 10; //поправка, так как часть текста оказывается закрытой
}
</script>


Попутные вопросы:
- можно ли в textarea настроить размер табуляции?
- есть ли css-аналоги wrap="off" и readonly="readonly"?

PS: предыстория задачи - писать код для вывода без замены <> на &lt;&gt;

ksa 09.10.2012 18:38

Цитата:

Сообщение от bes
Как более эффективно раскрыть textarea на максимальную высоту и ширину его содержимого?

До этого предлагался вариант с ДИВом в который пишется тот же контент... Размер дива "передавался" текстареа...

bes 09.10.2012 19:08

Цитата:

Сообщение от ksa
До этого предлагался вариант с ДИВом в который пишется тот же контент... Размер дива "передавался" текстареа...

можно поподробней об этом варианте (или ссылку)

<div id="div">
<script>
	alert('как быть');
	window.onload = function () {
		alert('hy');
	}
</script>
</div>
<textarea id="test" wrap="off" rdeadonly="readonly">
</textarea>

<script>
window.onload = function () {
	var ta = document.getElementById('test');
	var div = document.getElementById('div');
	ta.value = div.innerHTML;
}
</script>

nerv_ 09.10.2012 19:13

bes, http://learn.javascript.ru/metrics#javascript-метрики
Чуть ниже на странице: "Нажмите на кнопку, чтобы распахнуть элемент:"

ksa 09.10.2012 19:22

Цитата:

Сообщение от bes
можно поподробней об этом варианте

Идея там была такая...
- див располагают "под" текстареа
- все установки по отступам, полям и шрифтам у них одинаковы
- ввод в текстареа дублируют и в див, при этом считываются размеры дива и присваиваются текстареа

Т.о. их размеры будут кагбэ равны...

bes 09.10.2012 19:26

Цитата:

Сообщение от nerv_
bes, http://learn.javascript.ru/metrics#javascript-метрики
Чуть ниже на странице: "Нажмите на кнопку, чтобы распахнуть элемент:"

ха, спасибо, сразу не сообразил применить этот способ для textarea, хотя не раз уже применял для других элементов (видимо из-за мысли, что он не совсем обычный :D )

<style>
#test {
	resize: none;
	overflow: hidden;
	outline: none;
	border: none;
}
</style>

<textarea id="test" wrap="off" readonly="readonly">
<script>
	alert();
	window.onload = function () {
		alert('hy');
	}
</script>
</textarea>

<script>
window.onload = function () {
	var ta = document.getElementById('test');
	var div = document.getElementById('div');
	ta.style.height = ta.scrollHeight;
	ta.style.width = ta.scrollWidth;
}
</script>

bes 09.10.2012 19:34

Цитата:

Сообщение от ksa
Идея там была такая...
- див располагают "под" текстареа
- все установки по отступам, полям и шрифтам у них одинаковы
- ввод в текстареа дублируют и в див, при этом считываются размеры дива и присваиваются текстареа

Т.о. их размеры будут кагбэ равны...

не совсем понял, "под" - это между :) (тегами <textarea></textarea>)

но больше волнует то, что скрипт в диве ведь начинает исполняться

ksa 09.10.2012 19:40

Цитата:

Сообщение от bes
не совсем понял, "под" - это между (тегами <textarea></textarea>)

У них z-index разный, ну и позиционирование конечно...
Т.о. див находится именно "под" текстареа и его не видно.

bes 09.10.2012 20:06

Цитата:

Сообщение от ksa
У них z-index разный, ну и позиционирование конечно...
Т.о. див находится именно "под" текстареа и его не видно.

понял, о чём речь

через scrollHeight очевидно самый лучший вариант

Цитата:

Сообщение от bes
- можно ли в textarea настроить размер табуляции?
- есть ли css-аналоги wrap="off" и readonly="readonly"?

как насчёт этого? пока поиски приводят к выводу, что никак


PS: вообще так-то идея привлечения textarea была не в этой задаче, а в том, что htmtl-коде в тегах textarea пишем js-код в чистом виде (без ручных замен <> на &lt;&gt; )
далее программно делаем эти замены, переносим в html и делаем подсветку (textarea соответственно скрываем/удаляем)

Hoshinokoe 09.10.2012 20:32

bes,

Можно без замены <> на &lt;&gt; использовать стандартный метод
document.createTextNode(text)

который отобразит содержимое просто как текст.

http://learn.javascript.ru/task/crea...e-vs-innerhtml

bes 09.10.2012 20:41

круто :thanks:

bes 09.10.2012 21:26

<style>
textarea.code {
	display: block;
	color: maroon;
	font-weight: bold;
	resize: none;
	overflow: hidden;
	outline: none;
	border: none;
}
</style>

<textarea class="code">
<script>
(function () {
	var ta = document.querySelectorAll('textarea.code');
	var len = ta.length;
	var par, el, pre;
	for  (var i = 0; i < len; i++) {
		el = ta[i];
		el.wrap = "off";
		el.readonly = "readonly" ;
		el.style.height = ta[i].scrollHeight + 'px';
		el.style.width = ta[i].scrollWidth + 'px';
		par = el.parentNode;
		pre = document.createElement('pre');
		pre.appendChild(document.createTextNode(el.value));
		par.replaceChild(pre, el);
	}
})();
</script>
</textarea>

<script>
window.onload = function () {
	var ta = document.querySelectorAll('textarea.code');
	var len = ta.length;
	var par, el, pre;
	for  (var i = 0; i < len; i++) {
		el = ta[i];
		el.wrap = "off";
		el.readonly = "readonly" ;
		el.style.height = ta[i].scrollHeight + 'px';
		el.style.width = ta[i].scrollWidth + 'px';
		par = el.parentNode;
		pre = document.createElement('pre');
		pre.appendChild(document.createTextNode(el.value));
		setTimeout(function() {par.replaceChild(pre, el);}, 3000);
	}
}
</script>

bes 09.10.2012 23:29

Насчёт табов: по ходу только так
<textarea rows="6" cols="30">
<script>
	alert();
		alert();
</script>
</textarea>
<textarea class="code" rows="6" cols="30">
<script>
	alert();
		alert();
</script>
</textarea>

<script>
window.onload = function () {
	var ta = document.getElementsByClassName('code')[0];
	ta.value = ta.value.replace(/\t/g, '    ');
}
</script>


Часовой пояс GMT +3, время: 09:39.