2012-10-26 11 views
43

Rozumiem, że było dużo dyskusji na ten temat, ale jeszcze nie znalazłem rozwiązania, które pozwoliłoby mi rozwiązać moje potrzeby. Zasadniczo muszę autogowić obszar tekstowy, nie podczas pisania, ale przy obciążeniu. Pobieram zawartość z bazy danych i zależnie od ustawień użytkownika nakładka jest nakładana na obszar tekstowy, ale w tym przypadku obszary tekstowe nie są przewijane, dlatego muszę je zarchiwizować, aby wyświetlić cały tekst.Zmień rozmiar obszaru tekstowego tak, aby zmieścił się cały tekst w jquery załadunku

Próbowałem scrollHeight ale to nie działa wielkie, jak istnieje wiele pól tekstowych na ekranie

Dzięki

+0

Czy próbowałeś 'Wysokość: 100%'? – desbest

+0

@desbest tak to by nie działało, jak to jest zawarte w div – CR41G14

+0

i podejście lay-man może być zdefiniowanie algorytmu relacji między rozmiarem tekstu i wielkości obszaru tekstowego, zależnie od tego, możesz użyć $ ('# textAreaID '). attr (' size ', calculSize); , bardzo niedoręczone, ale możliwe rozwiązanie –

Odpowiedz

83

Spróbuj

$("textarea").height($("textarea")[0].scrollHeight); 

DEMO


UPDATE

Jak hack, aby pracować w starszych IE-y tylko dodać naprawdę krótkie opóźnienie przed wykonaniem go

window.setTimeout(function() { 
    $("textarea").height($("textarea")[0].scrollHeight); 
}, 1);​ 

DEMO

UPDATE dla wielu pola tekstowe

$("textarea").each(function(textarea) { 
    $this.height($this[0].scrollHeight); 
}); 
+0

To nie działa w IE8, gdy masz wiele obszarów tekstowych. Mam dużą stronę z dużym oparciem na js do sprawdzania poprawności. Czy jest coś w IE8, które może mieć na to wpływ? – CR41G14

+0

Ustawi to również wysokość wszystkich obszarów tekstowych na rozmiar pierwszego tekstu w tablicy elementów HTML zwróconych przez jQuery. – Bruno

+3

@bruno Oto przykład, co należy zrobić, aby rozwiązać ** prawdziwy ** problem. Jestem prawie pewien, że OP nie będzie miał problemu z dostosowaniem działającego przykładu do jego rzeczywistej sytuacji, która może obejmować jeden lub kilka tekstów - cała różnica będzie tylko prostym "każdym()" –

1

To jest obejście .. i może alternatywne rozwiązanie:

$('textarea').each(function(){ 
    var height = $('<div style="display:none; white-space:pre" id="my-hidden-div"></div>') 
       .html($(this).val()) 
       .appendTo('body') 
       .height();  
    $(this).css('height',height + 'px'); 
    $('#my-hidden-div').remove(); 

}); 

można zobaczyć demo tutaj http://jsfiddle.net/gZ2cC/

5

Wspomniałeś istnieje wiele pola tekstowe. Ten kod ustawi wysokość każdego tekstu zgodnie z jego własną zawartością.

$(document).ready(function() { 

    $("textarea").each(function(i, el) { 
     $(el).height(el.scrollHeight); 
    ​}); 

}); 

Fiddle here

+0

To nie działa w IE8, gdy masz wiele obszarów tekstowych. Mam dużą stronę z dużym oparciem na js do sprawdzania poprawności. Czy jest coś w IE8, które może mieć na to wpływ? – CR41G14

+3

Nie jestem pewien, dlaczego upadł. Kompatybilność IE8 nie została wymieniona w pytaniu. – Bruno

34

ten pracował dla mnie; przechodzi przez wszystkie elementy "textarea" na stronie Ready i ustawia ich wysokość.

$(function() { 
    $("textarea").each(function() { 
     this.style.height = (this.scrollHeight+10)+'px'; 
    }); 
}); 

Można również połączyć go z funkcją auto-poszerzyć, aby w pełni dynamiczny podczas pisania, a także:

function autoresize(textarea) { 
    textarea.style.height = '0px';  //Reset height, so that it not only grows but also shrinks 
    textarea.style.height = (textarea.scrollHeight+10) + 'px'; //Set new height 
} 

i nazwać z „keyup” imprezy lub poprzez jQuery:

$('.autosize').keyup(function() { 
    autoresize(this); 
}); 

Uwaga, w jaki sposób dodajemy 10 pikseli do wysokości przewijania: tutaj możesz ustawić ilość miejsca, w które chcesz dolewać obszar tekstowy, aby dać użytkownikowi.

Nadzieję, że pomaga komuś.:)

Edytuj: Zmieniono odpowiedź zgodnie z komentarzem @Mariannes.

+2

Wielkie dzięki, to działało dla mnie z niewielką modyfikacją. Ustawiłem 0px na 2em i nie jestem pewien, dlaczego masz "-10", zmieniłem na "+10", więc zawsze jest mała biała spacja i nie jest ciasno. – Marianne

+1

Najlepsza odpowiedź na dobrze zaokrąglone i uniwersalne rozwiązanie. Dostosuj -10 do wymaganego wypełnienia twoich tekstów. – Obsidian

10

możesz tego użyć. Mi to pasuje.

$('#content').on('change keyup keydown paste cut', 'textarea', function() { 
 
     $(this).height(0).height(this.scrollHeight); 
 
    }).find('textarea').change();
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script> 
 
<div id="content"> 
 
    <textarea>How about it</textarea><br /> 
 
    <textarea>111111 
 
222222 
 
333333 
 
444444 
 
555555 
 
666666</textarea> 
 
</div>

+0

Bardzo ładne i działa jak urok! – Gummibeer

+0

Nie tak dobrze, ponieważ gdy tekst jest zbyt wysoki (wyższy niż ekran) i naciskam dowolny klawisz na dole tekstu, ekran przewija się w górę. –

+0

@IvanZ Rozwiązuję problem przewijania strony. Proszę spróbować teraz. –

Powiązane problemy