我正在构建一个GWT组件,其行为非常像这里在stackoverflow和其他网站上的评论框。我试图注册监听器KeyPress
,Change
和ONPASTE
事件,将更新我的剩余字符数状态行等为什么此代码有“一次性错误”?
它的工作原理,除了它始终是落后于文本区域中的字符的实际数目的一个字符。我将最大字符数设置为10.当我输入第一个字符时,仍然会显示“剩余10个字符”。它不更新状态行,直到我键入第二个字符,然后它是一个关闭,它表示键入第二个字符时剩余9个字符。
当我BACKSPACE
或DELETE
,它也是一关,当没有字符,还在说“剩下的9个字”,直到我按下BACKSPACE
或DELETE
第二次。
我在Windows上的Firefox,Chrome和Internet Explorer中都出现此行为。所以我认为我没有正确注册。
我知道这与事件被解雇时有关系,但我花了几个小时试图诊断这种行为并且已经用完了想法。
这里是我注册事件处理程序的地方,完整的代码是BoundedTextAreaWithFeedback。
private void registerHandlers()
{
final BoundedTextAreaWithFeedback outer = this;
this.textArea.addChangeHandler(new ChangeHandler()
{
public void onChange(final ChangeEvent changeEvent)
{
outer.validate();
}
});
this.textArea.addKeyPressHandler(new KeyPressHandler()
{
public void onKeyPress(final KeyPressEvent keyPressEvent)
{
outer.validate();
}
});
this.panel.addFocusHandler(new FocusHandler()
{
public void onFocus(final FocusEvent focusEvent)
{
outer.textArea.setFocus(true);
}
});
// capture paste events
this.textArea.sinkEvents(Event.ONPASTE);
}
这里是validate()
方法。
private boolean validate()
{
final boolean isValid;
final int len = this.textArea.getText().length();
if (len < this.minLength)
{
this.status.setText("Enter at least " + this.minLength + " characters.");
this.status.setStyleName("input-status-underflow");
isValid = false;
}
else if (len > this.maxLength)
{
this.status.setText(this.maxLength - len + " characters remaining");
this.status.setStyleName("input-status-overflow");
isValid = false;
}
else
{
this.status.setText(this.maxLength - len + " characters remaining");
this.status.setStyleName("input-status-ok");
isValid = true;
}
return isValid;
}
这是有效的,因为字母不会被添加到TextArea直到密钥被释放。 – 2011-03-06 20:09:33