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>&#x
代表:
通讯录
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>this is data</p></card> ] ]>
浏览器窗口将显示如下内容:
<card name="bogus"><p>this is data</p></card>
格式
定义变量:
$identifier
$(identifier)
$(identifier:conversion)
变量的字符串级别最高,如果遇到相同的字符串,首先被认为是变量。显示$,需要后面在跟一个,$$。例如:
You account has $$
变量名称规则:
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支持WBMP(Wireless 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数或百分比表示。
上面的属性只有alt和src是必须的。其他附加属性基本上仅仅用来指示用户终端,大多数情况下会被忽略。下面是个例子:
<?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>标签一样,用来表明这是一个WML的DECK。xml: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>提供了该DECK的meta信息。
包括一下三种情况
name="name" UP.Link Server忽略meta数据
http-equiv="name" UP.Link Server将meta数据转为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"/>。
此外,如果要为书签指定不同于当前DECK的URL,用<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的内容可能不止一屏显示,注意DECK、CARD和屏幕显示范围的关系。一个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)。当然,这都不是必须的。
id:CARD的名字,在DECK中唯一,可用作URL已进行跳转。
title:CARD的标题,用户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>优先启动。
下面的例子定义在屏幕刷新时重设firstname、lastname和age变量。
<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:值必须为get或post。分别用来产生HTTP的GET和POST请求。若为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、根据URL的ESCAPE规则对参数进行ESCAPE转码,编译成application/x-www-form-urlencoded的MIME类型;
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>元素完成的。比如下面的例子定义了2个CARD,点击第一个CARD里的“click me”链接会跳转到第2个CARD:
<?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> WAP
</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 ---
WAP
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>
- WAP初级教程笔记
- WAP初级教程笔记
- WAP初级教程---WML基础
- Servlet---WAP编程初级教程
- WAP初级教程—事件EVENT
- 学习笔记:axure 初级教程
- 初级教程笔记总结
- wap 开发笔记 (一)
- wap 开发笔记 (二)
- wap初学者笔记
- wap学习笔记
- wap技术笔记
- WAP笔记一
- wap学习笔记1
- wap页开发笔记
- 初级教程
- wap 开发笔记 seafarer777 [原作]
- WAP Pictogram Specification学习笔记
- 补丁备忘 -ATL中文路径支持
- WGET的使用方法与技巧
- 在 CSDN 的 blog 添加时钟、日历、浏览人数计数器和天气查询的方法
- 算法框架
- Eclipse+MinGW+QT开发环境搭建
- WAP初级教程笔记
- 简体中文版Gmail开始增加Chat功能
- 谈谈软件从业学习方向
- WAP常见问题FAQ
- 关于pascal中高精度字符串型数的比较
- SQL Server 2005新特性
- Java中的JDBC连接数据库总结(转)
- 在C#中调用API播放windows声音
- 2005年华为招聘--C语言笔试试题