0

在我的检票口应用程序中,我有 3 个复选框:

        add(new CheckBox("1").setOutputMarkupId(true));
        add(new CheckBox("2").setOutputMarkupId(true));
        add(new CheckBox("3").setOutputMarkupId(true));

表单还包含取消选择复选框的行为

        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 但我不知道


更新 2

谷歌浏览器在焦点元素中有错误:

http://code.google.com/p/chromium/issues/detail?id=1383&can=1&q=window.focus%20type%3aBug&colspec=ID%20Stars%20Pri%20Area%20Type%20Status%20Summary%20Modified%20Owner

所以我需要以其他方式做到这一点

4

2 回答 2

1

客户端解决方案(Javascript)

您可以通过在客户端对该行为进行编码来保存 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;             
       } 
   }
}     ​

仅限 Java 的解决方案 (Ajax)

如果您真的想在服务器端执行此操作,那么也可以在服务器端传播值(而不是依赖于上次关注的组件),例如使用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);

如果此约束对数据模型的完整性很重要,您还应该在 a 中实现它,FormValidator以便无效输入永远不会到达Forms Model。没有启用 JS 或只是摆弄 DOM 的用户可以绕过它(如果使用 Ajax 行为,同样适用)。

于 2012-09-17T14:21:01.227 回答
0

好的,当我将此行为添加到复选框时,我会重点修复 chrome 错误:

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 上工作

于 2012-09-19T09:35:53.907 回答