0

Why 2 "onClick" events occured from a dynamic created Button in Detail component?

asked 2009-09-22 09:11:14 +0800

lovetide gravatar image lovetide
169 1 7

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>

delete flag offensive retag edit

4 Replies

Sort by » oldest newest

answered 2009-09-28 03:25:22 +0800

henrichen gravatar image henrichen
3869 2
ZK Team

Would you help post to ZK bugs?

link publish delete flag offensive edit

answered 2009-10-23 01:15:01 +0800

lovetide gravatar image lovetide
169 1 7

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

link publish delete flag offensive edit

answered 2009-10-24 20:36:08 +0800

henrichen gravatar image henrichen
3869 2
ZK Team

Does the issue occur in 3.6.x or in 5.0 RC only?

link publish delete flag offensive edit

answered 2009-10-24 23:57:17 +0800

lovetide gravatar image lovetide
169 1 7

updated 2009-10-25 00:33:02 +0800

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

link publish delete flag offensive edit
Your reply
Please start posting your answer anonymously - your answer will be saved within the current session and published after you log in or create a new account. Please try to give a substantial answer, for discussions, please use comments and please do remember to vote (after you log in)!

[hide preview]

Question tools

Follow

RSS

Stats

Asked: 2009-09-22 09:11:14 +0800

Seen: 1,126 times

Last updated: Oct 24 '09

Support Options
  • Email Support
  • Training
  • Consulting
  • Outsourcing
Learn More