浏览器的信息及控制

若要获取客户端的信息,你可以在根组件为onClientInfo事件注册一个事件监听器。为了控制客户端的行为,你可以使用org.zkoss.zk.ui.util.Clients类的功能。

onClientInfo事件

有时,一个应用程序需要知道客户端的信息,例如时区。那么,你可以为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);

org.zkoss.ui.util.Clients

用于控制客户端视觉表现(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时时就会显示一个确认对话框。