Ich habe einige Fehler in der Antwort von Reigel behoben (die akzeptierte Antwort):
- Die Reihenfolge, in der HTML-Entitäten jetzt ersetzt werden, verursacht keinen unerwarteten Code im Schattenelement. (Das Original wurde durch ">" durch "& ampgt;" ersetzt, was in einigen seltenen Fällen zu einer falschen Berechnung der Höhe führte.)
- Wenn der Text mit einer neuen Zeile endet, erhält der Schatten jetzt ein zusätzliches Zeichen "#", anstatt wie im Original eine feste zusätzliche Höhe zu haben.
- Durch Ändern der Größe des Textbereichs nach der Initialisierung wird die Breite des Schattens aktualisiert.
- Zeilenumbruch hinzugefügt: Unterbrechungswort für Schatten, daher wird es genauso gebrochen wie ein Textbereich (Erzwingen von Unterbrechungen für sehr lange Wörter)
Es gibt einige verbleibende Probleme in Bezug auf Räume. Ich sehe keine Lösung für doppelte Leerzeichen, sie werden als einzelne Leerzeichen im Schatten angezeigt (HTML-Rendering). Dies kann nicht mit & nbsp; behoben werden, da die Leerzeichen unterbrochen werden sollten. Außerdem bricht der Textbereich eine Linie nach einem Leerzeichen. Wenn für dieses Leerzeichen kein Platz vorhanden ist, wird die Linie an einem früheren Punkt unterbrochen. Vorschläge sind willkommen.
Korrigierter Code:
(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));