WAP初级教程笔记

来源:互联网 发布:防爆网络摄像头 编辑:程序博客网 时间:2024/04/29 14:10

WML基本情况
WML
----Wireless Markup Language
WML
XML的子集。WML文件以*.wml命名。WML文件必须满足XML文档的规则。

WML
文档通常使用XML解释器解释。

WML文档编辑环境
编辑器---WML本身是文本,所以任何文本编辑器都可以完成。
模拟器---NOKIA ERICSSON MOTOROLA等都可以。
图形转换--制作适合WAP的图片,pic2wbmp
文字转换--汉字<-->UNICODE UTF-8

WML文件结构
WML文档页面通常叫做桌面(DECK),由一组互相连接的卡片(CARD)组成。
当移动设备访问WML的一个页面,页面所有的CARD都下载到WAP设备里面。CARD的切换由电话内置的设备处理,不再从服务器上取信息了。
CARD
可以包含文本、标记、链接、输入控制、任务(TASK)、图像等等。

文档包含在下面的格式里面:
实体--<xml>...</xml>
CARD
--
<card>...</card>
文字--<p>...</p>

简单例子:
<?xml version="1.0"?>
<!DOCTYPE wml PUBLIC "-//WAPFORUM//DTD WML 1.1//EN"
  "http://www.wapforum.org/DTD/wml_1.1.xml">

<wml>
<card id="HELLO" title="HELLO">
 
<p>
 
Hello world!
 
</p>
</card>
</wml>

显示结果如下:
------ HELLO ------
Hello World! 

WML字符集:
WML
XML的子集,继承了XML的字符集设置。
WML
文档缺省的字符集是UTF-8
要显示中文有两种方式:
1
、在前面指定字符集,但是目前不支持,具有关人士说,CDMA的手机都已经基本上支持;
<?xml version="1.0" encoding="gb2312"?>
2
、使用UNICODE代码来代表中文:
<b>&#x901A;&#x8BAF;&#x5F55;</b>
代表:
通讯录

WML元素:标记(Tag)和属性
由于标记会降低WAP设备的通讯速度,所以WML标准里面仅仅使用了很少的一部分,大部分还是文本。
用于表格和图像的标记基本上都被忽略了。

<tag>内容</tag> 例如:<p>Hello world!</p>

<tag/>
例如:<br/> <go href="#done"/>

WML同样支持标志中标出属性。属性不在屏幕上显示出来。

WML标记和属性的值都是大小写敏感的(<xml><XML>是不一样的),而且标记必须严格按照xml的标准结束。
WML
要求属性的值必须放在双引号或者单引号内。单引号可放在属性标志内或者双引号内。
字符也可以为属性的值。

WML注释
XML支持的注释格式:
<!You can not see this missage--->
WML
不支持嵌套元素注释。

