如何捕获up&amp ;;的onclick事件?来自JQuery的微调器组件上的按钮?
我可以使用以下代码捕获相关文本字段的onchange,但是up&向下微调器按钮不会触发事件:
Spinner<Integer> psbBudget = new Spinner<>("psbBudget", new PropertyModel(psb,"psbBudget"), Integer.class);
psbBudget.add(new AjaxFormComponentUpdatingBehavior("onchange") {
@Override
protected void onUpdate(AjaxRequestTarget art) {
Integer inputS = (Integer) getFormComponent().getConvertedInput();
BigDecimal spinnerTime = BigDecimal.valueOf(inputS);
unallocatedTimeMap.put(psb, unallocatedTimeMap.get(psb).subtract(spinnerTime));
art.add(budgetListViewContainer);
}
});
listItem.add(psbBudget);
li.add(new Label("remainingBudgetLabel", new Model(unallocatedTimeMap.get(psb))));
为了让自己变得更加困难,这个微调器包含在ListView中,因为预算项的数量是可变的。我得到剩下的BudgetLabel来反映在文本字段中所做的更改,而不是使用微调按钮进行的更改!
我已经开始探索使用以下行注入我自己的javascript:
// behavior to capture changes made using spinner buttons (doesn't work!!!)
add(new Behavior() {
@Override
public void renderHead(Component component, IHeaderResponse response) {
super.renderHead(component, response);
response.render(OnDomReadyHeaderItem.forScript("$('.ui-spinner-button ui-spinner-up ui-corner-tr ui-button ui-widget ui-state-default ui-button-text-only').click(function() {$(this).siblings('input').change();})"));
}
});
以下是声明的html的相关部分:
<table>
<tr>
<td/>
<th>Budget</th>
<th>Remaining</th>
</tr>
<tr wicket:id="budgetListView">
<th wicket:id="budgetLabel">Budget
</th><td><input wicket:id="psbBudget" type="text" style="width:3em" maxLength="2"/>
</td><td wicket:id="remainingBudgetLabel"/>
</tr>
</table>
所以我想这有两个问题: 1 - 这个javascript注入工作是否有任何希望(我只是用javascript弄湿了)或者有没有办法在Wicket中更正确地做到这一点? 2 - 如果javascript是唯一的方法,当我无法控制生成的jquery的id属性时,我怎样才能正确找到元素(或者我能以某种方式控制它?)?
我正在使用带wicket 6.6.0的wicket-jquery-ui 6.2.1库。谢谢。
修改
我之前发布的(现已删除)生成的html是右键单击并选择viewSource,但未显示jquery实际生成的html。请参阅下面的IE9中F12开发人员工具的屏幕截图,其中显示为微调器生成的html包含原始<input>
以及两个为微调器按钮生成的<a>
标签。
答案 0 :(得分:2)
我刚看到这篇帖子......
只是说你还有其他两个选择:
1 /您拥有自己的扩展微调器:
@Override
protected void onConfigure(JQueryBehavior behavior)
{
super.onConfigure(behavior);
behavior.setOption("onspinstop", this.onStopBehavior.getCallbackFunction());
//onStopBehavior is an JQueryAjaxPostBehavior, see how AjaxDatePicker works for instance
}
第二个选项是要求AjaxSpinner
,因为它有意义,无论是通过github项目还是谷歌组:
https://github.com/sebfz1/wicket-jquery-ui/
http://groups.google.com/group/wicket-jquery-ui/
祝你好运, 的Sebastien。
答案 1 :(得分:0)
尽管我不想回答我自己的问题,但这里是:
我能够使用以下代码捕获事件。当有人手动输入字段中的数字时,“onchange”会捕获事件,“onspinstop”会在单击向上/向下箭头更新组件后捕获事件:
Spinner<Integer> psbBudget = new Spinner<>("psbBudget", new Model(allocatedTimeMap.get(psb)), Integer.class);
psbBudget.add(new AjaxFormComponentUpdatingBehavior("onchange") {
@Override
protected void onUpdate(AjaxRequestTarget art) {
Integer input = (Integer) getFormComponent().getConvertedInput();
// Do whatever with updated input //
art.add(remainingBudgetLabel,remainingBudgetLabel.getMarkupId());
}
}
psbBudget.add(new AjaxFormComponentUpdatingBehavior("onspinstop") {
@Override
protected void onUpdate(AjaxRequestTarget art) {
Integer input = (Integer) getFormComponent().getConvertedInput();
// Do whatever with updated input //
art.add(remainingBudgetLabel,remainingBudgetLabel.getMarkupId());
}
}
在查看API documentation for the JQuery UI Spinner component然后尝试事件字符串的每个可能组合之后,我能够解决这个问题。要正确执行此操作,您必须将字符串全部放在小写中,并将“on”字符串添加到事件名称的开头。
我在练习中学到的另一件事是,我可以通过调用art.add(component, component.getMarkupId());
来更新(我认为我实际上正在替换它们?)列表视图中的各个组件。这比我之前使用listView.setList(updatedList)
和art.add(listViewContainer);