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>
在上面的thea中:
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;
}
}
和标记:
<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>