链接(URL
WML
外部引用方式跟HTML相同
http://www.wap86.net/great.wml

http://www.wap86.net/great.wml#login
如果是内部引用,如果next是当前的DECK中的一个CARD时,可以使用这种方式:

#next
提供链接的WML元素有2个:<go><anchor>

CDATA
XML
支持CDATA的概念,显示不需要解释的文本信息。
<! [CDATA [ <card name="bogus"><p&gtthis is data</p></card> ] ]>
浏览器窗口将显示如下内容:
<card name="bogus"><p>this is data</p></card>

 格式 
定义变量:

$identifier
$(identifier)
$(identifier:conversion)


变量的字符串级别最高,如果遇到相同的字符串,首先被认为是变量。显示$,需要后面在跟一个,$$。例如:

You account has $$1650.00 in it.


变量名称规则:
1
、变量名是由US-ASCII码、下划线和数字组成;
2
、只能以US-ASCII码开头;
3
、变量名大小写敏感。
注意:
1
WML变量没有类型,均表示为字符串;
2
、变量没有被赋值的时候,内容为空,即空字符串。
3
、可以在运行过程中改变它的值。

创建变量
最简单的方法是使用<setvar>元素,语法如下:

<setvar name="string" value="string" />


<setvar>
只能在<go><prev><refresh>中使用。
下例定义了一个叫vNAME的变量并赋值为“Jeff”

<setvar name="vNAME" value="Jeff" />


另外,还可以在<input><select><postfield>中定义变量。

替换文本 
变量可以用作替换用途,但只能在文本类型(如显示字符、URL等)中使用。
任何元素和属性都不能使用变量来替代。例如:

Hello, $vNAME.

将显示:

Hello, Jeff.


ESCAPE
转换
前面说过变量可以用作替换用途,但是在URL中使用时,变量的内容必须遵守[RFC2396]标准。
这个标准规定某些特殊字符在URL里使用的时候必须用特殊表示方法,即ESCAPE八进制表示。
例如:

list.asp?id=3

URL中要表示为:

list.asp%3fid=3


所以变量有可能需要标志为是否对其内容进行ESCAPE转换,变量定义就有如下几种特殊方式:

效果

表达方式1

表达方式2

表达方式3

对变量中ESCAPE字符进行转换

$(var:e)

$(var:E)

$(var:escape)

不进行ESCAPE转换

$(var:u)

$(var:U)

$(var:unesc)

变量中没有ESCAPE字符

$(var:n)

$(var:N)

$(noesc)


给变量进行ESCAPE转换是WML的默认方式。

CARD里可以显示象文本、图像这样的内容。

段落与换行标记
<p>
段落标记,用来对段落进行分段。语法:

<p
  aligh="left|right|center"
  mode="wrap|nowrap";
  xml:lang="STRING" >

aligh:文字对齐方式,左(left)、右(right)、居中(center)。
mode
:文字超出屏幕时是否折行,各种终端处理方式不同。
xml:lang
:显示语言编码。

<br>行分隔标记,产生回车效果。
语法:

<br
  xml:lang="STRING" />


xml:lang
显示语言编码。
段落和换行的例子:

<?xml version="1.0"?>
<!DOCTYPE wml PUBLIC "-//WAPFORUM//DTD WML 1.1//EN"
 "http://www.wapforum.org/DTD/wml_1.1.xml">

<wml>
<card title="Paragraphs">
<p>
This is a paragraph
</p>
<p>
This is a another<br/>with a line break
</p>
</card>
</wml>


显示结果如下:

------ Paragraphs ------
This is a paragraph
This is another
with a line break

标记

字体样式

<b>

粗体 

<big>

大字体

<em>

强调字体

<i>

斜体

<small>

小字体

<strong>

加重强调字体

<u>

下划线字体


文字样式标记
WML
提供了一系列文字样式的标记,如右表所示。不过WML鼓励大家尽量使用<strong><em>标记,因为某些WAP终端会忽略其他标记。
每个文字样式标记语法都一样,都有一个标志语言代码的xml:lang属性。
下面是一个例子:



<?xml version="1.0"?>
<!DOCTYPE wml PUBLIC "-//WAPFORUM//DTD WML 1.1//EN"
  "http://www.wapforum.org/DTD/wml_1.1.xml">

<wml>
<card title="Formatting">
  <p>
   normal<br/>
   <em>emphasized</em><br/>
   <strong>strong</strong>
   <br/> <b>bold</b> <br/>
   <i>italic</i><br/>
   <u>underline</u><br/>
   <big>big</big><br/>
   <small>small</small>
  </p>
</card>
</wml>

在你的终端上可能会有这样的显示:

list.asp%3fid=3


所以变量有可能需要标志为是否对其内容进行ESCAPE转换,变量定义就有如下几种特殊方式:

----- Formatting -----
normal
emphasized
strong
bold

italic

underline

big

small


表格
WML
支持简单的表格标记<table><tr><td>。语法如下: 

<table
  align="L|R|C"
  columns="NUMBER"
  TITLE="STRING"
 <tr>
  <td> 内容... </td>
  其他列...
 </tr>
  其他行...
</table>

 

WML里定义一个表格必须先指定列数,即columns属性。而在表格里就必须有相应数量的<td></td>标记对。因该注意的是,align(对齐)属性的内容只能是L(左对齐)、R(右对齐)和C(居中),跟其他标记不同(是不是有点怪?)。

下面的例子演示了表格的基本功能:

<?xml version="1.0"?>
<!DOCTYPE wml PUBLIC "-//WAPFORUM//DTD WML 1.1//EN"
  "http://www.wapforum.org/DTD/wml_1.1.xml">

<wml>
<card title="SALARY">
<p>
<table columns="2">
<tr>
<td>NAME</td>
<td>PAYED</td>
</tr>
<tr>
<td>Johnson</td>
<td>$7810.11</td>
</tr>
<tr>
<td>Faye</td>
<td>$8912.00</td>
</tr>
</table>
</p>
</card>
</wml>


显示结果(注意WML里没有表格线):

------ SALARY ------
NAME
    PAYED
Johnson
   $7810.11
Faye
    $8912.00


图像

WML支持WBMPWireless Bitmap)格式的图像,需要用特殊工具制作。
显示图像使用<img>标记,语法如下:

