问题涉及Wicket 1.6
我有一个向导步骤,其中包含一个Textfield组件。当我按下Enter键时,这将由向导栏的默认按钮(“下一步”)处理,然后进入向导中的下一步。我不希望这种情况发生。当我在文本字段上按Enter键时,我只想更新值,但保留在同一页面上。
我尝试覆盖我的Wizard类的onBeforeRender()
方法,正如您所看到的那样,将包含表单的默认按钮设置为null。但是,现在这会导致在按Enter键时触发“上一个”按钮,因此向导将返回上一步。
public class ConfigurationWizard extends Wizard {
....
@Override
protected void onBeforeRender()
{
super.onBeforeRender();
Component buttonBar = getForm().get(BUTTONS_ID);
if (buttonBar instanceof IDefaultButtonProvider)
{
getForm().setDefaultButton(null);
}
}
}
所以基本的问题是,如何禁用向导的默认按钮行为?
答案 0 :(得分:6)
我的方法(有很好的Wicket行为)
TextField<String> myField = new TextField<String>("myField", myModel());
myField.add(new PreventSubmitOnEnterBehavior());
public class PreventSubmitOnEnterBehavior extends Behavior
{
private static final long serialVersionUID = 1496517082650792177L;
public PreventSubmitOnEnterBehavior()
{
}
@Override
public void bind( Component component )
{
super.bind( component );
component.add( AttributeModifier.replace( "onkeydown", Model.of( "if(event.keyCode == 13) {event.preventDefault();}" ) ) );
}
}
答案 1 :(得分:2)
这与向导按钮无关。
当按下Enter键时,TextField <input>
正在执行表单提交。这是<input>
元素的标准行为。
解决方案是按下Enter键按下<input>
并阻止默认行为
这一点javascript魔术对我有用:
<script type="text/javascript">
$(document).ready(function() {
$("#gridDiv").delegate("input","keypress",function(e){
if(e.originalEvent.keyCode == 13){
e.preventDefault();
}
});
});
</script>
其中'gridDiv'是包含TextField
的<div>
的id
答案 2 :(得分:0)
我更喜欢另一种方法:
我对所需的每个按钮使用AjaxButtons,并在覆盖的onSubmit()中使用特定的提交代码:
AjaxButton linkSubmit = new AjaxButton("linkSubmit")
@Override
public void onSubmit(AjaxRequestTarget target, Form form) {
super.onSubmit();
// Submit code goes here....
// ...
setResponsePage(new NewPage());
}
@Override
public void onError(AjaxRequestTarget target, Form form) {
}
};
我的表单不需要“onSubmit()”方法。
标记没有任何提交按钮。所有按钮的编码如下:
使用这种方法,您不需要乱用javascript代码。如果按Enter键,页面将无效。您必须单击按钮才能提交每个按钮。
希望这可以帮到你。