差异

除了作为ZK组件,XHTML组件集的实现与其它的组件集[53]有某些不同,这样会更容易将传统的XHTML页面融入ZK。

为每个标签创建一个组件

ZK加载器会为在ZUML页面内声明的每个标签创建一个ZK组件。例如,在下面的ZUML页面内创建了四个组件(html,body, p 和 label)。

<html>
   <body>
      <p>Hi</p>
   </body>
</html>

优点是你可以动态改变任何组件的内容:

<p id="info">Hi</p>
<z:button onClick="info.detach()" xmlns:z="http://www.zkoss.org/2005/zk"/>

但是,这会消耗更多的处理时间,且会需要更多的内存来容纳这些组件,所以,如果页面的一部分是静态的,你可以按如下方式使用Native命名空间。

<n:html xmlns:n="http://www.zkoss.org/2005/zk/native">
   <n:body>
      <p id="info">Hi</p>
      <z:button onClick="info.detach()" xmlns:z="http://www.zkoss.org/2005/zk"/>
   </n:body>
</n:html>

参考性能提示一章获取更多信息。

UUID即为ID

传统的servlets和JavaScript 代码通常依赖于id属性,所以XHTML组件的UUID与ID是相同的。因此,开发人员不需要更改已存在的代码来适应ZK,如下所示。

<img id="which"/>
<script type="text/javascript"><![CDATA[
//JavaScript and running at the browser
   function change() {
      var el = document.getElementById("which");
      el.src = "something.gif";
   }
]]></script>
<zscript><!-- Java and running at the server -->
   void change() {
      which.src = "another.gif";
   }
</zscript>

注意,UUID是不可变的,并且与组件的ID没有任何关系,而不是XHTML(Notice that UUID is immutable and nothing to do with ID for components other than XHTML)。因此,在上面的例子中,若使用了XUL组件则会失败。若你真想在JavaScript 中使用XUL组件,则必须使用EL表达式获取正确的UUID。

<input id="which"/>
<script type="text/javascript">//Running at the browser
   var el = document.getElementById("${which.uuid}");
   el = $e("${which.uuid}"); //$e() is an utility of ZK Client Engine
</script>

副作用

由于UUID即为ID,所以同一桌面内的两个组件不能有相同的ID。

所有标签都有效

不同于XUL或其它组件集,在XHTML组件集中没有无效的XML元素。ZK使用org.zkoss.zhtml.Raw类用于构造任何未经认证的xml元素[54]。因此,开发人员可以使用目标浏览器支持的任意标签,不管ZK组件是否实现了它们。

类似的,你可以使用Raw组件来创建任何在XHTML组件集中没有定义的组件,如下。

new Raw("object"); //object could be any tag name the target browser supports

大小写

不同于XUL或其它组件集,XHTML的组件名是区分大小写的。下面的XML元素都被映射到 org.zkoss.zhtml.Br组件。

<br/>
<BR/>
<bR/>

无模型支持

XHTML组件直接输出其内容。它们不支持模型。换言之,mold属性会被忽略。



[53] 这些差异是由于实现了特定的接口,所以你可以为你的组件应用 (apply)相同的效果,若果你喜欢的话。

[54] 注::这由 org.zkoss .zk.ui.ext.DynamicTag接口处理。