<img
 alt="STRING"
 src="STRING"
 align="top|middle|bottom"
 height="NUMBER"
 width="STRING"
 hspace="NUMBER"
 vspace="STRING"
 localsrc="STRING" />

 

alt 图像无法显示时的替换文字。
src
图像的url
localsrc
储存于ROM(或RAM)中图像的名字,各种终端支持不同。
align
上下对齐方式。
height
图像显示高度。
width
图像显示宽度。
hspace
图像左右的空白,以pixel数或百分比表示。
vspace
图像上下的空白,以pixel数或百分比表示。

上面的属性只有altsrc是必须的。其他附加属性基本上仅仅用来指示用户终端,大多数情况下会被忽略。下面是个例子:

<?xml version="1.0"?>
<!DOCTYPE wml PUBLIC "-//WAPFORUM//DTD WML 1.1//EN"
 "http://www.wapforum.org/DTD/wml_1.1.xml">

<wml>
<card title="Congratulation">

<p>
WAP86, <img src="wonderful.wbmp" alt="wonderful"/>!
</p>

</card>
</wml>


下面分别是在支持和不支持图像的终端上的显示结果:

--- Congratulation ---
WAP86, !

--- Congratulation ---

WAP86, wonderful!

桌面 (DECK)

由于网络带宽以及某些WAP服务器DECK传输的限制,DECK越小越好,最好不要超过1.2K
如果DECK很复杂那就分成多个DECK完成。

完整的WML文档结构如下:

<?xml version="1.0"?>
<!DOCTYPE wml PUBLIC "-//WAPFORUM//DTD WML 1.1//EN"
  "http://www.wapforum.org/DTD/wml_1.1.xml">

<wml>
  <head>
   .
   . 头信息......
   .
  </head>
  <template>
   .
   . 模板定义......
   .
  </template>
  <card>
   .
   . 内容......
   .
   </card>
   .
   . 其他card(可有可无)......
   .
</wml>



XML
说明
DECK开头必须指明以下的XML类型声明:

<?xml version="1.0"?>
<!DOCTYPE wml PUBLIC "-//WAPFORUM//DTD WML 1.1//EN"
  "http://www.wapforum.org/DTD/wml_1.1.xml">

第一行指出XML版本,紧跟的文档类型(DOCTYPE)声明指出所引用的语言标准定义。
这两句的位置和顺序不可更改,而且中间不能有空行。

<wml>
语法
<wml>标签和HTML中的<html>标签一样,用来表明这是一个WMLDECKxml:lang属性来指定文档的语言,比如<wml xml:lang="zh">表示文档语言为中文。

<head>
<head>
标签包含了该DECK的相关信息。<head>标签之间可以包含一个<access>标签和多个<meta>标签。

<access>

<access
   domain="STRING"
   path="STRING" />

<access>相当于HTML中的<BASE>标签,指定该DECK的访问控制信息,它的两个属性是可选的。

domain:指定域,默认值为当前域。
path
:指定路径,默认值为"/",即根目录。

<meta>语法:

<meta
   http-equiv="STRING" | name="STRING"
   forua="true|false"
   content="STRING"
   scheme="STRING" />

