4 に答える
Windkiller のフィドルを改善しました。
選択した要素の data プロパティを使用して、DOM に影響を与えずにデータを保存および取得する方法を示すデバッガー div を含めました。
最後の文字の長さが現在の文字の長さよりも大きい場合 (つまり「入力」)、高さには初期の高さのサイズが割り当てられ、次に scrollHeight の値が割り当てられます。
このサンプルでは、「em」ユニットも使用しました。
さらに、css スタイリングに line-height を追加 (宣言) し、overflow-x を具体的に宣言しました。
HTML
<textarea class="inputField" style="height:2em;font-size: 19px;" id="inputField" placeholder="Type your message"></textarea>
<div id='debugger'>
<div>0 current characters</div>
<div>0 last characters</div>
</div>
jQuery
$('#inputField').data('lastCharCount', 0);
$('#inputField').bind('input', function (e) {
$(this).data('CharCount', e.target.value.length);
$('#debugger').html('<div>' + $(this).data('CharCount') + ' current character(s)</div>');
if (e.target.clientHeight >= 350 && e.target.style.overflowY != "scroll") {
e.target.style.overflowY = "scroll";
} else if (e.target.clientHeight < 350) {
e.target.style.overflowY = "hidden";
}
if ($(this).data('CharCount') > $(this).data('lastCharCount')) {
e.target.style.height = ((e.target.scrollHeight) / e.target.style.fontSize.replace('px', '')) + "em";
/* A change in character length occurred */
} else if ($(this).data('CharCount') < $(this).data('lastCharCount')) {
e.target.style.height = '2em';
e.target.style.height = ((e.target.scrollHeight + 1) / e.target.style.fontSize.replace('px', '')) + "em";
/* A change in character length occurred */
} else {
/* No change in character length occurred. Possible character replaced */
}
$('#debugger').append('<div>' + $(this).data('lastCharCount') + ' last character(s)</div>');
$(this).data('lastCharCount', $(this).data('CharCount'));
});
CSS
body {
font-size:14px;
}
.inputField {
-ms-grid-row: 2;
-ms-grid-column: 2;
min-height: 2em;
max-height: 350px;
overflow: hidden;
overflow-x:hidden;
padding:0em;
line-height:1em;
}
jsFiddle: http://jsfiddle.net/GREM9/8/
Windows 8 の JavaScript が css 間で多くの競合を引き起こす可能性があることに気付きました。私は半分の時間、競合する css またはグローバル変数によって引き起こされる視覚的なエラーを修正しようとするアプリを開発しています。さまざまな css ファイルを使用し、それらの間で同様の名前を宣言していますか? (たとえば、.inputField が宣言された file1.css があり、このページでは、別の属性で宣言された file2.css with.inputField があると想像してください)
Javascript コードを使用する代わりに、オーバーフロー スクロールを追加するクラスを作成します。
次に、jquery を使用してテキスト領域の高さを確認します。最大の高さに達したら、テキスト領域をオーバーフロー スクロールさせるクラスを追加します。
コードは、一目で理解するのがはるかに簡単になるはずです。
例えば
if ($('textarea').height => 350) { $('textarea').addClass('overflowY');}
うまくいけば、それで問題が解決します。ああ、高さを削除してに変更しますmin-height:30px;