form
フォーム コントロールのプロパティを使用すると、コードをもう少し簡潔にすることができます。
<form name="myForm">
<textarea name="message1" wrap="physical" cols="28" rows="5"
onKeyDown="textCounter(this.form.message1 && this.form.message2, this.form.chars, 500)"
...></textarea>
上記のテアで:
this.form.message1 && this.form.message2
は、最初に を評価することによって処理されthis.form.message1
ます。これは、型が に変換される DOM 要素への参照を返しますtrue
。したがって、次の式が評価され、結果が返されます。
したがって、効果的this.form.message2
に関数に渡しています。両方のコントロールを渡し、両方の合計文字数を取得したいようです。
したがって、両方の要素を関数に渡し、それに応じてロジックを調整する必要があります。
function textCounter(field0, field1, cntfield, maxlimit) {
var totalChars = field0.value.length + field1.value.length;
var diff = maxlimit - totalChars;
if (diff < 0) {
field0.value = field0.value.substring(0, field0.value.length + diff);
} else {
cntfield.value = diff;
}
}
そしてmarkukp:
<form name="myForm">
<textarea name="message1" wrap="physical" cols="28" rows="5"
onKeyDown="textCounter(this, this.form.message2, this.form.chars, 500)"
onKeyUp="textCounter(this, this.form.message2, this.form.chars, 500)"></textarea>
<br>
<textarea name="message2" wrap="physical" cols="28" rows="5"
onKeyDown="textCounter(this, this.form.message1, this.form.chars, 500)"
onKeyUp="textCounter(this, this.form.message1, this.form.chars, 500)"></textarea>
<br>
<input readonly type="text" name="chars" size="3" maxlength="3" value="500">
characters left
制限に達すると、これはかなり迷惑な動作を引き起こすことに注意してください。特に、文字が途中で追加され、ユーザーが文字が最後から削除されていることに気付かない場合はなおさらです。
残っている文字数または削除する必要がある文字数をユーザーに知らせ、その要件を満たす方法を考えさせる方がはるかに優れています (たとえば、StackOverflow コメントの仕組みを参照してください)。
編集
残りの文字数をマイナス記号で表示し、マイナスになると色を変えるだけです。
<style ...>
.negative {
font-weight: bold;
color: red;
}
</style>
<script>
function textCounter(field0, field1, cntfield, maxlimit) {
var totalChars = field0.value.length + field1.value.length;
var diff = maxlimit - totalChars;
if (diff < 0) {
addClass(cntfield, 'negative');
} else {
removeClass(cntfield, 'negative');
}
cntfield.value = diff;
}
いくつかのヘルパー関数:
function hasClass(el, cName) {
var re = new RegExp('(^|\\s)' + cName + '(\\s|$)');
return re.test(el.className);
}
function addClass(el, cName) {
if (!hasClass(el, cName)) {
el.className = (el.className + ' ' + cName).replace(/(^\s*)|(\s*$)/g,'').replace(/\s+/g,' ');
}
}
function removeClass(el, cName) {
var re;
if (hasClass(el, cName)) {
re = new RegExp('(^|\\s)' + cName + '(\\s|$)');
el.className = el.className.replace(re, ' ').replace(/(^\s*)|(\s*$)/g,'').replace(/\s+/g,'');
}
}
</script>