HTML<META>的类似,<meta>提供了该DECKmeta信息。
包括一下三种情况
name="name" UP.Link Server
忽略meta数据
  http-equiv="name" UP.Link Servermeta数据转为HTTP响应头(HTML) 
  user-agent="agent" UP.Link Server直接将meta数据传给手机设备

content
属性也是必选的,其内容根据属性而定。scheme属性目前尚不支持。forua为可选属性,指定在该wml文件传到客户端之前,<meta>标签是不是被中间代理删除(因为传输的协议可能改变),默认值为false

目前支持的meta数据:
  <meta http-equiv="Cache-Control" content="max-age=3600"/>指定DECK在手机内存缓存中的存储时间段,默认的为30(除非内存耗尽),在该期间,手机对于访问过的DECK直接从缓存里调用。如果信息是对时间敏感的,可以用max-age指定DECK在缓存里的生存期,最小单位是秒,如果指定为0,则每次都需通过连接服务器来调用该DECK

  <meta user-agent="vnd.up.markable" content="false"/><meta user-agent="vnd.up.bookmark" content="指定的URL"/>类似于普通浏览器的书签功能。
当用户将一个CARD做了书签后,手机浏览器首先用一个标记记录该CARD,这个标记默认的是<card>标签中的title属性(以后会讲到),然后当用户选择了该书签以后,浏览器就会打开被记录的URL
但是因为在默认的情况下,手机会记录所有的DECK,所以,一般<meta>被用来使手机不要记录当前的URL,即<meta user-agent="vnd.up.markable" content="false"/>
此外,如果要为书签指定不同于当前DECKURL,用<meta user-agent="vnd.up.bookmark" content="指定的URL"/>

<template>
<template>
元素声明一个DECK级的事件/请求,对DECK页面中所有CARD有效,当然某个CARD可以通过定义同名的事件来替代<template>声明中的事件处理。

语法:

<template
   onenterforward="STRING"
   onenterbackward="STRING"
   ontimer="STRING" />

onenterforward:当用户通过<go>进入CARD时调入的链接。
onenterbackward
:当用户通过<prev>退回CARD时调入的链接。
ontimer
<timer>事件激活时调入的链接。

例子:

<wml>
<template>
  <do type="options" name="do1" label="default">
  <prev/>
  </do>
</template>
<card id="first">
  <!-该卡片将自动套用模块中定义的事件处理过程-->
  
  </card>
<card id="second">
  <!-使用空操作(noop)来屏蔽模块中定义的事件处理过程->
  <do type="options" name="do1">
   <noop/>
  </do>
  
</card>
<card id="third">
  <!-该卡片使用同名的事件处理替代模块中提供的事件处理->
  <do type="options" name="do1" label="options>
   <go href="/options"/>
  </do>
</card>
</wml>

<card>
一个DECK可以包含多个CARD,每个CARD的内容可能不止一屏显示,注意DECKCARD和屏幕显示范围的关系。一个CARD<card></card>包含。

语法:

<card
  id="STRING"
  title="STRING"
  newcontext="true|false"
  ordered="true|false"
  onenterforward="STRING"
  onenterbackward="STRING"
  ontimer="STRING"
  xml:lang="STRING">

每个CARD元素可以有一个标号(ID)和标题(TITLE)。当然,这都不是必须的。

idCARD的名字,在DECK中唯一,可用作URL已进行跳转。

titleCARD的标题,用户BOOKMARK一个CARD时的名字。该属性在某些用户终端上会显示出来。

newcontext:用来指示当跳转到本CARD时,用户终端(手机、模拟器等)是不是要清除以前保留的信息如变量、堆栈历史记录、终端状态等。默认值为FALSE

ordered:表明该CARD里的内容是按固定的顺序显示,还是按用户的选择来显示。默认值是TRUE。这点和HTML不同,CARD页面里的内容可以按一定的顺序显示,默认的是按线性顺序显示,即按代码的顺序,但是,要注意的是,以下三个标签必须按以下顺序来写<onevent> <timer> <do>。这样做是为了方便填表单,当ordered设置为true时,如果一个表单的内容不能在一屏里显示完,就分成多屏显示;当ordered设置为false时,手机可以显示一个概要CARD来总结有效的选项,用户可以从中选取表单选项来填写。

