若要获取客户端的信息,你可以在根组件为onClientInfo事件注册一个事件监听器。为了控制客户端的行为,你可以使用org.zkoss.zk.ui.util.Clients
类的功能。
有时,一个应用程序需要知道客户端的信息,例如时区。那么,你可以为onClientInfo
事件提添加一个事件监听器。一旦添加了事件,客户端将会寄回一个org.zkoss.zk.ui.event.ClientInfoEvent 类的实例,从此类你可以获取客户端的信息。
<grid onClientInfo="onClientInfo(event)"> <rows> <row>Time Zone <label id="tm"/></row> <row>Screen <label id="scrn"/></row> </rows> <zscript> void onClientInfo(ClientInfoEvent evt) { tm.setValue(evt.getTimeZone().toString()); scrn.setValue( evt.getScreenWidth()+"x"+evt.getScreenHeight()+"x"+evt.getColorDepth()); } </zscript> </grid>
[注]: onClientInfo
事件仅对于根组件(亦=没有任何父组件的组件)是有意义 的。
ZK不会存储客户端的信息,所以若有需要的话你需要手动存储。由于会话(session)是与相同的客户端相关联的,所以你可以将客户端信息存储在会话属性中。
session.setAttribute("px_preferred_time_zone", event.getTimeZone());
注意,若你将时区信息存储在名为px_preferred_time_zone
的会话变量中,那么此后此值将会成为默认的时区。详情请参考国际化一章中关于时区一节。
注意,在页面被提交(rendered)(且送至客户端)后,onClientInfo
事件会从客户端被发出。因此,若你的部分组件数据依赖于客户端的信息,例如时区,你可以要求客户端重新发送请求,如下。
import org.zkoss.util.TimeZones; ... if (!TimeZones.getCurrent().equals(event.getTimeZone()) Executions.sendRedirect(null);
用于控制客户端视觉表现(visual presentation)(更确切的说,为浏览器窗口)的功能(utilities)被集中放置于org.zkoss.ui.util.Clients。例如,你可以滚动浏览器窗口(亦=桌面),如下。
Clients.scrollBy(100, 0);
某些情况下,你或许想防止,或至少,警告用户,当他试图关闭窗口或浏览另一个网页时。例如,当用户正在编写一封未保存的邮件时。
if (mail.isDirty()) { Clients.confirmClose("Your message has not been sent.\nDiscard your message?"); } else { Clients.confirmClose(null); }
一旦调用了confirmClose
方法且参数为非空字符串(with a non-empty string),当用户试图关闭浏览器窗口,重载(reload),或浏览另一个URL时时就会显示一个确认对话框。