-
FEATURED COMPONENTS
First time here? Check out the FAQ!
I use Detail component to contain a dynamic created GroupMember form, when I click the button in the form, I will got 2 "onClick" events.
1. If I create the form again, then the behaviour will become correctly.
2. If I do not use Detail to contain the form, the behaviour is also correct.
See the screencast here: http://screencast.com/t/MWiWh5q6QvI
Here's a piece of sample code, but the sample code can't reappear the strange behaviour.
<?xml version='1.0' encoding='UTF-8'?> <?page title='duplicated event test'?> <zk> <!-- 中文 for saving as UTF-8 --> <tabbox> <tabs> <tab label='empty'/> <tab label='group management' selected='true'/> </tabs> <tabpanels> <tabpanel> </tabpanel> <tabpanel> <button label='List Groups' onClick='ListGroups();'/> <grid id='gridGroup'> <columns> <column label='+'/> <column label='id'/> <column label='name'/> <column label='operation'/> </columns> </grid> </tabpanel> </tabpanels> </tabbox> <zscript><![CDATA[ public ClearGrid (Grid grid) { Rows rows = grid.getRows (); if (rows!=null) grid.removeChild (rows); } public class DynamicCreatedButtonClickEventProcessor implements org.zkoss.zk.ui.event.EventListener { Button button; String action; public void DynamicCreatedButtonClickEventProcessor (Button src, String sAction) { button = src; action = sAction; } public void onEvent (org.zkoss.zk.ui.event.Event event) throws UiException { if (action.equalsIgnoreCase("ShowGroupMember")) { ListMembers (button.getAttribute("COMPONENT_Container")); //生成铃音设置表单 (null, button.getAttribute("COMPONENT_Container")); } else if (action.equalsIgnoreCase("NewGroupMember")) { SaveNewMember (); // got 2 event here } else if (action.equalsIgnoreCase("ModifyGroupMember")) { ModifyMember (); } else if (action.equalsIgnoreCase("SaveRingBackSetting")) { 保存铃音设置 (button.getAttribute("COMPONENT_Grid")); } } } public class DynamicCreatedRowClickEventProcessor implements org.zkoss.zk.ui.event.EventListener { public void onEvent (org.zkoss.zk.ui.event.Event event) throws UiException { Component component = event.getTarget (); if (component instanceof org.zkoss.zul.Row) { org.zkoss.zul.Row row = (org.zkoss.zul.Row)component; Detail detail = row.getDetailChild(); if (detail != null) { detail.setOpen (! detail.isOpen()); // 切换明细的打开、合拢状态 } } } } DynamicCreatedRowClickEventProcessor onRowClick = new DynamicCreatedRowClickEventProcessor (); public void ListGroups () { Rows rows = gridGroup.getRows(); if (rows!=null) gridGroup.removeChild (rows); Rows newRows = new Rows (); gridGroup.appendChild (newRows); for (int i=1; i<=5; i++) { Row row = new Row (); row.addEventListener ("onClick", onRowClick); Detail detail = new Detail (); row.appendChild (detail); row.appendChild (new Label("" + i)); row.appendChild (new Label("Group" + i)); Button buttonShowMember = new Button("show member"); row.appendChild (buttonShowMember); buttonShowMember.setAttribute ("COMPONENT_Container", detail); buttonShowMember.addEventListener ("onClick", new DynamicCreatedButtonClickEventProcessor(buttonShowMember, "ShowGroupMember")); newRows.appendChild(row); } } public void ListMembers (Detail container) { container.getChildren().clear(); container.setOpen (true); Grid grid = new Grid (); container.appendChild (grid); Columns cols = new Columns(); cols.setSizable (true); grid.appendChild (cols); cols.appendChild (new Column("MemberName")); cols.appendChild (new Column("MemberMemo")); cols.appendChild (new Column("Operation")); // 添加新群组成员行 Foot foot = new Foot (); grid.appendChild (foot); Footer footer; // 组员名称 footer = new Footer(); Textbox textboxGroupMemberName = new Textbox(); textboxGroupMemberName.setConstraint ("no empty"); footer.appendChild (textboxGroupMemberName); foot.appendChild (footer); // 组员备注 footer = new Footer(); Textbox textboxGroupMemberMemo = new Textbox(); textboxGroupMemberMemo.setConstraint ("no empty"); footer.appendChild (textboxGroupMemberMemo); foot.appendChild (footer); // 组员备注 footer = new Footer(); Button buttonSaveNewRingBackGroupMember = new Button ("+ Save New Member"); buttonSaveNewRingBackGroupMember.setAttribute ("COMPONENT_GroupMemberName", textboxGroupMemberName); buttonSaveNewRingBackGroupMember.setAttribute ("COMPONENT_GroupMemberMemo", textboxGroupMemberMemo); buttonSaveNewRingBackGroupMember.addEventListener ("onClick", new DynamicCreatedButtonClickEventProcessor(buttonSaveNewRingBackGroupMember, "NewGroupMember")); footer.appendChild (buttonSaveNewRingBackGroupMember); foot.appendChild (footer); Rows newRows = new Rows (); grid.appendChild (newRows); for (int i=1; i<=5; i++) { Row row = new Row (); row.appendChild (new Textbox("Member name " + i)); row.appendChild (new Textbox("Member memo " + i)); Button buttonModifyMember = new Button("modify member"); row.appendChild (buttonModifyMember); buttonModifyMember.addEventListener ("onClick", new DynamicCreatedButtonClickEventProcessor(buttonModifyMember, "ModifyGroupMember")); newRows.appendChild(row); } } public void SaveNewMember () { String sAction = "SaveNewMember"; if (Messagebox.show("really?", sAction, Messagebox.OK | Messagebox.CANCEL, Messagebox.QUESTION) != Messagebox.OK) return; } public void ModifyMember () { String sAction = "ModifyMember"; if (Messagebox.show("really?", sAction, Messagebox.OK | Messagebox.CANCEL, Messagebox.QUESTION) != Messagebox.OK) return; } ]]></zscript> </zk>
I've post it to ZK bugs (#2884481) here https://sourceforge.net/tracker/?func=detail&aid=2884481&group_id=152762&atid=785191
I use wireshark to track the HTTP request, I found the following HTTP request when the button is clicked:
POST /crbtcs_new/zkau?dtid=gl8k1&cmd.0=onClick&uuid.0=z_l8_la1&data.0=-300&data.0=9&data.0=&cmd.1=onClick&uuid.1=z_l8_la1&data.1=-300&data.1=9&data.1= HTTP/1.1
it seems 2 onClick events are sent to server:
cmd.0=onClick&uuid.0=z_l8_la1&data.0=-300&data.0=9&data.0=&
cmd.1=onClick&uuid.1=z_l8_la1&data.1=-300&data.1=9&data.1=
POST /crbtcs_new/zkau?dtid=gl8k1&cmd.0=onClick&uuid.0=z_l8_la1&data.0=-300&data.0=9&data.0=&cmd.1=onClick&uuid.1=z_l8_la1&data.1=-300&data.1=9&data.1= HTTP/1.1 Accept: */* Accept-Language: zh-cn Referer: http://10.168.138.252/crbtcs_new/index.zul Content-Type: application/x-www-form-urlencoded;charset=UTF-8 zk-sid: 2480 Accept-Encoding: gzip, deflate User-Agent: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0; Trident/4.0; www.xxliu.com; QQPinyinSetup 614; QQDownload 1.7; TencentTraveler ; Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1) ; SLCC1; .NET CLR 2.0.50727; InfoPath.1; .NET CLR 3.5.30729; .NET CLR 3.0.30729; CIBA) Host: 10.168.138.252 Content-Length: 0 Connection: Keep-Alive Cache-Control: no-cache Cookie: JSESSIONID=BAE5B1EB0BA95405B5AC50D1FFA4E003
i've test zk3.6.2、 zk3.6.3-2009-10-23, it's occured in the both version.
i haven't successfully test zk5.0-rc in my application, the browser report a javascript error when loading my login page :
zkau/web/_zv09100212/js/zul.grid.wpd, line 14 if(b.isVisible()&&b.isStripeable_()){for(;e.rows;++c){if(e.rows.id==b.uuid){break}} IE 8: 'rows' 为空或不是对象 'rows' is null or not an object Firefox 3.5.3: e is undefined
Asked: 2009-09-22 09:11:14 +0800
Seen: 1,126 times
Last updated: Oct 24 '09