onenterforward:当用户通过<go>进入CARD时调入的链接。
onenterbackward
:当用户通过<prev>退回CARD时调入的链接。
ontimer
<timer>事件激活时调入的链接。

不同浏览器指标

 >

Nokia 7110>

Ericsson R320>

Ericsson R380>

UP.Browser>

CARD最大字节数>

1397 字节>

3000 字节>

3800 字节>

1492 字节>

图象最大字节数>

1397 字节>

3000 字节?>

3800 字节?>

1492 字节?>

显示行数>

4 (含标题行)>

5>

7>

视终端不同>

S3568i:6>

显示列数>

19>

14>

不知道>

视终端不同>

显示宽度(象素)>

95>

101>

304>

视终端不同>

显示高度(象素)>

45>

52>

98>

视终端不同>

象素比例>

1:1.25>

不知道>

1:1.23>

视终端不同>

字体>

>

Small, Bold, Emphasis, Strong>

Small, Big, Bold, Italic, Emphasis, Strong>

Small, Big, Bold>

文字位置>

没有,强制居左>

居左、居中、居右>

居左、居中、居右、段落缩进>

不知道>

图象位置>

强制居左>

不知道>

不知道>

不知道>

表格支持>

不支持>

最多5x5>

不知道>

不知道>

触摸屏>

>

>

>

>

图标键>

>

>

>

不知道>

WML页面内拨号>

"提取号码" 功能>

通过WTAI支持>

通过WTAI支持>

3.1以上版本的浏览器支持>

输入>

在行内输入>

在设置位置输入>

在设置位置输入>

不知道>

输入格式>

只有大小写>

不知道>

不知道>

不知道>

图形链接>

>

>

>

不知道>

链接格式>

在行内>

在设置位置>

在设置位置>

不知道>

DECK下载顺序>

文字,然后图形,再开始选择性计时>

文字,开始选择性计时,然后是图(结果有可能是CARD还未下载完毕就已过时)>

不知道>

 >

HTTP Redirect>

支持>

支持>

支持>

支持>

 

没有结构和进程就没有程序。在WML中定义进程有很多方法,最简单的就是任务。

WAP1.1
定义了几种类型的任务,任务通过对事件的响应改变程序的运行顺序。有四种WML任务:·  <noop>
·  <prev>
·  <refresh>
·  <go>

<noop>
这个任务不做任何事情,一般用于屏蔽DECK级事件,语法非常简单:

<noop/>


<prev>
当用户激活该任务时,终端就转回上次用户访问过的URL。语法如下:

<prev>
   <setvar>
   ......
</prev>


如果<prev>中包含了<setvar>元素,就会优先处理。
下面例子定义了一个只有Back按钮的的DECK,按下以后会返回前面看过页面。

<?xml version="1.0"?>
<!DOCTYPE wml PUBLIC "-//WAPFORUM//DTD WML 1.1//EN"
"http://www.wapforum.org/DTD/wml_1.1.xml">

<wml>
<card>
  <p>
   <anchor>
    Back
    <prev/>
   </anchor>
  </p>
</card>
</wml>

<refresh>
当用户激活该任务时,就执行一个刷新过程。如果这个任务里使用<setvar>定义了变量,变量值将被重新设置。语法如下:

 

<prev>
   <setvar>
   ......
</prev>

如果当前CARD含有<timer>元素,那么在刷新时<timer>优先启动。
下面的例子定义在屏幕刷新时重设firstnamelastnameage变量。

<do type="refresh">
  <refresh>
   <setvar name="firstname" value="david">
   <setvar name="lastname" value="smith">
   <setvar name="age" value="29">
  </refresh>
</do>

<go>
当用户激活该任务时,就引导用户去WML中指定URL,可以是服务器上其他的DECK,也可以是本DECK中其他的CARD。语法如下:

<go
   accept-charset="STRING"
   href="URL"
   method="post|get" sendreferer="true|false" >
   <postfield>, <setvar>......
</go>

