zk组件事件调用的顺序

将此文赠送给zk群朋友:易语静人(455938495) --zk高级群 Software③China 25891428

 

 

这个特性,我在写博客介绍forward的时候,本来想系统的写一下的,

 

觉得一般情况下大家都不会考虑这么多,就没写,

 

我现在粗略的写一下,如有其它疑问,请在本文评论处提出你的问题,下次浏览博客时我会看到

 

 

a,zk中的forward,onClick是要在服务器端执行的,我称之为服务端事件,即触发zk预定义的js代码,

该js代码向服务器发送http请求,例如调用服务器端某方法等

 

b,w:onClick是html里的onClick,即普通的事件,我称之为客户端事件,调用的是你写的js代码,

仅运行于浏览器端, 如果你不主动请求服务器端, zk不会主动向server发送消息

 

 

zk中事件可以分为4种,

 

 

1,Express事件,即EventListener实现了Express接口的事件

 

2,EventHandler,所谓EventHandler是你在页面上定义的事件

例如<button onClick="java代码"/>,zk在加载页面解析此处onClick的时候会创建一个Zscript实例

当你点击触发onClick后,会调用page的解析器,page.interpret(zscript.getLanguage(), zscript.getContent(page, _comp), scope);

解析执行onClick里的java代码

 

3,普通EventListener

 

4,Component类定义的事件,以on开头的 public void方法 onXXX

 

 

 

 

 

zk中组件事件的处理是由EventProcessor事件处理器处理的,组件事件处理顺序如下:

 

1,Express事件,按照component.addEventListener()添加的顺序调用Express类型EventListener,

 

2,EventHandler

 

3,普通EventListener,按照component.addEventListener()添加的顺序调用

 

4,Component类定义的事件

 

5,注册到组件所属page上的事件监听器,按照page.addEventListener()添加的顺序调用

 

以下是org.zkoss.zk.ui.impl.EventProcessor的相关源码

 

 

Java代码 收藏代码
  1. private void process0(Scope scope) throws Exception {
  2. final Page page = getPage();
  3. if (page == null || !page.isAlive()) {
  4. String msg = (page == null ? "No page is available in " +_desktop: "Page " +page+ " was destroyed" );
  5. if (_desktop.isAlive())
  6. msg += " (but desktop is alive)" ;
  7. else
  8. msg += " because desktop was destroyed.\n"
  9. +"It is usually caused by invalidating the native session directly. "
  10. +"If it is required, please set Attributes.RENEW_NATIVE_SESSION first." ;
  11. log.warning(msg);
  12. }
  13. final ExecInfo execinf;
  14. ((ExecutionCtrl)_desktop.getExecution())
  15. .setExecutionInfo(execinf = new ExecInfo(_event));
  16. final String evtnm = _event.getName();
  17. for (Iterator it = _comp.getListenerIterator(evtnm); it.hasNext();) {
  18. //Note: CollectionsX.comodifiableIterator is used so OK to iterate
  19. final EventListener el = (EventListener)it.next();
  20. execinf.update(null , el, null );
  21. if (el instanceof Express) {
  22. el.onEvent(_event);
  23. if (!_event.isPropagatable())
  24. return ; //done
  25. }
  26. }
  27. if (page != null && _comp.getDesktop() != null ) {
  28. final ZScript zscript = ((ComponentCtrl)_comp).getEventHandler(evtnm);
  29. execinf.update(null , null , zscript);
  30. if (zscript != null ) {
  31. page.interpret(
  32. zscript.getLanguage(), zscript.getContent(page, _comp), scope);
  33. if (!_event.isPropagatable())
  34. return ; //done
  35. }
  36. }
  37. for (Iterator it = _comp.getListenerIterator(evtnm); it.hasNext();) {
  38. //Note: CollectionsX.comodifiableIterator is used so OK to iterate
  39. final EventListener el = (EventListener)it.next();
  40. execinf.update(null , el, null );
  41. if (!(el instanceof Express)) {
  42. el.onEvent(_event);
  43. if (!_event.isPropagatable())
  44. return ; //done
  45. }
  46. }
  47. final Method mtd =
  48. ComponentsCtrl.getEventMethod(_comp.getClass(), evtnm);
  49. if (mtd != null ) {
  50. // if (log.finerable()) log.finer("Method for event="+evtnm+" comp="+_comp+" method="+mtd);
  51. execinf.update(mtd, null , null );
  52. if (mtd.getParameterTypes().length == 0 )
  53. mtd.invoke(_comp, null );
  54. else
  55. mtd.invoke(_comp, new Object[] {_event});
  56. if (!_event.isPropagatable())
  57. return ; //done
  58. }
  59. if (page != null )
  60. for (Iterator it = page.getListenerIterator(evtnm); it.hasNext();) {
  61. //Note: CollectionsX.comodifiableIterator is used so OK to iterate
  62. final EventListener el = (EventListener)it.next();
  63. execinf.update(null , el, null );
  64. el.onEvent(_event);
  65. if (!_event.isPropagatable())
  66. return ; //done
  67. }
  68. }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值