我正在構建一個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