href:必选属性,指向一个合法URL。如果是其他的DECK,则该DECK的第一个CARD会显示出来。如果是本DECK中的其他CARD,而历史堆栈里保存的是最新数据的话,则堆栈保持不变,直接调入该CARD

sendreferer:如果为true,用户主体信息(USER AGENT)必须传送给WAP网关。传送时使用HTTP的提交头信息,即尽可能简短的相对URL。这个属性可以用来给服务器控制存取URL的权力。默认值为false

Method:值必须为getpost。分别用来产生HTTPGETPOST请求。若为get,则在URL中列出参数,例如:“http://www.wap86.net/bob.cgi?argone=one”;若为post,则数据在请求内部传送,不需要在URL中列出。

Accept-charset:指定字符集名称列表,服务器在接受<go>的时候必须接受这个编码规则。默认值为unknown。具体内容这里不作解释,在以后的高级教程中描述。

下面是一个简单的例子:

<go href="../topic.wml" sendreferer="true">


<postfield>
<postfield>
并不是一个任务,但是跟<go>任务有关,所以在这里介绍。它用来定义名称/对以便通过<go>向服务器发送HTTP请求。语法如下:
当用户激活该任务时,就引导用户去WML中指定URL,可以是服务器上其他的DECK,也可以是本DECK中其他的CARD。语法如下:
下面是一个简单的例子:

<postfield name="STRING" value="STRING" />

当一个含有<postfield>的任务被执行的时候,终端要完成这样一个过程:

1、识别名称/对并准备参数变量;
2
、参数变量转换成正确的字符集;
3
、根据URLESCAPE规则对参数进行ESCAPE转码,编译成application/x-www-form-urlencodedMIME类型;
4
、根据method指定的请求模式提交任务。

下面的例子演示get模式的用法:

<go href="../news.asp" sendreferer="true" method="get">
  <postfield name="newstype" value="technology"/>
  <postfield name="newstext" value="wml"/>
</go>


服务器将收到这样的get请求:

GET ../news.asp?newstype=technology&newstext=wml HTTP/1.1
.
.
其他HTTP头信息
.


如果把前面的请求模式改成post,则同样的<go>任务产生的这样的post请求:

POST../news.asp HTTP/1.1
content-type="xxx-urlencoded" .
.
其他HTTP头信息
.
newstype=technology&newstext=wml

 

任务必须绑定倒某个事件上才能做一些有用的事情。
事件发生--〉任务执行,这才是完整的进程控制。

4个元素可以帮助你完成事件对任务的绑定:<anchor><onevent><timer><do>

<anchor> 链接
HTML一样,WML也可以定义到其他程序的链接。在HTML中,链接通常用下划线和特殊颜色的方式表示跟其他内容的区别。在WAP终端上则没有严格的规则说如何表示一个链接,一般采用反白的显示方式。

<anchor>
的语法如下:

<anchor
   title="STRING"
   xml:lang="STRING"
>
  <br>, <go>, <img>, <prev>, <refresh>, TEXT
</anchor>

title:链接的标题;
xml:lang
:语言编码。

在这种定义方式中,实际上链接一般是通过<anchor>中包括的<go>元素完成的。比如下面的例子定义了2CARD,点击第一个CARD里的“click me”链接会跳转到第2CARD

<?xml version="1.0"?>
<!DOCTYPE wml PUBLIC "-//WAPFORUM//DTD WML 1.1//EN"
  "http ://www.wapforum.com/DTD/wml_1.1.xml">

<wml>
<card id="Hello" title="Hello">
  <p>Hello,
  <anchor>click me
   <go href="#bye"/>
  </anchor>
  </p>
</card>

<card id="bye" title="Bye">
  <p>Bye, guys</p>
</card>
</wml>

 

点击前显示:

点击后显示:

------- Hello -------
Hello,

-------- bye --------
Bye, guys

链接还有一种短格式,语法如下:

<a
   href="STRING"
   title="STRING"
   xml:lang="STRING"
>
  <br>, <img>, TEXT
</a>

除了跟原来一样的两个属性以外,多了href属性,可以对它直接指定URL。例如下面的例子定义了一个带有图像的链接:

