在我的wicket应用程序中,我有3个复选框:
add(new CheckBox("1").setOutputMarkupId(true));
add(new CheckBox("2").setOutputMarkupId(true));
add(new CheckBox("3").setOutputMarkupId(true));
表单还包含取消选择checbox的行为
add(new AjaxEventBehavior("onclick") {
private static final long serialVersionUID = 1L;
@Override
protected void onEvent(AjaxRequestTarget target) {
List<Component> components = new ArrayList<Component>();
if (target.getLastFocusedElementId() != null) {
if (target.getLastFocusedElementId().equals("1")) {
components.add(get("2"));
components.add(get("3"));
} else if (target.getLastFocusedElementId().equals("2")) {
components.add(get("1"));
} else if (target.getLastFocusedElementId().equals("3")) {
components.add(get("1"));
}
for (Component component : components) {
component.setDefaultModelObject(null);
target.add(component);
}
}
}
});
这在mozilla浏览器上运行良好但在chrome中这不起作用。我如何改进以在Chrome上工作呢?
更新
问题在于:
target.getLastFocusedElementId()
在mozilla中返回我想要的但是在chrome中它总是返回null但我不知道wh
更新2
google chrome在焦点元素中有错误:
所以我需要以其他方式做到这一点
答案 0 :(得分:1)
您可以通过编码客户端的行为来保存Ajax调用并获得响应。在最简单的场景中,如果您可以为这些复选框提供固定的“id”属性,则可以使用Component.setMarkupId()
强制检查id
值(确保它在DOM中是唯一的) :
<强>爪哇强>
add(new CheckBox("1").setOutputMarkupId(true).setMarkupId("check1");
add(new CheckBox("2").setOutputMarkupId(true).setMarkupId("check2");
add(new CheckBox("3").setOutputMarkupId(true).setMarkupId("check3");
<强> HTML 强>
<input type="checkbox" wicket:id="1" onclick="uncheck(this,1)"/>
<input type="checkbox" wicket:id="2" onclick="uncheck(this,2)"/>
<input type="checkbox" wicket:id="3" onclick="uncheck(this,3)"/>
<强>的Javascript 强>
function uncheck(comp, idx){
if (comp.checked) {
if (idx == 1){
document.getElementById("check2").checked = false;
document.getElementById("check3").checked = false;
}
else if (idx == 2 || idx == 3){
document.getElementById("check1").checked = false;
}
}
}
如果您真的想要在服务器端执行此操作,那么传播值服务器端(而不是依赖于最后关注的组件)也是有意义的,例如使用AjaxFormComponentUpdatingBehavior
。
final CheckBox c1 = new CheckBox("on");
final CheckBox c2 = new CheckBox("off");
c1.setOutputMarkupId(true);
c2.setOutputMarkupId(true);
c1.add(new AjaxFormComponentUpdatingBehavior("onclick") {
private static final long serialVersionUID = 1L;
protected void onUpdate(final AjaxRequestTarget target) {
if (Boolean.TRUE.equals(c1.getModelObject())) {
c2.setModelObject(Boolean.FALSE);
target.add(c2);
}
}
});
c2.add(new AjaxFormComponentUpdatingBehavior("onclick") {
private static final long serialVersionUID = 1L;
protected void onUpdate(final AjaxRequestTarget target) {
if (Boolean.TRUE.equals(c2.getModelObject())) {
c1.setModelObject(Boolean.FALSE);
target.add(c1);
}
}
});
add(c1);
add(c2);
如果此约束对数据模型的完整性很重要,您还应该在FormValidator
中实现它,以便无效输入永远不会到达Form
的{{1}}。没有启用JS或只是摆弄DOM的用户可以绕过它(如果使用Ajax行为,则同样适用)。
答案 1 :(得分:0)
好吧,当我将此行为添加到复选框时,我将焦点修复为chrome bug:
public class DefaultFocusBehavior extends AjaxEventBehavior {
public DefaultFocusBehavior(String event) {
super(event);
}
private static final long serialVersionUID = 1;
private Component component;
@Override
protected void onEvent(AjaxRequestTarget target) {
target.appendJavaScript(("document.getElementById('" + component.getMarkupId() + "').blur();"
+ "document.getElementById('" + component.getMarkupId() + "').focus();"));
}
protected void onBind() {
this.component = getComponent();
component.setOutputMarkupId(true);
}
}
所以现在我的代码也在使用chrome