在我的检票口应用程序中,我有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

所以我需要用其他方式

#1楼 票数: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)"/>

Java脚本

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实现它,以使无效输入永远不会到达FormModel 没有启用JS或只是喜欢DOM的用户可以绕过它(如果使用Ajax行为,则同样适用)。

#2楼 票数: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上工作

  ask by hudi translate from so

未解决问题?本站智能推荐:

1回复

选中的最后一行datagrid(com.inmethod.grid.datagrid)将所有JS挂在Chrome下

当选择数据网格生成的表中的最后一行时(当然使用setClickRowToSelect(true)),页面上的所有javasript都将挂起。 据我所知,这仅发生在chrome上。 wicketstuff的官方示例在http://wicketstuff.org/grid-examples/da
1回复

在Chrome浏览器上调试Wicket框架1.3.5

我有一个搜索页面,其中有几个输入组件,例如文本框,下拉列表,单选按钮等。对于在下拉列表中选择的特定品牌值,然后点击搜索,我得到了一个空白表。 尽管它在IE浏览器中可见。 这是一个简单的数据库检索调用。 该页面基于Apache-wicket框架1.3.5版构建。我使用的Chrome浏览器版本
1回复

jQuery完整日历未在Chrome 10浏览器中加载

我使用了来自http://arshaw.com/fullcalendar/的jquery控件完整日历。 我已经在wicket应用程序中使用了该控件,其中在一个页面中有两个选项卡,在一个选项卡中有一些文本字段,而在另一个中则是日历控件。 但是现在对于我的本地服务器,一切都很好。 但是当我
1回复

Wicket Ajax 在 Firefox 和 IE 中有效,但在 Chrome 和 Safari 中无效

我正在使用 Wicket 7.6 并且我有一些这样的代码 所以这段代码在 Firefox 和 IE 中运行良好,我在开发工具中看到了请求。 但是当我使用 Chrome 并且 Safari 代码不起作用并且开发工具中甚至没有 ajax 请求时,什么也没有发生并且 OnUpdate 不会触发。 在
2回复

Wicket ::如何在CheckBoxMultipleChoice的复选框中添加样式边距

我将列表传递给CheckBoxMultipleChoice并使用apache wicket在前端生成复选框 我想在所有复选框之间添加边距。 我的代码如下: HTML代码 Java代码 导致动态html出现在前端 我试过了 但结果它会将类添加到di
1回复

在Wicket中向组件添加复选框

我有一个“文本”字段,当您编写文本时,它会根据您所写的内容自动完成您的可能选择。 有固定的收藏夹列表,我必须在组件中添加一个复选框,以便用户可以选择仅查看收藏夹选项还是所有可能的选择。 我问谷歌,但我找不到如何在该级别修改组件。 有没有人暗示或我可以看看一个好的例子?
1回复

Wicket:不再选择复选框时收到通知

这是 Wicket GUI (Wicket 7.6.0) 的一部分,它充当前端以显示一些数据库条目。 在这个特定页面上,我们有一个表单,用户可以在其中通过指定搜索条目,例如。 开始日期、结束日期等以限制结果。 点击按钮后,搜索条目将显示在此搜索表单下方。 这些结果使用带分页的 Wicket Da
2回复

如何在apache wicket中启用/禁用复选框值更改上的文本字段?

我有一个包含复选框的HTML表单和一个包含一些文本字段的Lis​​tView。 在选中复选框时,我希望禁用文本字段,反之亦然。 我正在使用AjaxFormComponentUpdatingBehavior复选框。 但是它没有将文本字段设置为启用/禁用。 以下是代码段- HTM