<a title="HotBars" href="wap.hucn.com/HotBars.wml">
  <img src="hot.wbmp" alt="Hot Bars" />
</a>

除了跟原来一样的两个属性以外,多了href属性,可以对它直接指定URL

<onevent>
固有事件
WML
定义了4种由用户终端触发的固有事件:

oneventforward:当用户被<go>任务或其他机制(如一个SCRIPT过程)引导到一个CARD时触发;
oneventbackward
:当用回被<prev>或其他机制(如在设备上按BACK按钮)引导到一个CARD时触发;
ontimer
:当TIMER计时结束时触发。定义TIMER计时器可以使用<timer>元素,见下一节;
onpick
:当用户按下一个<option>选项时触发(可以是选中或取消选择)。

把这些事件绑定到一个任务要使用<onevent>元素,它的语法如下:

<onevent
  type="oneventforward | oneventbackward | ontimer | onpick"
>
  <go>, <noop>, <prev>, <refresh>
</onevent>

下面的例子演示了如何使用固有事件在CARD调入时清空变量。

<?xml version="1.0"?>
<!DOCTYPE wml PUBLIC "-//WAPFORUM//DTD WML 1.1//EN"
 "http://www.wapforum.org/DTD/wml_1.1.xml">

<wml>
<card id="card1">
  <onevent type="oneventforward">
  <refresh>
   <setvar name="firstname" value=""/>
   <setvar name="lastname" value=""/>
  </refresh>
  </onevent>
  <p>
   You have no name!
  </p>
</card>
</wml>

<timer> 计时器
看名字就知道,这是个计时器,它在经过规定的计时时间以后产生一个任务。<timer>计时器只在所属CARD里有效:当进入CARD时,计时器开始工作;时间一到,触发任务;如果离开CARD,计时器停止。语法如下:

<timer
 name="STRING"
  value="NUMBER"
/>

name:可选。指定一个包含计时时间的变量,在计时器开始工作以后,变量的值会逐渐减少。如果这个变量在<timer>之前就已经存在并且赋值为一个非负整数,那后面value属性的值会被忽略,直接使用变量里的值作为计时时限。
value
:必选。指定计时时间,以1/10秒为单位。

下面的例子每隔1秒显示不同的文字(当然,你有兴趣改成图像也可以)。

<?xml version="1.0" standalone="yes"?>
<!DOCTYPE wml PUBLIC "-//WAPFORUM//DTD WML 1.1//EN" "http://www.wapforum.org/DTD/wml_1.1.xml">
<wml>
<head>
 <meta content="WML Editor 3.2" name="generator" />
</head>
<card id = "hello" title = "Hello">
 <onevent type = "ontimer">
  <go href = "#card2"></go>
 </onevent>
 <timer value = "10" />
 <p> Hello!</p>
</card>

<card id = "card2" title = "card2">
 <onevent type = "ontimer">
  <go href = "#card3"></go>
 </onevent>
 <timer value = "10" />
 <p>R U tired?</p>
</card>

<card id = "card3" title = "card3">
 <onevent type = "ontimer">
  <go href = "#hello"></go>
 </onevent>
 <timer value = "10" />
 <p>Take a rest!</p>
</card>

</wml>

 

显示结果如下,注意会不断循环。

 

Sport选择:

1

2

3

------ Hello ------
Hello!

----- Take care ----
R U tired?

------- Rest -------
Take a rest!

还有一个例子,通常用来做网站封面,显示一段欢迎词以后进入正式内容。这里没有使用图片,各位可以自己加上试试看。

<?xml version="1.0"?>
<!DOCTYPE wml PUBLIC "-//WAPFORUM//DTD WML 1.1//EN"
  "http://www.wapforum.org/DTD/wml_1.1.xml">

<wml>

<card id="Welcome to WAP86" ontimer="wap86.wml">
  <timer value="30"/>
  <p>
   Hello!
   Welcome to WAP86 - the paradise of WML developers.
  </p>
</card>

</wml>

 

部件

功能

accept

确认,接受输入

prev

退回历史页面访问堆栈里上一个CARD

help

上下文关联的帮助信息

