一些 WML 1.x 中可用的特征在 XHTML MP 中已经不存在了. 在这一部分中, 你将学到 WML 1.x 与 XHTML MP 之间的这些区别. 这一部分对于那些熟悉 WML 但对于 XHTML MP 来说是新手的人, 或者那些想把他们的移动因特网应用从 WML 1.x 迁移到 XHTML MP的人来说, 特别有用.
尽管失去了 WML 的一些特征, 在 XHTML MP 中还是有实现类似效果的方法的. 应该注意到, WAP 2.0 对 WML 1.x 是后向兼容的, 这就意味着 WAP 2.0 移动设备能够显示 WML 1.x 文档. 如果你必须要使用一个在 WML 中有效但在 XHTML MP 中无效的特征, 那么你可以考虑用 WML 1.x 开发你的 WAP 应用.
这些是 XHTML MP 所丢失的主要的 WML 语言的特征:
- XHTML MP 不支持 Deck 与 Card
- XHTML MP 不支持计时器
- XHTML MP 不支持事件
- XHTML MP 不支持变量
- XHTML MP 不支持客户端脚本
- XHTML MP 不支持对软键 (accesskey) 编程
- XHTML MP 不支持 <u> 标签
- XHTML MP 的输入字段不支持格式化属性
- XHTML MP 不支持用锚链接发送数据
XHTML MP 不支持 Deck 与 Card
WML 中的 <deck> 和 <card> 元素在 XHTML MP 中已经不存在了. 在 WML 中, 一个文件可以包含一张或多张 card. 它们共同形成了一个 deck. 一个 deck 中所有的 card 都会被一次下载到无线设备上. WAP 浏览器一次显示一张 card , 你可以通过锚链接去其它卡片. 通过使用 deck 和 card, 与服务器的交互得以减少. 从而可能会有很大的性能提高, 因为对无线设备来说, 每次对服务器的请求的滞后性很高.
要在 XHTML MP 中达到类似的功能, 你可以把消息分成多个部分 (多个文档放到一个 HTTP 反馈中). 另一种方式是通过利用目标锚 (目标锚放到页面中的各个位置, 并且将链接定义为流动到相应的目标锚. 更多细节将稍后在 "到当前 XHTML MP 页面的某个地方" 中提到).
XHTML MP 不支持计时器
要在 WML 中使用计时器, 你可以用 <timer> 标签和 ontimer 事件. <timer> 标签和 ontimer 事件在 XHTML MP 中都不被支持.
要在 XHTML MP 中实现类似的功能, 尝试一下 HTTP 刷新, 像这样:
<head>
<meta http-equiv="refresh" content="5;URL=http://www.phparch.cn/" />
...
</head>
在上面的 XHTML MP 例子中, <meta> 元素告诉 WAP 浏览器10秒后转到 URL "http://www.phparch.cn". 要注意的是 WML 计时器只有在用户前进到卡片 (card) 时才会开启, 而 HTTP 刷新计时器无论用户何时到达 XHTML MP 页面都会开启.
关于 HTTP 刷新的更多细节将在稍后的 "XHTML MP 中的间歇性刷新" 中提到.
XHTML MP 不支持事件
XHTML MP 不支持事件. WML 支持四种事件: ontimer, onenterbackward, onenterforward 和 onpick. 就像在上一部分讨论的那样, HTTP 刷新可以模拟 ontimer 事件. 对于其它事件类型, 在 XHTML MP 中没有替代方案. 如果你的移动因特网浏览应用必须用到它们, 那么你不得不考虑用 WML 1.x 取代 XHTML MP.
XHTML MP 不支持变量
在 WML 中, 你可以声明变量并对其赋值. WML 的变量都具有全局范围, 也就意味着你可以在任何 deck 与 card 标签中使用它们. 在 WML 中常见的对变量的使用是用其存储用户输入的数据以免其稍后还要再次输入.
在 XHTML MP 中你无法使用变量. 替代方案是把所有的处理放在服务器端进行. 例如, 如果你想把用户在某一 XHTML MP 页面上输入的数据共享到其它 XHTML MP 页面, 就要把数据发送到并存储在服务器上. 然后服务器可以在必要的时候把用户数据嵌入到 XHTML MP 标记中, 并将其发送到无线设备.
XHTML MP 不支持客户端脚本
在 WML 中, 你可以用一种叫作 WMLScript 的脚本语言, 该语言与 JavaScript 类似. WMLScript 在 WML 中的一种常见应用是验证用户输入的数据.
对于 XHTML MP, 客户端脚本目前是无效的. 替代方案是把所有的处理放在服务器端进行. 例如, 可以把用户数据发送到服务器端处理, 而不是在无线设备上验证用户数据. 如果用户数据格式有误, 超出了有效范围, 或者用户忘记输入某些字段, 服务器会引导用户去一个 XHTML MP 页面来纠正数据.
将来的移动设备将支持一种叫作 ECMAScript 移动概要 (ESMP) 的客户端脚本语言, 该语言被设计用于 XHTML MP 之中. 它支持所有 WMLScript 功能.
可编程软件是 WML 的一个非常棒的特征. WML 的 <do> 标签可以用来对软键编程. 用户可以通过按移动电话上的左软键或右软键非常方便地选择常用选项.
在 XHTML MP 中你无法对软键编程. 一种替代方案是利用 accesskey 属性. accesskey 属性可用于指定键盘快捷键. 锚链接和提交按纽支持 accesskey 属性. 这是一个例子:
<a accesskey="1" href="/p1.xhtml">XHTML MP 教程第一部分</a><br/>
<a accesskey="2" href="/p2.xhtml">XHTML MP 教程第二部分</a><br/>
<a accesskey="3" href="/p3.xhtml">XHTML MP 教程第三部分</a>
如果用户按下键盘上的 "1" 键, WAP 浏览器将直接跳转到 "p1.xhtml". 有了 accesskey 属性, 用户能够通过在 XHTML MP 页面中点击一下就触发某个动作. 这种行为与通过软键所能实现的类似.
WAP CSS 的 -wap-accesskey 属性可用 accesskey 属性的一个替代选项.
在一些诺基亚的 WAP 浏览器上, 所有带有 accesskey 属性指定的键盘快捷键的锚链接和提交按纽都会自动被包含在选项菜单中. 用户可以通过点击左侧的软键来打开选项菜单. 选项菜单中锚链接的标签是被 <a></a> 标签所包围的文本. 对于图片链接和提交按纽, 菜单选项中的标签分别是 <img> 标签的 alt 属性值和 <input> 标签的 value 属性值. 例如:
<a accesskey="0" href="/p1.xhtml">XHTML MP 教程第一部分</a><br/>
<a accesskey="1" href="/p2.xhtml">
<img src="/pic2.gif" height="20" width="20" alt="XHTML MP 教程第二部分" />
</a><br/>
<form action="xhtml_mp_tut.php" method="get">
<p>
你最喜欢本 HTML MP 教程的哪一部分?<br/>
<input type="text" name="tut_part" title="编辑" /><br/>
<input accesskey="5" type="submit" value="提交表单" />
</p>
</form>
在上述 XHTML MP 例子中, 粗体文本在 "选项" 菜单中将变成标签. 如果太长的标签将会被截断.
要注意的是该特征在非诺基亚浏览器上是无效的.
XHTML MP 不支持 <u> 标签
在 WML 中, 标签 <u> 可用来对某些文本加下划线.
标签 <u> 在 XHTML MP 中是不存在的. 要想在 XHTML MP 中对文本加下划线, 你得用 WAP CSS 的 text-decoration 属性. 例如, 要想给所有标题1的文本加下划线, 你可以在你的 XHTML MP 页面的 WAP CSS 样式单中加入输入如下的样式表述:
h1 {
text-decoration: underline
}
XHTML MP 的输入字段不支持格式化属性
在 WML 中, 你可以通过对 <input> 元素的格式属性指定值来限制用户可以在某输入字段中可输入的字符类型和数量.
在 XHTML MP 中, <input> 元素的格式属性已经被删除了. 替代方案是利用 WAP CSS 的 -wap-input-format 属性. -wap-input-format 属性采用了与格式化属性有着相同语法的输入遮罩. 举个例子, 要限制所有输入字段只接受五位数字, 你可以在你的 XHTML MP 页面的 WAP CSS 中输入下面这段样式表述:
input {
-wap-input-format: "5N"
}
你可以从网上找到关于 -wap-input-format 属性的更多资料.
XHTML MP 不支持用锚链接发送数据
在 WML 中, 向服务器提交用户数据是通过锚链接实现的, 像这样:
<p>
你叫什么名字?
<input name="name"/><br />
你最喜欢本 HTML MP 教程的哪一部分?
<input name="tut_part"/><br />
<anchor>
<go method="get" href="/xhtml_mp_tut.php">
<postfield name="name" value="$(name)" />
<postfield name="tut_part" value="$(tut_part)" />
</go>
发送数据
</anchor>
</p>
XHTML MP 不支持通过锚链接发送数据. 必须用提交按纽实现. 下面这段 XHTML MP 标记与前面的 WML 标记做的是同一件事. 关于向服务器提交数据的进一步细节将会在此教程的 "在 XHTML MP 中向服务器提交表单数据" 中讲述.
<form action="xhtml_mp_tut.php" method="get">
<p>
你叫什么名字?<br />
<input name="name" /><br />
你最喜欢本 HTML MP 教程的哪一部分?<br />
<input name="part"/><br />
<input type="submit" value="提交数据" />
</p>
</form>