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