如何在Chrome浏览器中取消选中复选框

时间:2012-09-17 12:04:16

标签: java google-chrome wicket

在我的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在焦点元素中有错误:

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

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

2 个答案:

答案 0 :(得分: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);

如果此约束对数据模型的完整性很重要,您还应该在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