reset

重设设备状态

options

上下文关联的选项或附加操作

delete

删除当前内容或选择

unknown

由开发者自己定义

<do> 用户触发事件
每个WAP终端都预定义了一系列用户界面部件,如手机上的按钮、触摸屏上的图表、声音指令或者其他一些很容易是别的部件。WML1.1定义了右面那些WAP兼容终端必须支持的部件。但是要说明的是,只有prev有预先定义的功能,其他的只是概念上的定义,需要根据开发者激活并赋予一定的动作。

当用户激活这些部件的时候会产生相应的事件。你可以使用<do>元素捕获这些事件并对其做出反应。下面是<do>的语法:

<do
 type="accept | prev | help | reset | options | delete | unknown"
  lebel="STRING"
  name="STRING"
  optional="true | false"
  xml:lang="STRING"
>
<go> | <noop> | <prev> | <refresh>
</do>

type:必选属性,内容只能是那7种;
label
:用户接口部件的显示标签。如果终端不能显示则被忽略。WML1.1建议此属性长度限制在6个英文字符以内;
name
:标志事件/任务绑定关系的唯一名称(在CARD范围内)。CARD级的<do>事件替换同名的DECK<do>事件(见下一节)。如果不指定name属性或name为空字符串,则name默认为type的类型;
optional
:告诉终端此软按钮在屏幕中是否显示。如果此值设为true,则忽略本<do>元素。默认值为false
xml:lang
任务:语言代码。

跟其他事件/任务绑定关系一样,<do>里的任务定义必须是<go><noop><prev><refresh>中的一个。
下面例子演示了<do>的使用方法。用户按了不同的按钮会被导向不同的CARD

<?xml version="1.0"?>
<!DOCTYPE wml PUBLIC "-//WAPFORUM//DTD WML 1.1//EN"
  "http://www.wapforum.org/DTD/wml_1.1.xml">

<wml>

<card id="Card1" title="WAP86 Links">
  <do type="accept" label="Links" optional="false">
    <go href="#Links"/>
  </do>
  <do type="help" label="Help" optional="false">
    <go href="#Help"/>
  </do>
 <p> WAP86’s perfect links</p>
</card>

<card id="Links" title="WAP86 Links">
  <p> Select one:<br><br>
   <a href="wap.hucn.com">hucn</a><br>
   <a href="wap.hucn.com">hucn</a>
  </p>
</card>

<card id="help" title="Help">
  <do type="accept" label="Links" optional="false">
   <go href="#Links"/>
  </do>
  <p>
    Select "Links" button to view the links.
  </p>
</card>

</wml>

 

显示结果

主画面

按下“Links”按钮以后:

按下“Help”按钮以后:

---- WAP86 Links ---
WAP86’s perfect links

Links
     Help

---- WAP86 Links ---
Select one:

>[ WAP86 ]
[ AT86 ]

------- Help -------
Select "Links" button to view the links.

Links

DECK级事件
前面已经讲过可以用<template>元素定义DECK级事件,做法跟CARD级事件一样,只要在<template>元素里包含<do><onevent>事件就可以。这种做法可以定义一些在每个CARD里都需要定义的事件,而不需要重复说明。
比如下面的例子给所有的CARD定义了BACK按钮以便返回上一页:

<?xml version="1.0"?>
<!DOCTYPE wml PUBLIC "-//WAPFORUM//DTD WML 1.1//EN"
  "http://www.wapforum.org/DTD/wml_1.1.xml">

<wml>

<template>
  <do type="prev" label="BACK" optional="false">
   <prev/>
  </do>
</template>

<card id="Links" title="WAP86 Links">
  <do type="help" label="Help" optional="false">
   <go href="#Help"/>
  </do>
  <p> Select one:<br><br>
   <a href="wap.hucn.com">hucn</a><br>
   <a href="wap.hucn.com">hucn</a>
  </p>
</card>

<card id="help" title="Help">
  <do type="accept" label="Links" optional="false">
   <go href="#Links"/>
  </do>
  <p>
   Select "Links" button to view the links.
 </p>
</card>

</wml>

原创粉丝点击