我正在构建一个GWT组件,其行为与stackoverflow和其他站点上的注释框非常相似。我正在尝试为KeyPress
,Change
和ONPASTE
事件注册听众,这些事件将使用剩余字符数等更新我的状态行。
除了文本区域中实际字符数后面总是一个字符外,它才有效。我将最大字符数设置为10.当我输入第一个字符时,它仍然显示“剩余10个字符”。在我键入第二个字符然后它是一个关闭之前它不更新状态行,它表示在输入第二个字符时剩余9个字符。
当我BACKSPACE
或DELETE
时,它也是一个关闭,当没有字符时,它仍然显示“剩余9个字符”,直到我按下BACKSPACE
或{{1}第二次。
我在Windows上的Firefox,Chrome和Internet Explorer中都会遇到这种情况。所以我认为我没有正确注册。
我知道这与事件被解雇时有关,但我花了好几个小时试图诊断这种行为并且已经用完了想法。
以下是我注册事件处理程序的地方,完整代码为BoundedTextAreaWithFeedback。
DELETE
以下是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()
答案 0 :(得分:2)
我刚开始添加addXXXHandler()
,直到有人工作。
this.textArea.addKeyUpHandler(new KeyUpHandler()
{
public void onKeyUp(final KeyUpEvent event)
{
outer.validate();
}
});
好像已经成功了。
以下是working code,CTRL-V
,上下文菜单中的粘贴现在也可以使用。
答案 1 :(得分:1)
尝试使用DeferredCommand执行验证码。我认为问题在于,当事件触发时,它们的字符尚未添加到文本区域。在任何挂起的事件处理程序完成之前,DeferredCommand不会执行,允许正确计算文本的长度。
有关使用DeferredCommand的示例,请参阅this question。