Reigel tarafından sağlanan cevaptaki birkaç hatayı düzelttim (kabul edilen cevap):
- Şimdi html varlıklarının değiştirilme sırası, gölge öğesinde beklenmeyen koda neden olmaz. (Orijinal, ">" ile "& ampgt;" değiştirildi ve bazı nadir durumlarda yanlış yükseklik hesaplamasına neden oldu).
- Metin bir satırsonu ile bitiyorsa, orijinalde olduğu gibi, gölge artık sabit bir yüksekliğe sahip olmak yerine fazladan bir "#" karakteri alır.
- İlklendirmeden sonra metin alanının yeniden boyutlandırılması gölgenin genişliğini günceller.
- kelime kaydırma eklendi: gölge için ara kelime, böylece bir metin alanıyla aynı şeyi bozar (çok uzun kelimeler için araları zorlar)
Alanlarla ilgili kalan bazı sorunlar var. Çift boşluklar için bir çözüm görmüyorum, gölgede tek boşluklar olarak görüntüleniyorlar (html oluşturma). Boşlukların kırılması gerektiğinden, bu & nbsp; kullanılarak ekilemez. Ayrıca, metin alanı bir boşluktan sonra bir satırı keser, bu boşluk için yer yoksa, satırı daha önceki bir noktada keser. Önerilere açığız.
Düzeltilmiş kod:
(function ($) {
$.fn.autogrow = function (options) {
var $this, minHeight, lineHeight, shadow, update;
this.filter('textarea').each(function () {
$this = $(this);
minHeight = $this.height();
lineHeight = $this.css('lineHeight');
$this.css('overflow','hidden');
shadow = $('<div></div>').css({
position: 'absolute',
'word-wrap': 'break-word',
top: -10000,
left: -10000,
width: $this.width(),
fontSize: $this.css('fontSize'),
fontFamily: $this.css('fontFamily'),
lineHeight: $this.css('lineHeight'),
resize: 'none'
}).appendTo(document.body);
update = function () {
shadow.css('width', $(this).width());
var val = this.value.replace(/&/g, '&')
.replace(/</g, '<')
.replace(/>/g, '>')
.replace(/\n/g, '<br/>')
.replace(/\s/g,' ');
if (val.indexOf('<br/>', val.length - 5) !== -1) { val += '#'; }
shadow.html(val);
$(this).css('height', Math.max(shadow.height(), minHeight));
};
$this.change(update).keyup(update).keydown(update);
update.apply(this);
});
return this;
};
}(jQuery));