??xml version="1.0" encoding="utf-8" standalone="yes"?>亚洲日韩VA无码中文字幕,亚洲人成色77777在线观看大,亚洲剧场午夜在线观看http://m.tkk7.com/zhyiwww/category/12771.htmlzhyiwwwzh-cnTue, 27 Feb 2007 11:14:10 GMTTue, 27 Feb 2007 11:14:10 GMT60W五?WMLScript脚本E序设计Q上Q(转蝲Q?/title><link>http://m.tkk7.com/zhyiwww/archive/2006/07/05/56786.html</link><dc:creator>zhyiwww</dc:creator><author>zhyiwww</author><pubDate>Wed, 05 Jul 2006 07:52:00 GMT</pubDate><guid>http://m.tkk7.com/zhyiwww/archive/2006/07/05/56786.html</guid><wfw:comment>http://m.tkk7.com/zhyiwww/comments/56786.html</wfw:comment><comments>http://m.tkk7.com/zhyiwww/archive/2006/07/05/56786.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://m.tkk7.com/zhyiwww/comments/commentRss/56786.html</wfw:commentRss><trackback:ping>http://m.tkk7.com/zhyiwww/services/trackbacks/56786.html</trackback:ping><description><![CDATA[ <div align="center"> <h1 class="aTitle">W五?WMLScript脚本E序设计Q上Q?/h1> </div> <table width="97%" align="center"> <tbody> <tr> <td width="120">[日期Q?span id="TimeLabel">2004-11-23</span>]</td> <td align="middle">来源Q?span id="SourceLabel"><a target="_blank">赛_|?/a></span>  作者:<span id="AuthorLabel"></span></td> <td align="right" width="100">[字体Q?a href="javascript:ContentSize(16)">?/a><a href="javascript:ContentSize(14)">?/a><a href="javascript:ContentSize(12)">?/a>] </td> </tr> </tbody> </table> <div id="91rddx3" class="content" id="BodyLabel" style="PADDING-RIGHT: 10px; DISPLAY: block; PADDING-LEFT: 10px; PADDING-BOTTOM: 0px; PADDING-TOP: 0px">作ؓ一U编辑语aQWMLScript提供了强大的函数、语句和库功能,以及外部~辑、访问控制等支持Q同时对E序q行中可能生的错误l出了检手D和具体的解军_法。这些内容属于WMLScript的脚本程序设计知识和q一步的~程规定Q我们本章就Ҏq行详细介绍?br /><br /><b>5.1 语句</b><br /><br />前面我们学习了变量、操作符和表辑ּQ但仅由q些内容q不能完成某个完整的功能Q因Z们不能Ş成完整的操作或处理程序。变量就如同与严重的单词Q表辑ּ如语a中的词组Q他们都不能表达一个完整的意思;只有语句Q是语言中完整的句子Q能够表辑֮整的意思ƈ实现某个完整的功能。WML Script提供了丰富的语句功能Q用这些语句我们可以在WML的卡片中建立交互功能和其他需要的复杂功能?br /><br />在WML Script中,每条语句的后面都需要以一个分PQ)l尾。ؓ了养成严谨的~程风格Q徏议大家编写脚本时Q语句后一定要加上分号Q;Q,q也有助于我们Ş成一U良好的~程习惯?br /><br />WML Script语句的书写和排列格式比较自由。我们可以在同一E序行中q箋写上多个语句Q也可以把同一语句分成多行排列。WML Script根据分PQ)来确定语句的具体内容?br /><br />WML Script的语句主要包括两cR第一cL基本语句Q如I句、表辑ּ语句、块语句、变量语句和return语句{;W二cL条g语句Q如if语句Q第三类是@环语句,如while语句、for语句、break语句和continue语句{。下面我们分别讲解这些语句的语法、功能和使用Ҏ?br /><br />5.1.1 基本语句<br /><br />WML Script基本语句主要用于E序格式控制和变量声明,其中有些语句我们已经不太陌生了?br /><br />I?br /><br />I句用于定义一个空的程序行Q它没有M标识W和操作W,也不执行M操作。它只是以分PQ)l束。其语法格式为:<br /><br />Q?br /><br />昄Q空语句是一U十分特D的语句。由是我们ؓ了让E序h更好的可L,通常在程序中的适当地方加上几个I句,以v到分隔或H出的作用。例如,下面的几行程序中含有一个空语句Q?br /><br />str="Hello";<br /><br />val=25;<br /><br />;<br /><br />MyVal=val*val+5;<br /><br />alert("Hi,Hi!!!");<br /><br />再如Qwhile语句用于判断一个条件ƈ在条件满的时候执行相应的dQ但如果希望条g满的时候什么也不作Q那么就可以l它配上一个空语句Q之条件满的执行I操作:<br /><br />whileQ!poll(device)Q?<br /><br />q实际上是while语句和空语句l成的两条语句。其中的分号Q;Q在q里׃表了I句。这两条语句的作用是在poll()函数为真Q)之前一直等待?br /><br />表达式语?br /><br />表达式语句用于向变量赋|或进行数学计,或进行函数调用。表辑ּ语句也是我们最常用的一U语句,语法格式为:<br /><br />表达式;<br /><br />下面几行E序都是合法的表辑ּ语句Q?br /><br /><table cellspacing="0" cellpadding="0" width="580" border="0"><tbody><tr><td class="code" bgcolor="#e6e6e6"><strong>str="Hey"+yourName;<br />val3=prevVal+4<br />counter++;<br />myValue1=counter,myValue2=val3<br />alert("Watch out!");<br />retVal=16*Lang.max(val3,counter);</strong></td></tr></tbody></table><br /><br />块语?br /><br />块语句用两个花括号Q{ }Q包含一个语句集QŞ成一个语句体。WML Script的许多语句都需要用块语句来实现语句体Q快语句的语法格式ؓQ?br /><br />{<br /><br />语句列表Q?br /><br />}<br />下面的简单程序就是用块语句的例子:<br /><br /><br />}<br />vari=0;<br />var x=Lang.abs(b);<br />popUp("Remember!");<br /><br />}<br /><br />变量语句<br /><br />变量语句用于生命变量q可q行变量的初始化赋倹{如果用户不赋|那么WML Script会自动将变量语句生命的变量赋予一个空字符Ԍ""Q。基本的语法格式为:<br /><br />var 变量?<br /><br />如果像一ơ生命多个变量,则相d量名之间使用逗号Q,Q间隔,其语法格式ؓQ?br /><br />VAR 变量?Q变量名2......Q变量名n;<br /><br />如果惛_生命变量时同时初始化变量Q则可按如下语法格式书写Q?br /><br />var 变量?初始?br /><br />Z于大家更好的掌握变量语句Q我们给Z个多Z用该语句的程序: <table cellspacing="0" cellpadding="0" width="580" border="0"><tbody><tr><td class="code" bgcolor="#e6e6e6"><strong><br /><br />function count(stu){<br /><br />var result=0; //声明变量的同时初始化变量<br /><br />while(str!=""){<br /><br />var ind=0; //每次循环都初始化一?br /><br />// 为退出@环,本块语句内应当提供修改变量str值的语句<br /><br />}Q?br /><br />return result<br /><br />};<br /><br />function example(param){<br /><br />var a=0;<br /><br />if(param>a){<br /><br />var b=a+1; //声明b变量的同时用a变量初始化b变量<br />}else{<br /><br />var b=a+2Q?//声明c变量的同时用a变量初始化c变量<br />};<br /><br />return a; //q回a变量的?br /><br />}Q?</strong></td></tr></tbody></table><br /><br />注释语句<br /><br />严格来讲Q注释语句在WML Script中还不算是真正的语句Q它只是一U前指向的规定。不q它也有严格的语法和标注ҎQ所以我们这里还是像其他~程语言处理的一P把WML Script注释Ҏ以语句的形式介绍一下?br /><br />注释在程序执行的时候没有Q何作用,但是可以用于对程序进行解释,则增强程序的可读性。ؓ了Ş成良好的~程风格Q我们应该养成书写注释的良好习惯Q注释有两种表达方式Q?br /><br />Q?Q通过双斜U注释一行,q样在双斜先后的字符成为注释而不被执行。该注释行可以单独一行书写,也可以放在其他语句的后面?br /><br />例如Q可以进行如下所C的注释Q?br /><br />//变量j用于数每月的天?br /><br />j=0Q?//我们q里j赋gؓ0<br /><br />Q?Q通过W号?*”和?/”来规定注释语句Q这U注释方式可以进行多行注释,W号?*”和?/”之间的内容是注释语句。例如,可以q行如下所C的多行注释Q?br /><br />/*我们定义了两个变量:i和j。其中:<br /><br />i用于描述每年中的月数Q?br /><br />而j用于描述每月的天?/<br /><br />j=0Q?/*我们q里j赋gؓ0*/<br /><br />return语句<br /><br />return语句主要用在函数体中Q在函数l束前,可以通过return语句Q把函数处理的结果返回给调用函数的语句。它的语法格式如下:<br /><br />return表达式;<br /><br />下面的函数给Z应用return语句的例子: <table cellspacing="0" cellpadding="0" width="580" border="0"><tbody><tr><td class="code" bgcolor="#e6e6e6"><strong><br /><br />function square(x){<br /><br />if(!(Lang.isFloat(x)))return invalid;<br /><br />return x*x<br /><br />}; </strong></td></tr></tbody></table><br /><br />5.1.2 条g语句<br /><br />在条件语句中Q当满某种条g?Q就会执行指定的一些代码,而在代码l另外某U条件时Q则会执行另外一些代码。WML Script的条件语句就是if...else语句Q它的一般表辄识如下:<br /><br /><table cellspacing="0" cellpadding="0" width="580" border="0"><tbody><tr><td class="code" bgcolor="#e6e6e6"><strong>if(条g){<br /><br />代码?<br /><br />}<br /><br />else{<br /><br />代码?<br /><br />} </strong></td></tr></tbody></table><br /><br />q样Q当条g满Ӟ执行代码块1Q如果条件不满则执行代码块2。代码块和代码块2中如果只有一个条语句Q那么,花括P{ }Q就可以省略Q而如果有多条语句Q则必须实用花括号将代码块包括在其中。在if...else语句U,其中的else部分是可选的Q也是_我们可以使用如下的表辑Ş式:<br /><br />if(条g){<br /><br />代码?br /><br />}<br /><br />q样Q当条g满Ӟ执行代码块Q如果条件不满则什么也不做?br /><br />例如Q如果我们需要对一个学生的成Wq行判定Q如果大于等?0分,那么我们p学生成W合格了,反之则认Z合格Q同时一q将状态记录到变量statusU,相应的WMLScript语句如下所C:<br /><br />if(score>=60) status="pass";<br /><br />else status="fail";<br /><br />再如Q我们可以通过对天气是否阳光普照(sunShinesQ的情况q行判断Q来l变量myDay赋|q篏计好天气QgoodDaysQ的天数。程序如下:<br /><br /><table cellspacing="0" cellpadding="0" width="580" border="0"><tbody><tr><td class="code" bgcolor="#e6e6e6"><strong>if(sunShines) {<br />myDay="Good";<br /><br />goodDays++;<br /><br />}else<br /><br />myDays="Oh well..."; </strong></td></tr></tbody></table><br /><br />5.1.3 循环语句<br /><br />使用循环语句可以反复执行某个代码块,直到循环l束条g满后才停止执行。WML Script中有两种循环语句Qfor语句和while语句,同时q有两终于@环密切相关的操作语言Qbreak语句和continue语句?br /><br />for语句<br /><br />for语句可以创徏一个带条g的@环,它还?个可选的条g表达式,用于控制循环。这3个条件表辑ּ攑֜一个括号里Qƈ以分PQ)间隔。for语句的一般语法Ş式如下:<br /><br />forQ初始表辑ּQ@环条Ӟ递增表达式){<br /><br />代码?br /><br />}<br /><br /><br />for语句的执行主要包括以下几个步?<br /><br />Q?Q执行初始表辑ּ。在一般情况下Q初始表辑ּ完成的功能是在@环中对@环计数器赋初倹{所以在q种意义上,初始表达式也可以采用“var 变量声明列表Q”的形式来定义?br /><br />Q?Q判断@环条件。如果@环条件ؓ真(tureQ,则执行@环体中的语句Q即x骤(3Q;否则Q@环条件ؓ假(falseQ或者invalid,q束@环;<br /><br />Q?Q执行@环代码。然后,在执行递增表达式。一般情况下Q我们在递增表达式中对@环计数器q行处理Q最后在q回步骤2执行?br /><br />例如Q下面的for语句建立了一个@环。初始表辑ּ为定义变量indexq付初?Q@环条件ؓindexQ?00Q递增表达式ؓ每@环一ơindex增加1。当index增加?00时候,循环l束。程序如下: <table cellspacing="0" cellpadding="0" width="580" border="0"><tbody><tr><td class="code" bgcolor="#e6e6e6"><strong><br /><br />for(var index=0;indexQ?00;index++){<br /><br />count+=index;<br /><br />myFunc(count);<br /><br />}; </strong></td></tr></tbody></table><br /><br />while 语句<br /><br />while语句也可常见一个@环,它的一般语法表辑ּ如下Q?br /><br /><table cellspacing="0" cellpadding="0" width="580" border="0"><tbody><tr><td class="code" bgcolor="#e6e6e6"><strong>whileQ@环条Ӟ{<br /><br />代码?br /><br />} </strong></td></tr></tbody></table><br /><br />while语句的执行过E包括以下几个步骤:<br /><br />(1)判断循环条g是否为真。如果@环条件ؓ真,则执行@环;如果为假或ؓinvalidQ则跛_循环?br /><br />Q?Q执行@环中的代码块Q然后返回步骤(1Q?br /><br />下面的程序就是用while语句的简单例子:<br /><br /><table cellspacing="0" cellpadding="0" width="580" border="0"><tbody><tr><td class="code" bgcolor="#e6e6e6"><strong>var counter=0<br /><br />var total=0<br /><br />while(counter<3){<br /><br />counter++;<br /><br />total+=c;<br /><br />}; </strong></td></tr></tbody></table><br /><br />其中建立的@环仅当变量counter的值小?时执行,否则q束@环?br /><br />昄Q如果@环条件不能ؓ假或为invalid,那么while循环׃无休止的反复执行下去。因此,我们在代码块中一定要有能够改变@环条件的变量Q否则,很有可能会陷入d@环而不能终止程序,下面是一个死循环的例子:<br /><br /><table cellspacing="0" cellpadding="0" width="580" border="0"><tbody><tr><td class="code" bgcolor="#e6e6e6"><strong>var x=1;<br /><br />var y=0;<br /><br />while(x<=1){<br /><br />y=x+1;<br /><br />} </strong></td></tr></tbody></table><br /><br />q个E序中,因ؓ变量x的值在循环中不能发生变化,所以@环条件在判断的时候永qؓ真,所以成Zd@环。因此,对于while语句我们往往使用如下所C的语法形式Q?br /><br />初始表达?br /><br />whileQ@环条Ӟ{<br /><br />代码?br /><br />递增表达?br /><br />}<br /><br />q种情况下,while语句的功能和for语句的功能就一样了Q不q用while语句~写的程序可L更Z些。所以我们也可以采用while语句来完成index增加?00的@环?br /><br />E序如下:<br /><br /><table cellspacing="0" cellpadding="0" width="580" border="0"><tbody><tr><td class="code" bgcolor="#e6e6e6"><strong>var index=0<br /><br />while (index<100){<br /><br />counter+=index;<br /><br />myFunc(count);<br /><br />index++;<br /><br />}; </strong></td></tr></tbody></table><br /><br />break语句<br /><br />Z更好的解x循环问题QWML Script大多数~成语言一h供了break语句。break语句可以使程序执行蟩出@环。不论是for语句q是while语句Q只要在循环中用了break语句Q那么程序执行到break语句后就立即跛_当前循环Q然后l执行下厅R?br /><br />break语句的予发行时如下:<br /><br />break;<br /><br />例如Q在下面的函C我们使用了break语句Q它是当index=3时蟩出@环。如果不是用该语句,函数中的while循环直到index=6时才可以l束。程序如下:<br /><br /><table cellspacing="0" cellpadding="0" width="580" border="0"><tbody><tr><td class="code" bgcolor="#e6e6e6"><strong>funcition testBreak(x){<br /><br />var index=0;<br /><br />while(index<6){<br /><br />if(index==3)break;<br /><br />index++<br /><br />}Q?br /><br />retrun index*x;<br /><br />Q?/strong></td></tr></tbody></table><br /><br />continue语句<br /><br />continue语句的功能和break语句的功能看h有些cMQ但实际上却不一栗@环执行时遇到break语句通常是蟩出当前@环,但@环执行到continue语句q不跛_当前循环Q而是不执行@环中在continue语句后面的代码块Q直接结束@环的本轮q行Q然后马上开始下一轮@环的q行?br /><br />在while语句的@环中Q遇到continue语句后,E序会直接判断@环条件从而开始下一轮@环。在for语句的@环中Q遇到continue语句后程序会直接执行递增表达式,然后判断循环条g从而开始下一轮@环?br /><br />例如Q我们想利用for循环??0之间偶数的和Q其WML Script语句如下Q?br /><br /><table cellspacing="0" cellpadding="0" width="580" border="0"><tbody><tr><td class="code" bgcolor="#e6e6e6"><strong>var sum=0;<br /><br />for (var j=1;j<=10;j++){<br /><br />if(j%2!=0)<br /><br />continue;<br /><br />sun+j;<br /><br />};</strong></td></tr></tbody></table><br /><br />在这个例子中Q在j%2!=0的情况下Q也是j为奇数的情况下,E序执行continue语句Q这Ӟq没有如同break语句一栯出@环的q行Q而是不执行@环中后面的语句而直接执行递增表达式开始下一轮@环的执行Q这P可以不其数j的之cd如d中?br /><br />再如Q我们想利用while循环??之间?以外几个数的和,则可以用continue语句q行控制。程序如下;<br /><br /><table cellspacing="0" cellpadding="0" width="580" border="0"><tbody><tr><td class="code" bgcolor="#e6e6e6"><strong>var index=0Q?br /><br />var count=0Q?br /><br />while (index<5){<br /><br />index++;<br /><br />if(index==3)<br /><br />continue;<br /><br />cont+=index;<br /><br />};</strong></td></tr></tbody></table><br /><br />q以E序中,当index{于3Ӟ“index==3”ؓ?所以执行continue语句Q不再把此时index的值加大count中,而是开始下一轮的循环?/div> <img src ="http://m.tkk7.com/zhyiwww/aggbug/56786.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.tkk7.com/zhyiwww/" target="_blank">zhyiwww</a> 2006-07-05 15:52 <a href="http://m.tkk7.com/zhyiwww/archive/2006/07/05/56786.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>W六?WML Script标准函数库(上)(转蝲)http://m.tkk7.com/zhyiwww/archive/2006/07/05/56785.htmlzhyiwwwzhyiwwwWed, 05 Jul 2006 07:50:00 GMThttp://m.tkk7.com/zhyiwww/archive/2006/07/05/56785.htmlhttp://m.tkk7.com/zhyiwww/comments/56785.htmlhttp://m.tkk7.com/zhyiwww/archive/2006/07/05/56785.html#Feedback0http://m.tkk7.com/zhyiwww/comments/commentRss/56785.htmlhttp://m.tkk7.com/zhyiwww/services/trackbacks/56785.html

W六?WML Script标准函数库(上)

[日期Q?span id="TimeLabel">2004-11-23] 来源Q?span id="SourceLabel">赛_|?/a>  作者: [字体Q?a href="javascript:ContentSize(16)">?/a>?/a>?/a>]
q节会讨论标准的WML Script函数库?br />
6.1 WML Script规则

q些标准函数库提供一个扩展WML Script语言的机Ӟq些特定的函数库必须遵@WML Script的规则?br />
支持的数据格?br />
下面的WML Script格式使用于程序的定义之中Q这栯记录E序参数与回转值的格式?br />
Boolean
Integer
Float
String
Invalid

除此之外Q如果整C点数参数值格式都能接受的话,则能使用number来记录参数格式,如果使用的格式是所支持的格式,则能用any来记录?br />
数据格式转换

函数库程序发生错误的处理方式和WML Script语言一栗?br />
invalidE序参数会生invalid的回传倹{?br />
E序的参数无法{成所需要用参数格式,则会产生invalid的回传倹{?br />
与程序相关的错误得出回传一个适当的错误码Q至于这个值就要看每个E序如何定义?br />
6.2 Lang函数?/b>

名称QLang

说明Q这个函数库所含的E序同WML Script语言的核心有很密切的关系?br />
abs

E序QabsQvalueQ?br />说明Q回传给予数的绝对倹{?br />如果l予的数是整敎ͼ则回传整数?br />如果l予的数是QҎQ则回传点数?br />参数Qvalue=数字?br />回传|数字或invalid?br />例外状况Qvar a =-3;
var b =Lang.abs(a)Q?/b=3

min


范例Qvar a = -3
var b = Lang.abs(a);
var c = Lang.min(a.b);
var d = Lang.min(45?6.3);//d=45(ingteger)
var e = Lang.min(45?6.3);//e=45(ingteger)

max

E序QmaxQvalue1,value2Q?br />说明Q回传值给予的两个C间的较大|回传的g格式同所选数值的g格式相同Q其选取的方式如下:
WML Scriptq算W数据格式的整数与QҎ转换法则可用来确认数据格式,以便执行比较的动作?br />参数Qvalue1 =数字
value2 =数字
回传|数字或invalid
例外状况Q无
范例Qvar a =-3;
var b =Lang.abs(a)Q?/b=3
var c = Lang.min(a.b);
var d = Lang.min(45?6.3);//d=45(ingteger)
var e = Lang.min(45?6.3);//e=45(float)

parseInt

E序QparseInt(value)
说明Q回传由字符串value所定义的整数|合法的整数语法由WML Script数值字W串文法或是q值整数是字所界定Q下列ؓ额外的解析法则:
W一个字W不是由+?或十q制数字当开头的话,解译l束?br />l果Q解析过的字W串回{换整数倹{?br />范例Qvar i =Lang.parseInt("1234"); // i=1234
var j =Lang.parseInt("100 m/s"); // j=100

parseFloat

E序QparseFloat(value)
说明Q回传由字符串value所定义的QҎ|合法的QҎ语法由WML Script数值字W串文法或是q值整数实字所界定Q下列ؓ额外的解析法则:
W一个字W无法解析成点数表辑ּQ解析结束?br />l束Q解析过的字W串回{换成点数?br />参数Qvalue=字符?br />回传|点数或invalid
例外状况Q解析错误则传回invalid
范例Qvar a =Lang.parseFloat("123.7 Hz"); // a=123.7
var b =Lang.parseFloat("7.34e2 Hz"); // b=7.34e2
var c =Lang.parseFloat("70.0e-2 F"); // c=70.0e-2
var d =Lang.parseFloat("-1.c"); // d=0.1
var e =Lang.parseFloat("100"); // e=100.0
var f =Lang.parseFloat("Number:5.5"); // f=invalid
var g =Lang.parseFloat("7.3e meters"); // g=invalid
var h =Lang.parseFloat("7.3e- m/s"); // h=invalid

isInt

E序QisInt(value)
说明Q如果各预的值value能用parseInt(value)转成整数则回传布值tureQ否则传回false?br />参数Qvalue=L?br />回传|布尔值或invalid
例外状况Q无
范例Qvar a=Lang.inInt("-123"); //ture
var a =Lang.minInt("123.33"); //ture
var a =Lang.minInt("string"); //false
var a =Lang.minInt("#123"); //false
var a =Lang.minInt("invalid"); //invalid

isFloat

E序QisFloat(value)
说明Q如果各预的值value能用parseInt(value)转成整数则回传布值tureQ否则传回false?br />参数Qvalue=L?br />回传|布尔值或invalid
例外状况Q无
范例Qvar a=Lang.inInt("-123"); //ture
var a =Lang.minInt("123.33"); //ture
var a =Lang.minInt("string"); //false
var a =Lang.minInt("#123"); //false
var a =Lang.minInt("invalid"); //invalid

maxInt

E序QmaxInt()
说明Q传回最大的整数倹{?br />参数Q无
回传|整数2147483647
例外状况Q无
范例Qvar a =Lang.minIntQ);

minInt

E序QminInt()
说明Q传回最的整数?br />参数Q无
回传|整数-2147483647
例外状况Q无
范例Qvar a =Lang.minInt();

float

E序Qfloat()
说明Q如果有支持点数的话传回ture,没有的话传回false?br />参数Q无
回传|布尔?br />例外状况Q无
范例Qvar floatsSupported = Lang.float();

exit

E序Qexit(value)
说明Q结束WML Script位码的解译然后回到调用WML Script解译器者的控制Qƈ回传指定值value,你可以用这个程序来执行׃般程序的l束Q而且WML Script位码的执行必d止?br />参数Qvalre=L?br />回传|无,q个E序l束解译
例外状况Q无
范例QLang.exit("Value:" + myVal);//Returns a string
Lang,exit(invalid);// Returns invalid

abort

E序Qabort(errorDescription)
说明Q中止WML Script位码的解译然后回到调用WML Script解译器者的控制Qƈ回传 errorDescription,你能使用q个E序执行不正常的中止Q调用程序者检到有严重错误,WML Script的执行ƈM断?br />如果errorDescription的格式ؓinvalid,字符串invalid用代替errorDescription的用?br />参数QerrorDescription =字符?br />回传|无,q个E序l束解译
例外状况Q无
范例QLang.abort("Error:" + errVal); // Error value string

radndom

E序Qrandom(value)
说明Q回传一个正数的整数|也就是说要大于或{于Ӟ但必要于l定值value,回传值是p是正常分布所随机选取的倹{?br />参数Qvalue=整数
回传|整数或invalid
例外状况Q如果value{于0Q则E序回传0
如果value于0Q则E序回传invalid
范例Qvar a =10;
var b =Lang.random(5.1)*aQ?/b=0..50
var c = Lang.random("string"); // c=invalid

reed

E序Qseed(alue)
说明Q初始化需随机数字序q回传一个空字符?br />如果value?或正整数Q给予的value则用来初始化Q反之则使用随机初始化的倹{?br />如果value为QҎQ则会先使用Float.int()来计确切的整数倹{?br />参数Qvalue=整数
回传|字符串或invalid]
例外状况Q无
范例Qvar a =Lang.reed(123);// a=""
var b =Lang.random(20); // b=0..20
var c = Lang.seed("seed"); // c=invalid (random seed //left unchanged)

characterSet

E序QcharacterSet()
说明Q回传WML Script解译器所支持的字集,回传只是个整数用来记录由IANA所讑֮的MIB Enum|q个只能表示所有的字集?br />参数Q无
回传|整数
例外状况Q无
范例QVar charset = Lang.characterSet(); //charset = 4 for latinl

6.3 Float函数?/b>

名称QFloat
说明Q这个函数库包含了典型与常用的QҎ术E序?br />
int

E序Qint(value)
说明Q回传给予值的整数部分?br />参数Qvalue=数字
回传|整数或invalid
例外状况Q无
范例Qvar a =3.14;
var b =Float.in(a); //b=3
var c =Float.in(-2.8); //c=-2

floor

E序Qfloor(value)
说明Q回传整数|q个只要最接近l予g不能大于它?br />如果value已经是个整数Q其l果是q个值本w?br />参数Qvalue=数字
回传|整数或invalid
例外状况Q无
范例Qvar a =3.14;
var b =Float.in(a); //b=3
var c =Float.in(-2.8); //c=-3

ceil

E序Qceil(value)
说明Q回传一个只要最接近l予g不能于它的整数倹{?br />如果value已经是个整数Q其l果是q个值本w?br />参数Qvalue=数字
回传|整数或invalid
例外状况Q无
范例Qvar a =3.14;
var b =Float.in(a); //b=4
var c =Float.in(-2.8); //c=-2

pow

E序Qpow(x,y)
说明Q回传x的yơ方倹{?br />如果x是负敎ͼ则y必须为正数?br />参数Qx=数字
   y=数字
回传|点数或invlid
例外状况Q如果x= =0而且 y<0,则回传invalid
如果x<0而且y不是个整敎ͼ则回传invalid
范例Qvar a =3
var b =Float.pow(a,2); //b=9

round

E序Qround(value)
说明Q传回最接近l予值的整数
若两个整数Dvalue接近的程序相{,则选择比较大的数?br />若value已经是个正数Q其l果是value本n?br />参数Qvalue=数字
回传|整数或invalid
例外状况Q无
范例Qvar a=Float.round(3.5)Q?// a=4
var b=Float.round(-3.5); //b=-3
var c=Float.round(0.5)Q?// c=1
var d=Float.round(-0.5); //d=0

squt

E序Qsqrt(value)
说明Q传回给予值value的^Ҏq似倹{?br />参数Qvalue=点?br />回传|点数或invalid
例外状况Q如果value负数Q则回传invlid
范例Qvar a=4;
var b=Float.squt(a); //b=2.0
var c=Float.squt(5); //c=2.2360679775

maxFloat

E序QmaxFloatQ)
说明Q传回IEEE 754所支持的但准QҎ格式中最大的点数倹{?br />参数Q无
回传|点?.40282347E+38
例外状况:?br />范例Qvar a=Float.maxFloat();

minFloat

E序QminFloatQ)
说明Q传回IEEE 754所支持的但准QҎ格式中最的点数倹{?br />参数Q无
回传|点?.17549435E-38
例外状况Q无
范例Qvar a=Float.minFloat();

6.4 string函数?/b>

名称Q字W串
说明Q这个函数库包含了字W串E序的集合,一个字W串可以是字W数l,每个字符都有个烦引,字符串的W一个字的索引?,字符串的长度是字W在数组中的数目?br />
你能使用一些特D的分隔W号来界定不同的字符Ԍq样你就能存取这些有分隔W号予元素烦引所界定出的元素Q字W串中第一个元素的索引gؓ0Q每个字W串分隔W号回分隔出两个元素Q但字符是不能用来做分隔W号?br />
一个空格的字符可能是下列字W其中之一Q?br />
TAB:水^x定位Qhorizontal tabulationQ?br />VT:垂直x定位(ertival tabulation)
FF:跳页Qfrom feedQ?br />SP:I格QspaceQ?br />LF:跌Qline feed)
CR:归位Qcarriage returnQ?br />
length

E序Qlength(string)
说明Q传回给予字W串的长度(字符的数目)?br />参数Qstring=字符?br />回传|整数或invalid
例外状况Q无
范例Qvar a="ABC";
var b=string.length(a); //b=3
var c=string.length(""); //c=0
var d=string.length(342); //d=3

is Empty

E序Qis Empty(string)
说明Q如果字W串长度为零则传回布值true,反之传回false?br />参数Qstring=字符?br />回传|布尔值或invalid
例外状况Q无
范例Qvar a="Hello;
var b="";
var c=sting.isEmpty(a); //c=false
var c=sting.isEmpty(b); //d=ture
var c=sting.isEmpty(ture); //e=false

charAt

E序QcharAt(sting.index)
说明Q回传string中index值所指定的字W?br />参数Qstring=字符?br />index=数字Q回传回index所指定的字W)
回传|字符串或invalid
例外状况Q如果index的Dq字W串的范_则回传空字符Ԍ""Q?br />范例Qvar a="My name is Joe"
var b=sting.charAt(a,0); //b= "M"
var c=sting.charAt(a,100); //c= ""
var d=sting.charAt(34.0); //d="3"
var e=sting.charAt(a,"first"); //e=invalid

subString

E序QsubString(string,startIndex,length)
说明Q传回一个新的字W串来代替所l予的字W串Q?q个新字W串l定的烦引值开始,它的长度有所l予的length军_?br />如果startIndex于0Q则?来当作烦引倹{?br />如果length大于剩余字符的数目,则lenght会由剩余的字W数来代ѝ?br />如果startIndex予lenght是QҎQ则会先使用Float.int()来计正的整数倹{?br />参数Qstring=字符?br />startIndex=数字
lenght=数字
回传|字符串或invalid
例外状况Q如果startIndex大于最后的索引|则回传会I字W串Q?"Q?br />如果lenght<=0Q传会空字符Ԍ""Q?br />范例Qvar a="ABCD";
var b=String.subString(a,1,2); //b="BC"
var c=String.subString(a,2,5); //c="CD"
var d=String.subString(1234,0,2); //d="12"

find

E序Qfind(string,substring)
说明Q传会所要寻扄字符串substring和原始字W串string相符的第一个字W的索引倹{?br />如果没有相符Q则传会整数?1?br />两个字符传如果是相等的话Q是定义ZW合?br />参数Qstring=字符?
substring=字符?br />回传|整数或invalid
例外状况Q无
范例Qvar a="abcde";
var b=String.find(a,"cd"); //b=2
var c=String.find(34.2,"de"); //c=-1
var d=String.find(a,"gz"); //d=-1
var e=String.find(34,"3"); //e=0

replace

E序Qeplace(tring,oldSubString,newSubString)
说明Q传会新字符Ԍq个新字W串是由和所l予字符串string相符的旧字符传oldSubString使用新字W串newSubString字符串加以代ѝ如果两字符串相{的话,定义为相W?br />参数Qstring=字符?br />oldSubString=字符?br />newSubString=字符?br />回传|字符串或invalid
例外状况Q无
范例Qvar a="Hello Joe.What is up Joe?";
var newName="Don";
var oldName="Joe";
var c=String.replace(a,oldName,newName); //c="Hello Don.What is up Don?"
var d=String.replace(a,oldName,newName); //c="Hello Don.What is up Don?"

element

E序Qelement(string,separator)
说明Q回传分隔符号separator所分隔的字W串string的元素数目,I字W串Q?"Q是有效的元素,q表CZq程序永q不会回传一个小于或{于0得倹{?br />参数Qstring=字符?br />separator=字符?br />回传|整数或invalid
例外状况Q如果separator是个I字W串Q则回传invalid
范例Qvar a="My name is Joe;Age 50";
var b=String.elements(a,"");//b=6
var c=String.elements(a,";");//c=3
var d=String.elements("",";");//d=1
var e=String.elements("a","");//e=1
var f=String.elements(";",";");//f=2
var g=String.elements(";;,;",";,");//g=4
separator=;

elementAt

E序QelementAt(string,index,separator)
说明Q寻扑֭W串string的第index个元素,q些元素是由分隔W号separator所加以分开Qƈ回传相对应的元素?br />如果index值小?Q则回传W一个元素?br />如果index值大于元素的数目Q则回传最后一个元素?br />如果字符串ؓI字W串Q则回传I字W串?br />如果indexgؓ点敎ͼ则须先用Float.int()来计出正确的烦引倹{?br />参数Qstring=字符?br />index=数字
separator=字符?br />回传|字符串或invalid
例外状况Q如果separator是个I字W串Q则回传invalid
范例Qvar a="Hello Joe.What is up Joe?";
var b=String.elementAt(a,0,""); //b="My"
var b=String.elementAt(a,14,";"); //c=" "
var b=String.elementAt(a,1,";"); //d="Age 50"

removeAt

E序QremoveAt(string,index,separator)
说明Q将W合索引值index的分隔号separator与元素有字符串string中移出,q回传这个新字符丌Ӏ?br />如果index值小?Q则回传W一个元素?br />如果index值大于元素的数目Q则回传最后一个元素?br />如果字符串ؓI字W串Q则回传I字W串?br />如果indexgؓ点敎ͼ则须先用Float.int()来计出正确的烦引倹{?br />参数Qstring=字符?br />element=字符?br />index=数字
separator=字符?br />回传|字符串或invalid
例外状况Q如果separator是个I字W串Q则回传invalid
范例Qvar a=" A A;B C D";
var s= "";
var c=String.removeAt(a,1,s); //b="A B C D"
var d=String.removeAt(a,0,";"); //c=" B C D"
var e=String.removeAt(a,14,";"); //d="A A"

replaceAt

E序QreplaceAT(string,index,separator)
说明Q在特定的index中的元素Q用所l予的元素element来代替,q回传这个新字符丌Ӏ?br />如果index值小?Q则回传W一个元素?br />如果index值大于元素的数目Q则回传最后一个元素?br />如果字符串ؓI字W串Q则回传I字W串?br />如果indexgؓ点敎ͼ则须先用Float.int()来计出正确的烦引倹{?br />参数Qstring=字符?br />element=字符?br />index=数字
separator=字符?br />回传|字符串或invalid
例外状况Q如果separator是个I字W串Q则回传invalid
范例Qvar a= "B C; E";
var s="";
var d=String.replaceAT(a,"A",0,s); //b="A C;E"
var e=String.replaceAT(a,"F",5,";"); //d="B C;F"

InsertAt

E序QinsertAt(string,index,separator)
说明Q将元素element与相对应的分隔符号separator插入与原始字W串string,在特定的element中的元素
如果index值小?Q则0会用来当索引倹{?br />如果index值大于元素的数目Q则元素element会附加上字符串string的ؓ端?br />如果字符串string为空字符Ԍ则回传包含所l予元素element的新字符丌Ӏ?br />如果indexgؓ点敎ͼ则需先用Float.int()来计出正确的烦引倹{?br />参数Qstring=字符?br />element=字符?br />index=数字
separator=字符?br />回传|字符串或invalid
例外状况Q如果separator是个I字W串Q则回传invalid
范例Qvar a= "B C; E";
var s="";
var b=String.insertAt(a,"A",0,s); //b="A B C;E"
var c=String.insertAt(a,"X",3,s); //c="B C;E X"
var d=String.insertAt(a,"D",1,";"); //d="B C;D;E"
var e=String.insertAt(a,"F",5,";"); //e="B C;E;F"

squeeze

E序Qsqueeze(string)
说明Q将字符串string中所有连l的I格减少Z个空根{?br />参数Qstromg=字符?br />回传|字符串或invalid
例外状况Q无
范例Qvar a="Hello";
var b="Bye Jon.See you!";
var c=String.squeeze(a); //c="Hello"
var d=String.squeeze(b); //d="Bye Jon.See you!"

trim

E序Qtrim(string)
说明Q将字符串string中所有开头与q箋的空格删除?br />参数Qstring=字符?br />回传?字符串或invalid
例外状况Q无
范例Qvar a="Hello";
var b="Bye Jon.See you!";
var c=String.squeeze(a); //c="Hello"
var d=String.squeeze(b); //d="Bye Jon.See you!"

compare

E序Qcompare(string,string2)
说明Q这个程序的回传g指出string1与string2在语汇上关系Q这个关pLZ自然字集的字W码之间Q其回传值如下:
如果string1于string2Q传?1?br />如果string1{于string2Q传?1?br />如果string1大于string2Q传?1?br />参数Qstring1=字符?br />string2=字符?br />回传|整数或invalid
例外状况Q无
范例Qvar a="Hello";
var b="Hello";
var c=String.compare(a,b); //c=0
var d=String.compare("Bye","Jon"); //d=-1
var e=String.compare("Jon","Bye"); //e=1

toString

E序QtoString(value)
说明Q回传一个能表示所l予的值value的字W串Q这个程序跟WML Script的{换是一LQ除了invlaidg回传一?invalid"字符丌Ӏ?br />参数Qvalue=L?br />回传|字符?br />例外状况Q无
范例Qvar a=string.toString(12); // a="12"
var a=string.toString(true); // b="true"

format

E序Qformat(format,value)
说明Q将l予的值value转换成字W串Qƈ依照所l予的格式format提供的格式化的字W串Q这个格式字W串只能׃U特定格式,q能攄于字W串的Q何地方,如果过一U以上的格式需要用,则能会用最左边的格式,至于其他格式则有I字W串代替Q这些格式如下:

[width][.precision]type
width参数为非负的是近制整敎ͼq个参数控制与显现字W的最数目,如果输出的字数小于指定的宽度widthQ则会在字符串的左边加上I白Q直到符合最宽度的要求Qwidth参数永远不会是值value被删减,如果输出的字数大于特定的宽度或ƈ没指定宽度的话,value中所有的字符都会被显现?br />
precision参数是个非负的十q制整数Q这个引号之前必限价上Q?Q的W号Q其目的是用来设定输入值的_度,q个值的解议会跟l予的格式有养I

d 界定数字最的昄数目Q如果value中数字的数目过precision的|输入g在其左边加上0Q如果数字的数目过precision|value的值ƈ不会被删减,预设的precisiongؓ1Q如果precisionD定ؓ0Q而且value被转换?Q则l果是一个空字符丌Ӏ?br />
f 界定十进制小数后的数字数目,如果十进制的数点出CQ在数点之后至要有一位数Q这个g被四舍五入到q似的数字数|预设的precision?Q如果precision?或小数点Q?Q后没有数字Q则不会昄数点,当value值的数点后数字数目于precision的|字母0加入直到填满栏位Q如QString.format("%2.3f",1.2)会是"1.200"Q?br />
s 界定字符所要显现的最大数目,预设值是昄所有的字符Q当width值大于precision|width值是可以忽略的,跟widthg同的是,precision只可能会造成点数值的四舍五入或输入值的删减?br />
type参数是唯一格式的参敎ͼ他出现在M的格式栏为选项之后Qtype字符军_了所l予的value会解译成整敎ͼ点数或字符Ԍ支持的type参数如下:
d 整数Q输入值的格式[-]ddddQ这里的dddd是一个或以上的十q制数字?br />f 点敎ͼ输入值的格式[-]dddd.dddd,q里的dddd是一个或以上的十q制数字Q在数点之前的数字数目和数字的大小有关Q小数点之后的数字数目和_度有兟?br />s 字符Ԍ字符的显现跟_度有兟?br />癑ֈ比字W(%Q在格式字符串中能用额外的癑ֈ比字W加以表C(%%Q?br />参数Qformat=字符?br />value=L?br />回传|字符串或invalid
例外状况Q无效的格式会回传invalid倹{?br />范例Qvar a=45;
var b=-45;
var c="now";
var d=1.2345678;
var e=String.format("e:%6d",a); //e="e:45"
var e=String.format("%6d",b); //f="-45"
var e=String.format("e:%6d",a); //g="0045"
var e=String.format("%6.4d",b); //h="-0045"
var e=String.format("Do it %s",c); //i="Do it now"
var e=String.format("%3f",d); //j="1.2345678"
var e=String.format("%10.2f%%",a); //k="1.23%."
var e=String.format("%3f %2f",a); //l="1.234567."
var e=String.format("%.0d",0); //m=""
var e=String.format("%.7d","Int"); //n="invalid"
var e=String.format("%s",ture); //o="ture"


zhyiwww 2006-07-05 15:50 发表评论
]]>
W六?WML Script标准函数库(下)(转蝲)http://m.tkk7.com/zhyiwww/archive/2006/07/05/56784.htmlzhyiwwwzhyiwwwWed, 05 Jul 2006 07:47:00 GMThttp://m.tkk7.com/zhyiwww/archive/2006/07/05/56784.htmlhttp://m.tkk7.com/zhyiwww/comments/56784.htmlhttp://m.tkk7.com/zhyiwww/archive/2006/07/05/56784.html#Feedback0http://m.tkk7.com/zhyiwww/comments/commentRss/56784.htmlhttp://m.tkk7.com/zhyiwww/services/trackbacks/56784.html

W六?WML Script标准函数库(下)

[日期Q?span id="TimeLabel">2004-11-23] 来源Q?span id="SourceLabel">赛_|?/a>  作者: [字体Q?a href="javascript:ContentSize(16)">?/a>?/a>?/a>]
6.5 URL函数?br />
名称QURL
说明Q这个函数库包含了处理绝对的URL与相对URL的程序,一般的URL语法如下Q?scheme>Q?/:/;?#

isValid

E序QisValid(url)
说明Q如果给予的url值是正确的URL语法Q则回传tureQ否则回传false
l对与相关URL都能支持
相关URL不会被{成绝对URL
参数Qurl=字符?br />回传|布尔值或invalid
例外状况Q无
范例Qvar a=URL.isValid
("http://www.acme.com/script#func()"); //a=ture
var b=URL.isValid("../common#test()"); //b=ture
var c=URL.isValid
("experimental?://www.acme.com/pub"); //c=false

getScheme

E序:getScheme(url)
说明Q回传给予url的调用方式scheme
l对与相关URL都能支持
相关URL不会被{成绝对URL
参数Qurl=字符?br />回传|字符串或invalid
例外状况Q如果遇C正确的URL语法Q则回传invalid
范例Qvar a=URL.geScheme("http://w.a.com"); //a="http"
var b=URL.getSceme("w.a.com"); //b=""

getHost

E序QgetHost(url)
说明Q回传给予url的主?br />l对与相关URL都能支持
相关URL不会被{成绝对URL
参数Qurl=字符?br />回传|字符串或invalid
例外状况Q如果遇C正确的URL语法Q则回传invalid
范例Qvar a=URL.geHost("http://www.acom.com/pub"); //a="www.acm.com"
var b=URL.getHost("path#fray"); //b=""

getPort

E序QgetPort(url)
说明Q回传给予url的端口(portQ?br />如果port没有制定Q则回传I字W串
l对与相关URL都能支持
相关URL不会被{成绝对URL
参数Qurl=字符?br />回传|字符串或invalid
例外状况Q如果遇C正确的URL语法Q则回传invalid
范例Qvar a=URL.getPort("http://www.acom.80/path"); //a="80"
var b=URL.getPort("http://www.acom./path"); //b=""

getPath

E序QgetPath(url)
说明Q回传给予url的\径(pathQ?br />
参数Qurl=字符?br />回传|字符串或invalid
例外状况Q如果遇C正确的URL语法Q则回传invalid
范例Qvar a=URL.getPath("http://w.a.com/home/sub/comp#frag"); //a="/home/sub/comp"
var b=URL.getPath("../home/sub/comp#frag"); //b="../home/sub/comp"

getParameters

E序QgetParameters(url)
说明Q回传给予url的\径(parameterQ?br />如果没有指定参数Q则回传I字W串
l对与相关URL都能支持
相关URL不会被{成绝对URL
参数Qurl=字符?br />回传|字符串或invalid
例外状况Q如果遇C正确的URL语法Q则回传invalid
范例Qvar a=URL.getParameters("http://w.a.c/scr;3;2?x=1&y=3"); //a="3;2"
var b=URL.getParameters("../scr3;2?x=1&y=3"); //b="../home/sub/comp"

getQuery

E序QgetQuery(url)
说明Q回传给予url的询问部分(queryQ?
如果没有指定的询问部分,则回传空字符?br />l对与相关URL都能支持
相关URL不会被{成绝对URL
参数Qurl=字符?br />回传|字符串或invalid
例外状况Q如果遇C正确的URL语法Q则回传invalid
范例Qvar a=URL.getParameters("http://w.a.c/scr;3;2?x=1&y=3"); //a="3;2"

getFragment

E序QgetFragment(url)
说明Q回传给予url的片断(fragmentQ?br />如果没有指定片断Q则回传I字W串
l对与相关URL都能支持
相关URL不会被{成绝对URL
参数Qurl=字符?br />回传|字符串或invalid
例外状况Q如果遇C正确的URL语法Q则回传invalid
范例Qvar a=URL.getFragment("http://www.acom.com/cont#fray"); //a="fray"

getBase

E序QgetBase()
说明Q回传次WML ScriptE序的绝对URLQ没有fragment的部分)?br />参数Q无
回传|字符?br />例外状况Q无
范例Qvar a=URL.getBase(); //Result;
"http://www.acme.com/test.scr"

getReferer

E序QgetReferer()
说明Q回传调用目前程序资源的最相关URLQ与目前E序的基本URL的相养I
内部E序调用q不会改变参照?br />如果目前的程序ƈ没有参照者,则回传空字符?br />参数Q无
回传|字符?br />例外状况Q无
范例Qvar base=URL.getBase(); //base
="http://www.acme.com/current.scr"
var prferer=URL.getReferer(); //referer="app.wml"

resolve

E序Qresolve(baseUrl,embeddedUrl)
说明Q根据RFC2396的文Ӟq予的基本base与插入embeddedUrl回传l对URL
参数QbaseUrl=字符?br />embeddedUrl=字符?br />回传|字符串或invalid
例外状况Q如果遇C正确的URL语法Q则回传invalid
范例Qvar a=URL.resolve(http://www.foo.com/,"foo.vcf"); //a="http://www.foo.com/foo.vcf"

escapeString

E序QescapeString(string)
说明Q这个程序会所l与string字符串之中的Ҏ字符使用十六q制逃脱序列来替?你必M用量为逃脱序列格式%xx),q些逃脱字符如下Q?br />控制字符Qcontrol charactersQ:US-ASCII~码的字W?0-1F?F
I格QSpaceQ?US-ASCII码编字符20十六q制
保留字(ReservedQ?"Q?|"/"|"?"|"Q?|"@"|"="|"+"|"$"|","
Unwise:"{"|"}"|"|"|"\"|""|"["|"]"|"`"
Delimes:"<"|">"|"#"|"%"|"<>"
l予的字W串如果已经是用逃脱自负Q则不会执行URL解析
参数Qstring=字符?br />回传|字符串或invalid
例外状况Q如果字W串string含有非US-ASCII的字W,则回传invalid
范例Qvar a=URL.escapeString
("http://w.a.c/dck?x=u007ef#crd");
// a="http%3a2f%2fw.a.c%2fdck%3fx%3def%23crd"

unescapeString

E序QunescapeString(string)
说明Q这个程序会所l与string字符串之中每个可能是由URL.escapeString() E序所产生的逃脱序列使用它所代表的字W加以替代?br />参数Qstring=字符?br />回传|字符串或invalid
例外状况Q如果字W串string含有非US-ASCII的字W,则回传invalid
范例Qvar a="http%3a2f%2fw.a.c%2fdck%3fx%3def%23crd";
var b=URL.unescapeString(a); //b
="http://w.a.c/dck?x=12#crd"

loadString

E序QloadString(url,contentType)
说明Q回传有所l予的绝对URL与contenttype所指出的内宏V?br />如果内容格是不是下列法则所规范的话Q则是错误的Q?br />你只能界定一U内Ҏ式,整个字符串必d一U内Ҏ式相W,?且你不能有额外的前或后空根{?br />格式必须是正文,但次格式没有限制Q格式的开头一定是"text/"?br />q个E序的动作如下:
文g的内容会载入使用l予的contentType与url,其他所需的数形式有用用L面的预设面?br />如果载入成功而且回传的内为格式与所l予的contentType相符,则内文会被{换成字符串再回传?br />如果载入成功或回传的内文格式不正的话,则会回传特定的错误码?br />参数Qurl=字符?
contentYype=字符?br />回传|字符丌Ӏ整数或invalid
例外状况Q如果蝲入失败其回传的错误码和所使用的URL Scheme有关
如果使用HTTP或WSP架构Q会回传HTTP错误码?br />如果l予的contentType错误的话Q则会回传invalid
范例Qvar a="http%3a2f%2fw.a.c%2fdck%3fx%3def%23crd";
var b=URL.unescapeString(a); //b
="http://w.a.c/dck?x=12#crd"

loadString

E序QloadString(url,contentType)
说明Q回传有所l予的绝对URL与contenttype所指出的内宏V?br />如果内容格是不是下列法则所规范的话Q则是错误的Q?br />你只能界定一U内Ҏ式,整个字符串必d一U内Ҏ式相W,?且你不能有额外的前或后空根{?br />格式必须是正文,但次格式没有限制Q格式的开头一定是"text/"?br />q个E序的动作如下:
文g的内容会载入使用l予的contentType与url,其他内文所需的数形式有用用L面的预设面?br />如果载入成功而且回传的内容ؓ格式与所l予的contentType相符,则内文会被{换成字符串再回传?br />如果载入成功或回传的内文格式不正的话,则会回传特定的错误码?br />参数Qurl=字符?
contentYype=字符?br />回传|字符丌Ӏ整数或invalid
例外状况Q如果蝲入失败其回传的错误码和所使用的URL Scheme有关
如果使用HTTP或WSP架构Q会回传HTTP错误码?br />如果l予的contentType错误的话Q则会回传invalid
范例Qvar myUrl="http://www.acme.com/vcards/myaddr.vcf";
myCard=URL.loadString(myUrl,"text/x-vcard");

6.6 WML览器函数库

名称QWML Brower
说明:q个函数库所包含的程序是让WML Script用来存取与WML相关的内文,q些E序不能有Q何的副作用,q在下列的状况下回传invalid倹{?br />pȝ不支持WML览器?br />WML览器无法用WML Script解译器?br />
getVar

E序QgetVar(name)
说明Q回传目前浏览器内文的所l予名称name的变量倹{?br />如果所指定的变量不存在Q回传一个空字符丌Ӏ?br />变量名称必须依照WML语法来用?br />参数Qname=字符?br />回传|字符串或invalid
例外状况Q如果变量名UC合语法,则回传invalid
范例Qvar a=WMLBrowser.getVar("name");
// a"Jon"或者变量的?br />
setVar

E序QsetVar(name,value)
说明Q在目前的浏览器之中Q如果所l予名称name的变量,它的值同l予的值value讑֮的一L话,回传tureQ否则回传false?br />变量名称必须依照WML语法来用?br />变量值必L合法的XML CD ATA
参数Qname=字符?br />value=字符?br />回传|布尔值或invalid
例外状况Q如果变量名U或它的g合语法,则回传invalid
范例Qvar a=WMLBrowser.setVar("name",Mary); // a=true

go

E序Qgo(url)
说明Q将l予的url所标记的内文蝲入,q个E序予WML的GO动作意思相同?br />如果所l予的url字空字符Ԍ""Q,则不会蝲入Q何内文?br />go()与prevQ)函数库程序会互相推翻Q在回传控制与WML览之前都可以加以调用多ơ?br />只有最后的调用讑֮的会保持作用Q如果最后的调用为go()或prevQ),其所讑֮的url为空字符Ԍ""Q,所有的要求都会被取消?br />q个E序回传I字W串?br />参数Qurl=字符?br />回传|字符串或invalid
例外状况Q无
范例:varcard="http://www.acme.com/loc/app.dck#start";WMLBrowser.go(card
)

prev

E序Qprev()
说明:告诉WML览器回到先前的WML CardQ这个程序的功能与WML中的prev动作一栗?br />go()与prev()函数库程序会互相推翻Q在回传控制与WML 览之前都可以加以调用多ơ?br />只有最后的调用讑֮是会保持作用Q如果最后的调用为go()或prew(),其所讑֮的url为空字符Ԍ""Q,所有的要求都会被取消?br />q个E序回传I字W串?br />参数Q无
回传|字符串或invalid
例外状况Q无
范例QWMLBrowser.prev();

newContext

E序QnewContext()
说明Q将目前WML览器的内文清除q回传一个空字符Ԍq个E序的公用与WML的NEWCONTEXT属性一栗?br />参数Q无
回传|字符串或invalid
例外状况Q无
范例QWMLBrowser.newContextQ)Q?br />
getCurrentCard

E序QgetCurrentCard()
说明Q回传目前WML览器所处理card的最相关URLQ如果WML deck所包含目前E序的基本地址不同的话Q则此程序会回传l对URL?br />参数Q无
回传|字符串或invalid
例外状况Q如果没有目前的cardQ则回传invalid?br />范例Qvar a=WMLBrowser.getCurrentCard();// a="deck#input"

refresh

E序Qrefresh()
说明Q强制WML览器更新它的内文ƈ回传一个空字符Ԍ而用L面会加以更新以反应更新后的内容,q个E序与WML中的refresh功能一栗?br />参数Q无
回传|字符串或invalid
例外状况Q无
范例QWMLBrowser.setVar("name","Zorro");
WMLBrowser.refresh();

6.7 Dialog函数?/b>

名称Q对?br />说明Q这个函数库包含典型的用L面程序?br />
prompt

E序Qprompt(message,defaultInput)
说明Q显C给予的信息message与用戯入的提示W号QdefaultInput参数包含了用戯入所需的初始内文,回传用户输入?br />参数Qmessage=字符?br />defaultInput=字符?br />回传|字符串或invalid
例外状况Q无
范例Qvar a="09-555 3456"; var b=Dialogs.prompt("Phome number";a);

confirm

E序Qconfirm(message,ok,cancel)
说明Q显C所l予的信息message与两个选项Qok与cancel,{待用户选取其中一个,如果是ok则回传false?br />参数Qmessage=字符?br />ok=字符?br />cancel=字符?br />回传|布尔值invalid
例外状况Q无
范例Qfunction onAbort(){return Dialogs.confirm("Are you sure?"),"Yes","No";};

alert

E序Qalert(message)
说明Q显C所l予的信息messagel用P{待用户定q回传一个空字符丌Ӏ?br />参数Qmessage=字符?br />回传|字符串或invalid
例外状况Q无
范例Qfunction testValue(textElement){
if (String.length(textElement)Q?) {
Dialogs.alert("Enter name Q? chars!");
};
};

6.8 函数库ȝ

函数?

函数库名Uͼ

Lang

Float

String

URL

WML Browser

Dialogs

 

函数库与他们的程序:

Lang函数?/span>

Abs

Min

Max

ParseInt

ParseFloat

IsInt

IsFloat

MaxInt

MinInt

Float

Exit

Abort

Random

Seed

CharacterSet

 

Float 函数?/span>

Int

Ploor

Ceil

Pow

Round

Sqrt

MaxFloat

MinFloat

 

String 函数?/span>

Length

IsEmpty

CharAt

SubString

Pind

Replace

Elements

ElementAt

RemoveAt

ReplaceAt

InsertAt

Squeeze

Frim

Compqre

ToString

format

 

URL 函数?/span>

IsValid

GetScheme

GetHost

GetPort

GetPath

GetParameters

GetQuer

GetFragment

GetBase

GetReferer

Resolve

EscapeString

UnescapeString

loadString

 

WML Browse函数?/span>

Get Var

SetVar

Go

Prev

NewContext

GetCurrentCard

Refresh

 

Dialogs  函数?/span>

Prompt

Confirm

Alert




zhyiwww 2006-07-05 15:47 发表评论
]]>
W五?WMLScript脚本E序设计Q下Q?转蝲)http://m.tkk7.com/zhyiwww/archive/2006/07/05/56780.htmlzhyiwwwzhyiwwwWed, 05 Jul 2006 07:36:00 GMThttp://m.tkk7.com/zhyiwww/archive/2006/07/05/56780.htmlhttp://m.tkk7.com/zhyiwww/comments/56780.htmlhttp://m.tkk7.com/zhyiwww/archive/2006/07/05/56780.html#Feedback0http://m.tkk7.com/zhyiwww/comments/commentRss/56780.htmlhttp://m.tkk7.com/zhyiwww/services/trackbacks/56780.html

W五?WMLScript脚本E序设计Q下Q?/h1>
[日期Q?span id="TimeLabel">2004-11-23] 来源Q?span id="SourceLabel">赛_|?/a>  作者: [字体Q?a href="javascript:ContentSize(16)">?/a>?/a>?/a>]
5.2 函数的声明与调用

在WML Script中,函数是一U能够完成某U功能的代码块,q可以在脚本中被事g处理或被其他语句调用Q也可以被WMLE序所处理和调用。一般地Q当我们~写WML Script脚本Ӟ如果脚本中的代码长度q是很长Q则一般还可以Ҏ功能函数再q行划分Q分成ؓ几个功能更加单一的函数。虽然说q样寚w代码的处理方法ƈ不是~写脚本E序的强制性要求,但通过函数的划分和q用Q我们可以得WML Script脚本h更好的可L,也便于我们对脚本E序的编写与调试。而且Q如果在某些脚本中有多处完全相同的代码块Q那么我们也可以这些代码快些ؓ一个函敎ͼ然后在脚本中调用q个函数Q从而提高代码的重要性,化代码的~写工作?br />
WML Script的函数共用和Jave语言、C/C++语言的函数有所不同。我们知道,Jave语言、C/C++语言中有函数和过E之分,函数能够完成一定的功能q有q回|而过E进可完成一定的功能但没有返回倹{可是,WML Script中ƈ不区分函数和q程Q因为它只有函数Q没有过E。WML Script的函数完成一定功能后始终有返回|不过q回值分两种情况Q即非空的返回值和I字W串Q?"QŞ式的q回倹{前者是真正的返回|后者其实相当于没有q回倹{也是_WML Script中的函数同时h其他语言中的函数和过E的功能?br />
5.2.1 函数的声?br />
使用函数Ӟ要根据函数的调用使用Q而调用函数前必须声明函数Q也是需要先定义函数。WML Script中定义函数的一般方式如下:

function函数名(参数列表Q?br />
{

代码?br />
}Q?br />
另外QWML Script规定使用extern关键字来声明一个外部函敎ͼ

extern function函数名(参数列表Q?br />
{

代码?br />
}Q?br />
从中可以看出Q函数的定义有以?部分l成Q?br />
Q?Q函数名。即函数的名Uͼ其命名规则应遵守WML Script的标识规则。调用函数时都是通过函数名进行调用的Q所以函数必要有函数名?br />
函数命名Ӟ一般要使用能够描述函数功能的但此来作ؓ函数名,也可以用多个单词组合进行命名,q样做的好处是能够提高WML Script脚本的可L?br />
函数名在同一个WML Script脚本文g里必L唯一的。如若不Ӟ则会D函数定义混ؕ?br />
Q?Q参数列表。即调用函数旉要的参数。参数列表通常是可选的Q有的函数需要,有的函数可能不需要。参数列表的作用是向函数传递一些参敎ͼ使得函数可以直接使用q些参数的倹{?br />
调用函数的时候,参数个数和类型必d函数定义C所声明的参C数即cd保持一致。而且函数的参数就如同似函C内的局部变量,它们在函数调用的时候被初始化?br />
Q?Q代码块。它是函数的M部分。代码块中的代码包含在以对花括号Q{ }Q中Q代码块可以执行q完成函数的功能。编写代码块是应当遵循WML Script的编E规则?br />
有时Q函数需要返回一个值给调用函数的语句,则应该在代码块的后面一行用return语句Q返回所需的数倹{?br />
与C/C++{语acMQWML Script的函数是可以嵌套的,以就是说Q在一个函Cq可以调用其他函数。但是,函数声明是不能嵌套,q是WML Script的强制性规定?br />
下面几行语句是定义函数的简单例子:

function currencyConverter(currency,exchangeRate)

{

return currency*exchangeRate;

};


其中Q该函数的名UCؓcurrencyConverter,参数有currency和exchangeRate两个Q函C码块包含一条语句,用于q回currency和exchangeRate的乘U?br />
下面是一个用extern定义外部函数的例子。其中函数名为textIt,它没有参敎ͼ函数体中定义了两个赋值变量,一个赋整数Q一个赋函数|

extern function testIt(){

var USD=10Q?br />
var FIM =currencyConverter(USD,5.3)

};

5.2.2 函数的调?br />
~写好的函数必须l过合法的调用,才可以发挥它应用的作用。函数调用将q回一个|比如一个计结果。WML Script中的函数主要可以分ؓ内部函数、外部函数和库函敎ͼ下面我们׃l这3cd数的调用Ҏ?br />
内部函数

所谓内部函数是指函数的定义与其调用函数在同一个脚本文件内的函敎ͼ对内部函数的调用UCؓ内部调用。内部函数的调用非常单,只需提供函数名和所需参数值即可,参数值必d函数定义时指定的参数个数即类型一致。而且函数调用需要用操作符来接收或处理被调用的q回倹{?br />
内部函数可以在其定义之前调用Q也可以在其定义之后调用。例如,下面是一个在函数定义之后调用的例子?


function test1(val){

return val*val;

}Q?br />
function test2(param){

return test1(param+1);

};


q个例子中定义了两个函数test1和test2。test1函数用于计算l定参数值的qxq将l果q回Qtest2函数给定的参数值加1Q然后这个和为参数|来调用test1函数Q得到结果后在将l结果返回到调用test2函数的语句?br />
注意Q本例中test2函数调用了test1函数Q这U在函数中调用其他函数的ҎUCؓ函数调用嵌套。WML Script的内部函数、外部函数和库函数都支持嵌套调用Q后面我们专门介l这斚w的内宏V?br />
外部函数

外部函数使一个在WML Scrupt外部文g中定义的函数。调用外部函数的Ҏ与调用内部函数的Ҏ基本cMQ不同之处在于调用处外部函数时一是要指定外部文g的地址卛_Uͼ二是要在调用的外部函数名的前面加上外部文件的名称?br />
WML Script规则使用use url来指定外部文Ӟ语法格式为:

use urlq有外部函数的外部文件名 外部文g所在的URL;

q样QWML Script的预~译头就可以外部文件映ؓ一个可以在内部使用的标识。然后,使用q个标识q加上井号键Q?Q和标准的函数调用即可实现外部函数调用,语法格式为:

外部文g?外部函数Q参数列表)Q?br />
例如Qhttp://www.host.com/script下有我们需要的外部文gQ名为OtherScript,所以我们可使用use url来指定该文gQ?br />
use url OtherScript"http://www.host.com/script"

q一外部文g中含有我们需要调用的外部函数testme,则可采用“外部文件名#外部函数Q参数列表)”的形式来调用它Q?br />
OtherScript#testme(param+1);

q个例子完整的写出来Q就是下面的E序Q?br />
use url OtherScript"http://www.host.com/script"

function test(param){

return OtherScript#testme(param+1);

};

库函?br />
特别指定QWML Script的库函数一律是指它的标准库函数。因Z标准库函数对应,WML Scriptq有一些非标准的库函数。我们这里先介绍标准库函敎ͼ非标准库函数后面再介l?br />
所有库函数都有所数的库,函数的库中通常含有一cd数。因此,调用某个库函数时Q一要指定它的库名,二要指定它的函数名。WML Script规定Q调用标准库函数时可以通过在函数库的名字后面加上句点号Q?Q和库函数的标准调用来实玎ͼ语法格式为:

函数库名.函数名(参数列表Q;

例如QWML Script的Q点库即Float库中有一个开Ҏ的函数sqrt,该函数只有一个参敎ͼ那么调用squrt库函数的Ҏ为:

Float.sqrt(number);//q里要求number大于或等?

下面l出了调用库函数的简单例子。首先一param参数D用Lang.abs()函数Q返回结果加1后再作ؓ参数调用Float.sqrt()函数Q它的返回结果作为内部函数test的返回|

function test(param){

return Float.sqrt(Lang.abs(param)+1)Q?br />
}Q?br />
2.3 函数的嵌套调?br />
WML Script的函数定义都是互相^行、独立的Q定义函数的时候我们不能在一个函数内定义另外一个函敎ͼ也就是说Q函数定义是不能嵌套的。但是,函数调用是可以嵌套的,也就是说Q我们可以在调用一个函数的q程中调用另外一个函数?br />
它的执行q程是:

Q?Q执行a函数开头部分;

Q?Q遇到调用b函数的操作语句,程则专区执行b函数Q?br />
Q?Q执行b函数开头部分;

Q?Q遇到调用c函数的操作语句,程则专区执行c函数Q?br />
Q?Q执行b函数,如果没有其他嵌套的函敎ͼ则完成c函数的全部操作;

Q?Q返回调用c函数的语句,卌回到b函数Q?br />
Q?Ql执行b函数中尚未执行的操作Q直到b函数l束Q?br />
Q?Q返回a函数中调用b函数的语句;

Q?Ql执行a函数的剩余操作,直到函数l束?br />
function myFunC(param1){

return param1*param1=Float.squt(Lang.abs(param)+1)Q?br />
}Q?br />
function myFunB(param0){

return myFunC(param0+1)*|param0+12;

};

function myFunA(param){

return myFunB(param*param+1);

};


5.3 预编?/b>

WML Script的预~译主要用于在编译阶D|制编译器的行为。与~译头一般在文g开头和函数声明之前指定QWML Script规定所有的预编译头都是一关键词use加上指定的预~译属性进行指定?br />
在大多数的编E中Q我们比较长用的预编译行Z要涉及外部文件声明、访问权和Meta信息讄?br />
5.3.1 外部文g

我们知道Q用URL地址可以定位一个WML Script文g。利用该URL地址Q在WML Script~程中我们可以通过预编译来调用WML Script的外部文Ӟ外部文g预编译头的声明方法是use urlQ其语法格式如下Q?br />
use url外部文g?"URL"地址

q样Q我们在当前文g的编E中可以用该预编译头声明的外部文Ӟ从而可以调用该外部文g的函数。其语法格式为:

外部文g?函数名(参数列表Q;

例如Q我们希望在当前的WML ScriptE序中调用OtherScript外部文g中的check()函数Q而且我们知道OtherScript文g的URL地址为http://www.host.com/app/script。因此,我们可以使用use url来声明这一外部文gQ?br />
use url OtherScript"http://www.host.com/script"

随后Q我们就可以在程序中调用OtherScript中的check()函数了:

function test(par1,par2)

{

return OtherScript#check(par1,parr2);

};

其中调用执行的过E如下:

Q?Q找到WML Script外部文g的URL地址Q?br />
Q?Q当前函C指定的URL地址D载外部文Ӟ

Q?Q检外部文件的内容Qƈ执行其中的checkQ)函数?br />
ure url 预编译头指定的外部文件名在当前程序中必须唯一Q用户不能指定不同URL地址的同名外部文Ӟ否则在调用外部文件时׃发生混ؕ?br />
另外Quse url预编译头中的URL地址也可以是相对URL地址。相对URL的v始位|是当前E序文g所在的位置Qƈ在此基础上根据URLq行定位?br />
如果URL地址中的字符包含有{义字W,则WML Script根据{义要求进行{义。不q,E序在编译的时候编译器q不会对他们q行转义Q而是在程序执行时完成Q检查URL格式和URL地址的有效性?br />
5.3.2 讉K权限

我们可以使用讉K权限预编译设保护文g的内容,实现讉K控制。WML Script~程中,必须在调用外部函C前用访问权限预~译头声明外部文件的讉K权限。不q,WML Script讉K权限查的~省值是不进行检查,即disabled.但访问权限一l声明,以后当调用外部函数的时候,~译器就会检查外部文件的讉K权限Q以军_调用q是否有权用该文g及其内含函数?br />
讉K权限预编译头的声明方法是use access,其语法格式如下:

use access domain操作域名 path操作路径Q?br />
讉K权限预编译头通过指定domain和path属性来军_~译器将要进行什么样的检查工作。如果文件有domain或者path属性,那么文g所在的URL必d属性中的g致。比较时Q域和\径都依据URL大写规则q行比较。具体的比较预则如下Q?br />
Q?Q操作域与URL中的域后~相匹配。与后缀匚w是值所有的子域从后向前都必M致。例如:www.wapforum.org和wapforum.org相匹配,而与forum.orgq不匚w?br />
Q?Q操作\径和URL中的路径前缀相匹配。\径前~匚w是g前向后必M致。例如:?X/Y”与?X”相匚wQ而不是和?XZ”相匚w?br />
Q?Q却省的domain数行为当前的文g域,是?”?br />
不过Qؓ了简化编E,有时WMLScriptq不需要直到外部文件的l对路径Q我们只需提供文g的相对URL卛_Q用h览器执行E序是卡相对路径自动转换为绝对\径,Ҏ路径属性进行匹配。例如:如果讉K权限预编译头及其指定属性ؓQ?br />
use access domain"wapforum.org"path"/finance";

则可以用以下的路径来调用指定文件中的外部函敎ͼ它们都符合相对URL地址匚w规则Q?br />
http://wapforum.org/finance/money.cgi

http://www. wapforum.org/finance/money.cgi

http://www. wapforum.org/finance/demos/packages.cgi?x+123&y+456

而以下的路径调用则非法的Q因为它们或者操作域不对Q或者URL地址不能与指定的相对URL相匹配:

heep//www.test.net/finance

http//www.qapforum.org/internal/foo.wml

需要强调指出的是,WML Script规定Q同一E序中只能定义一个访问权限与~译_否则׃D~译错误?br />
5.3.3 Meta 信息

我们q可以通过与编译头的Ş式声明WML Script文g的Meta信息。Meta信息主要用于指定文g所需Mete属性的属性名QProperty name)、属性?Content)以及文g的配|(信息Q,属性都属于字符串类型的数据。Mate信息域编译头使用use meta声明Q其语法格式为:

usr meta 属?该属性Meta信息Q?br />
Meta的属性主要包括Name、HTTP Equiv和User Agent三种Q下面我们分别讲解它们的声明ҎQ?br />
Q?QName。该属性用于指定服务器使用的Meta信息。这些信息仅供服务用,用户览器ƈ不理会这些信息?br />
例如Q以下Name属性的Meta信息指定了服务器的创建时_

use meta name "Created""26-June-2000";

该信息只会作用于服务器,而不会媄响用h览器的操作?br />
Q?QHTTP Equiv。该属性用于指定需要解释ؓHTTP头的Meta信息。对于已l编译的文g来说Q当它到辄h览器前,WML Script根据HTTP Equiv属性指定的Meta信息文件{换ؓWSP或HTTP的响应头,q行文g的解释和执行?br />
例如Q以下声明的http equiv属性指定按照脚本语a的关键字来解释当前文Ӟ

use meta http equiv"Keywords""Script,Language";

(3)User Agent。该属性用于定义用h览器使用的数据类型。例如:

use meta user agent"Type""Test";

它指定当前数据必ȝ卛_送给用户览器,然后马上清除掉?br />
5.4 执行时的错误与处理

WML Script函数的功能提供用h务,q希望用L面能在Q何的状况下运作顺利,因此错误的处理是最大的NQ这表示了语a可能不提供预期的机制Q如他应该可以防止错误发生或提醒用户注意q取适当的动作,U植储蓄执行是最后的手段。下面几个小节列Z当ؓ码下载ƈ执行时会发生的错误,一些程序上的错误ƈ不在谈论的范_如无I@环)Q像q类的例子就需要手动来l止?br />
5.4.1 错误?br />
错误工兯让你错误但会干扰系l的动作Q因为WML Script是弱格式语言Q所以由一些特D功能的工具来检有invalid数据格式所引v的错?

给定的变量包含的是正确|WML Scritp含有格式认函数库程序如QLang.isInt()Lang.isFloat()、Lang.parseInt()、Lang.parseFloat?br />
给定的变量包含的只是正的格式QWMLScript含有q算Wtypeof与isvalid能让你用?br />
5.4.2错误处理

错误处理是在发生错误之后Q有些状冉|错误无法防止的Q如内存限制后外部信LQ或者是数据很难处理Q如溢出QoverflowQ或亏失QunderflowQ?而这些状况可以分Zc:

严重错误QfatalerrorQ?q种错误会造成E序l止Q因为WML ScritpE序会让一些用L面调用,E序l止通常会跟调用它的用户界面发出信号Q用L面就会告知用戯个错误?br />
错误Qnon-fatalerrowQ?q种错误会把信号传回E序Q如一些特D的|然后q序决定所要采取的行动?br />
下列的错误是Ҏ他们的严重性来区分?br />
5.4.3 严重错误QfatalerrorQ?br />
下面的小节会讨论WML Script的严重错误?br />
位码错误Qbytedode errorQ?br />
q些错误跟位码与由WML Script位码解译器所执行的指令有关他们指Z错误的元素群、无效的指o、指令所使用的参数无效,或指令无法执行?br />
验证错误Qverification failedQ?br />
说明Q调用的E序中的特定位码无法通过验证?br />如何发生Q每ơ程序试着用外部程序?br />范例Qvar a = 3*OtherScript#doThis(param)
严重性:严重?br />判定状况Q当位码验证式?br />解决ҎQ终止程序与WML Script解译其调用者的错误信号?br />
说明Q调用一个函数库E序时发生严重错误?br />如何发生Q每ơ调用函数库E序?br />范例Qvar a = string.format(param)
严重性:严重?br />判定状况Q无
解决ҎQ终止程序与WML Script解译其调用者的错误信号?
说明:调用函数参数的数目跟被调用函数的参数数目不符合?br />如何发生Q调用外部程序?br />范例Q编译器参生一个无效的参数l予指o使用Q或者被调用的程序参数数目改变了?br />严重性:严重?br />判定状况Q无
严重性:严重?br />解决ҎQ终止程序与WML Script解译器调用着的错误信受?br />
说明: 在特定的E序中找不到所需要的外部E序?br />如何发生Q调用外部程序?br />范例Q?var a =3*OtherScript#doThisQparamQ?br />严重性:严重?br />判定状况Q无
解决ҎQ终止程序与WML Script解译器调用着的错误信受?br />

说明: ׃在网l服务器的程序存取又无法修复的错误或特定E序q不在网l服务器中所引v的程序无法蝲入?br />如何发生Q调用外部程序?br />范例Q?var a =3*OtherScript#doThisQparamQ?
严重性:严重?br />判定状况Q无
解决ҎQ终止程序与WML Script解译器调用着的错误信受?br />
说明: 存取错误Q所调用的外部程序加了保护?br />如何发生Q调用外部程?br />范例Qvar a =3*OtherScript#doThisQparamQ?
严重性:严重?br />判定状况Q无
解决ҎQ终止程序与WML Script解译器调用着的错误信受?br />
说明: 因ؓE序错误造成stack underflow?
如何发生Q程序要取出QpopQ一个空?br />范例Q?当组译器产生错误码?br />严重性:严重?br />判定状况Q无
解决ҎQ终止程序与WML Script解译器调用着的错误信受?br />
说明:执行调用Lang.abortQ) 是发生的错误?br />如何发生Q每当程序调用Lang.abortQ)函数?br />范例Q?Lang.abort("unrecoverable error")
严重性:严重?br />判定状况Q无
解决ҎQ终止程序与WML Script解译器调用着的错误信受?br />
说明:发生堆栈溢出?
如何发生Q程序资源太多或要推入太多的变量到运之中?br />范例Q?function f|QxQ(fQx+1Q;Q;
严重性:严重?br />判定状况Q无
解决ҎQ终止程序与WML Script解译器调用着的错误信受?br />

说明:没有多余的内存可供解译器使用?br />如何发生Q作业系l无法配|多余的I间l解译器适用?br />范例Q?function fQxQ{
x=x+"abcdefghijklmnopqrstuvxyz";
f(x) ;
};
严重性:严重?br />判定状况Q无
解决ҎQ终止程序与WML Script解译器调用着的错误信受?br />
说明:用户l止E序的执?如按下reset?
如何发生Q随时?br />范例Q?当应用程序正在执行是用户按下reset钮?br />严重性:严重?br />判定状况Q无
解决ҎQ终止程序与WML Script解译器调用着的错误信受?br />
说明:当程序执行中Q发生了外部严重的错误?br />如何发生Q随时?br />范例Q?电力微弱Q系l自动?br />严重性:严重?br />判定状况Q无
解决ҎQ终止程序与WML Script解译器调用着的错误信受?br />
5.4.4 一般错误(Nonfatal errorQ?br />
下面说明了WML Script的一般错误:

计算错误Qcomputational errorQ?br />
q些错误是由于WML Script数学上的q算所造成?br />
除以Ӟdivide by zeroQ?br />说明Q发生了除以零的状况
如何发生Q当E序中有除以零的状况?br />范例Qvar a= 10Q?br />var b= 0Q?br />var x= a/bQ?br />var y= a div bQ?br />var z= a%bQ?br />a/=bQ?br />严重性: 一般?br />判定状况Q高
解决ҎQ生结果ؓinvalid?br />
说明Q发生了除以零的状况
如何发生Q程序要执行点数运?br />范例Qvar a = Float.precision();
var b = Float.precision();
var c = a* b
严重性:一般?br />判定状况Q高Q在某些状况很困难?br />解决ҎQ生的l果为QҎ?.0

常数参考错误(constant reference errorQ?br />
说明Q所参考的点数实字ؓnot a number?br />如何发生Q程序试着存取一个QҎ实字但组译器产生了not a number的QҎ常数?br />范例Q参考QҎ常数?br />严重性:一般?br />判定状况Q高
解决ҎQ这会生invalid倹{?

说明Q参考的点数实字不是正无穷大就是负无穷大的点数常数?br />如何发生Q程序试着存取一个QҎ实字但组译器产生了正无穷大或负无I大的QҎ常数?br />范例Q参考QҎ常数?br />严重性:一般?br />判定状况Q高
解决ҎQ这会生invalid倹{?br />
说明Q需要参照QҎ值所发生的错误?br />如何发生Q程序需要用QҎg环境值支持整数倹{?br />范例Qvar a = 3.14;
严重性:一?br />判定状况Q高
解决ҎQ这会生invalid倹{?

转换错误

q个错误的发生同WML Script所支持的自动{换有兟?br />
说明Q欲转换成整数|但这个Dq整数所能接受的范围Q正或负Q?br />如何发生Q程序试着自动转换成整数时?br />范例Q?var a = -"99999999999999999999999999999999999999999";
严重性:一?
判定状况Q高
解决ҎQ这会生invalid倹{?
说明Q欲转换成QҎQ但q个值小于QҎ所能接受的范围Q正或负Q?br />如何发生Q程序时D动{换成点数时?
范例Qvar a = -"99999999999999999999999999999999999999999";
严重性:一?
判定状况Q高
解决ҎQ这会生invalid倹{?

说明Q欲转换成QҎQ但q个值小于QҎ所能接受的范围Q正或负Q?br />如何发生Q程序时D动{换成点数时?br />范例Qvar a = -"99999999999999999999999999999999999999999";
严重性:一?
判定状况Q高
解决ҎQ这会生QҎ0.0?/div>

zhyiwww 2006-07-05 15:36 发表评论
]]>W四?WML Script语法基础(转蝲)http://m.tkk7.com/zhyiwww/archive/2006/07/05/56676.htmlzhyiwwwzhyiwwwWed, 05 Jul 2006 03:28:00 GMThttp://m.tkk7.com/zhyiwww/archive/2006/07/05/56676.htmlhttp://m.tkk7.com/zhyiwww/comments/56676.htmlhttp://m.tkk7.com/zhyiwww/archive/2006/07/05/56676.html#Feedback0http://m.tkk7.com/zhyiwww/comments/commentRss/56676.htmlhttp://m.tkk7.com/zhyiwww/services/trackbacks/56676.htmlW四?WML Script语法基础
[日期Q?004-11-23] 来源Q赛q网  作者: [字体Q大 ?]

WML Script是属于无限应用协议WAP应用层的一部分Q用它可以向WML卡片l和卡片中添加客L的处理逻辑Q目前最新的版本?.1版。WML Script1.1是在Ƨ洲计算机制造商协议会制定的ECMAScript脚本语言的基上,l过修改和优化而指定的。它能够更好的支持诸如移动电话类的乍带宽通信讑֤Q在WML~程中用WML Script可以有效的增强客L应用的灵zL,而且Q我们也可以把WML Script作ؓ一个工具用,开发出功能强大的WAP|络应用和无限网c本章我们将详细讲解WML Script1.1~程的基预法制时Q如基本规则、变量预数据cd、操作赋予表辑ּ{。ؓ了叙qC的简便,以后我们“WML Script1.1”简U“WMLScript ”?/p>

4.1 WML E序中调用WML Script函数

l过前两章的学习Q熟悉C语言的读者可能会认识刎ͼWML 的函数功能、逻辑q算功能{都是十分有限的。而WMLScript提供了丰富的函数功能Q我们在WAP应用开发可以用WMLScript来增强WML~程。因此,WMLScript成ؓ扩展WML~程能力的主要开发工兗?/p>

4.2 WMLScript的主要优点及其字节码解释?/p>

WMLScripth一套定义好的字节码和一个解释器参考结构。无U网l传输中WMLScript的数据均以二q制格式q行传输Q所以,用户可以使用乍带宽通信信道Q从而能够保持客L手机只需要最限度的内存。ECMAScript修改后得到的WMLScript能够更快、更、更Ҏ的编译程序ؓ字节码Ş式。所有这些特点,是WMLScript具备了WML所不能具备的很多优点和功能?/p>

4.2.1 使用WMLScript的主要优?/p>

WMLScript的设计宗旨是为WMLScriptpȝ提供一般的脚本处理能力Q用WMLScript我们可以q一步补充基于XML的WML语言的编E功能,开发针对乍带宽的网l应用及内容Q如文本、图像、选择列表{,我们可以使用单的格式~写出更灉|和更具可L的用户界面。WMLScript具备的WML所不能具备的优点和功能Q主要包括如下几个方面: Q?Q检查用戯入的合法性:

Q?Q扩展用h览器的功能,比如允许E序员开发手机的电话呼叫、发送短信息、存储电话号码、管理电话簿或SIM卡等Q?/p>

Q?Q生成用L的确认、提C、警告信息或操作对话框,q之快速显C在览器上Q?/p>

Q?Q在用户览器的更改后,能够Ҏ览器端的软g和参数进行扩展与配置Q?/p>

Q?Q最大程度克服客L的乍带宽通信q接限制Qƈ提供丰富的程序功能;

Q?Q补充WMLq之实现针对微型移动终端设备的多种服务Q如支持高用户界面、增加客L型、提供用h览器外围功能的访问能力,以及在服务器与客L览传输数据是减带宽占用等?/p>

4.2.2 WMLScript的字节码解释?/p>

在WMLScript的字节码解释器解释之前,WMLScript语言~写的文本格式的E序被首先~译Zq制格式的代码。编译时Q编译器通常先将WMLScriptE序分成若干个编辑单位,每个单位的程序都包含一定数量的语句行和WMLScript函数Q然后,WMLScript的编译器按照这些编译单位,逐一WMLScriptE序作ؓ输入内容Q而把对应的字节码作ؓ输出内容。当用户通过WAP手机调用WMLScriptE序Ӟ~译器的~码功能卌ȀzR执行?/p>

4.3 WMLScript基本规则

WMLScript在许多基本规则方面沿用了WML的做法。不q,׃WMLScript是以C语言本而指定的Q所以它的语法特征和C语言非常相像。如果大家对C语言比较熟悉Q那么学习和掌握q部分内容应当是比较Ҏ的?/p>

4.3.1 WMLScript与URL

与WML一PWMLScript也沿用了WWW和HTML讉K资源的URL、HTTP{规范,q扩大了URL使用的范围。在WMLScript中,不仅链接、文件\径即文g名可以作为URL处理Q外部函数、访问控制信息等也可以作为URL处理?/p>

为此QWMLScript采用了WML的变通方法,xqHTML命名资源为值的方式Q采用程序段锚点QFragment AnchorQ的形式来处理资源定位。程序段锚点Ҏ文档URL规则q行定义Qƈ按照E序D|识符前加井字P#)的方式书写。用程序段锚点QWMLScriptE序可以在WMLScript~译单位内可L指定的函敎ͼq可在调用该函数的同时传递所需的参数?/p>

4.3.2 词法l构

WMLScript~程中的词法l构q不复杂Q我们下面就从大写敏感、空根{换行、注释即保留字等斚w讲解相关的具体规则?/p>

Q?Q内容类型。WMLScript的内容类型主要针Ҏ件Ş式和二进制Ş式两U情况,cdl构可以在服务器端进行指定,具体形式为:

文本形式Qtext/vnd.wap.wmlscript;

二进制Ş式:application/vnd.wap.wmlscriptc?/p>

具体指定Ҏ我们在第4章已l介l过Q这里不再重q?/p>

Q?Q大写敏感。WMLScript1.1是一U大写敏感的脚本语a。它所设计的各U关键字、变量和函数名都必须合理的用大写?/p>

Q?Q空格和换行。一般情况下QWMLScriptE序值Ş式将忽略所有的I格、制表符合换行符{。但如果把这些特D字W通过代码q行表述Q或者作为字W串q行处理ӞWMLScript不再忽略它们。了如,字符?Oct 28,2001"中含有空|该空格在执行时就不会被忽略,它与不含I格的字W串"Oct28,2001"是不同的?/p>

Q?Q注释。与WML~程一P在WMLScript脚本E序中也可以加入注释内容。注释内容不被程序执行,且注释不能嵌套。WMLScript的注释方法有两种Q?/p>

其一Q行注释。即使用双斜行号Q?/Q引g一行内?q一行内容全部作为注释内宏V如Q?/p>

//q是以行注释Q由双斜杠号开始到l束都是注释?/p>

其二Q块选择。即以符号?*”开始,而以W号?*”结束的期间所有内定w是注释内宏V如Q?/p>

/*q就是块注释Q加在中间的内容是注释内容*/

Q?Q数据类型与直接~码。WMLScript允许?U类型的数据直接~码q可嵌套q可嵌如在程序之中。直接编码的4中数据类型ؓQ整数、QҎ、字W串和布倹{另外,“无效性”g可直接编码?1. 整数。当以十q制、十六进制或八进制方式用整数时Q可对这cL数进行直接编码?/p>

~程序时Q十q制的数字均不以0开_只包?~9的数gQ十六进制的数据以OX或者Ox开_只包?~9、a~f或者A~F的字W串Q八q制的数均以0开_只包?~7的数字串?/p>

2.点数。QҎ通常定义为含有小数点的数字,可以包含数和指数部分。QҎ的Ş式较多,可以使十q制的整数或点敎ͼ可以是分敎ͼ也可以是指数Q但一个QҎ必须臛_有一个数?/p>

指数是以e或E开_后面跟着一个整数。指数是?0为底q。例如:e0?0的零ơ幂Q例如:e0?0的另ơ幂Qe-2?0的负2ơ幂集等?.01。指数可以带W号Q正好(+Q或者减P-Q,它们分别代表是正指数和负指数?/p>

3.字符丌Ӏ字W串是指定义在成对的双引P""Q或单引P?’)之间的内宏V?/p>

׃WMLScript只允怋用成对的双引h但引h定义字符Ԍ所以程序中使用一个单引号或一个双引号时就会出现编译错误?/p>

考虑到有些特D字W不能在字符串中直接昄出来Q所以WMLScript提供了{译序列来表示q些Ҏ字符?/p>

4.布尔型。它只是ture和false两个数|用于表示WMLScript中的“真值”或“假值”。布型数据可参与异、或{运,具体规则我们后面介绍?/p>

5.无效型。也UCؓ“空cd”,它是WMLScript支持的一个表C无效值的量,以invalid表示。该两与C语言中的NULLcM?/p>

4.保留字。WMLScript中定义有一个保留字集合Q含有一些表C特D意义的单词q些ơ不能另外定义,也不能最为其他标识符。WMLScript中的保留字如下:

acces http agent if break isvalid continue meta header

div name div= path domain return else typeof while

equiv url extern use for user function var

另外QWMLScriptqؓ来的版本预留了一些保留字Q主要有Q?/p>

case finally catch import class private const public debugger

sizeof default struct do super enum switch export throw

extends try

WMLScriptq有一些没有用的保留字:

delete null in this lib void new with

7.标识W。WMLScript的标识符可以指定或命?U元素:变量、函数和标注。标识符不能以数字开_但能一D下划线Q?Q开_而且Q标识符不能是WMLScript的保留字。例如,timeOfDay、speed 、quality、HOME_ADDRESS、_myName、__、varO{都是合法的标识W;而以数字或非短下划线的特D符号开头的字串Q以及保留字{都属于不合法的标志赋,如while、for、if、my~name?sys?23?piecs、take.this{?/p>

׃WMLScript是严格区分大写的,所以字母相同但大小写不同的标识W不是同一个标识,例如QWork和work是不同的标识符?/p>

8.名称I间。WMLScript提供了比较自q名称I间Q同一标识W可以同时用作不同的目的。例如,作ؓ某一函数名称的标识符Q还可以同时用作变量名、函数参数、程序标注等Q用时他们的属性或值等q不怺影响。在下面的简单的例程中,myTestq一标识W即用作了函数名Q又用作了变量名、函数参数名、函数参数名、常量名。显ӞWMLScript的这一特定为我们编写程序提供了很大的方ѝ?/p>

4.3.3 WMLScriptE序的基本书写规?/p>

WMLScriptE序的基本书本写规则Q?/p>

1.E序pq语句或函数l成Q函数有pq语句组成;

2.每个完整的语句后面必d上分PQ)Q语句关键词语操作数之间必须有空_分号Q;Q是WMLScriptE序的组成部分;

3.函数体之间必M用成对的花括P{ }Q括hQ而且函数l束时在双括号Q}Q的后面q要加上分号Q;Q;函数说明部分Q如函数名、函数类型、函数参数等要放在花括号Q{})的前面;

  4.有些语句可能也需要实用花括号Q{ }Q办含内容,q类语句通常也可以放在函CQ所以花括号Q{ }Q是可以嵌套的?/p>

当然Q不同的语句、参数、变量等元素在声明和书写时可能还有一些更l的要求Q具体我们后面介l这些元素是再专门给出,

4.4 变量与数据类?/p>

变量x据类型是所有编E语a的概念和l成部分QWMLScriptҎ也不例外。它对其变量使用Ҏ和数据类型定义方法给Z详细的规定。变量通常与某数据之相对应Q我们可以给变量赋|q可在程序执行中改变变量的倹{下面我们讲解WMLScript有关变量与数据类型的详细规定?/p>

4.4.1变量及其声明

变量是在WMLScript脚本E序中具有值的W号名,或说标识W。用变量可以存储和改变E序中需要的数据。与C语言不同的是QWMLScript仅支持函数内定义的变量或用于传送数的参变量?/p>

变量使用前必进行声明,也就是定义变量,x定变量的名字。声明变量的关键字是varQ它的后面根上作为变量名的合法的标识W,q于最后加上分PQ)Q即完成一个量的声明。声明变量是可以使用var一ơ声明多个变量名Q相d量之间用都PQ)间隔?/p>

一般情况下Q我们在l变量命名的时候,都希望能够用有意义的变量名。例如,当需要用一个变量表CZ本书的h格时Q虽然将变量命名为j或book都没有什么错误,但若能命名ؓbookPrice则会是的WMLScript脚本E序h更好的可L,可以方便~程人员q行脚本的编写和调试工作。而且Q由于WMLScript在给变量命名是不能用保留字Q所以考虑到避免由于一时的疏忽时变量名Ʋ保留字发生冲突Q我们徏议用多个单词组合在以其作ؓ一个变量的名称Q这是一个比较好的解军_法。例如,如果要定义一个变量来存储的、一本书的h|那我们可以不妨用bookPrice或者book_price作ؓ变量的名Uͼq样Q一斚w可以时变量显得更加清晎ͼ另一斚w也可以避免变量与保留字的冲突问题?/p>

以上只是我们对于变量命名的徏议,q不是强制性的要求Q用户完全可以不按照我们的要求来做,只要遵守WMLScript对于标识W命名的要求可以了Q但L良好的编E风g论是对编Eh员还是对脚本~写人员来说Q都是十分有意义的?/p>

4.4.2 变量的作用域与生命期

一个变量的作用域是指在E序中能够引用这个变量的一D代码。由于WMLScript仅支持函数内定义的变量,所以WMLScript变量的作用与通常是定义它们的那个函数。在该函C外,变量不再发挥直接作用?/p>

变量的生命v始g变量声明开始到失效为止。变量的生命期也被称为变量的持久期、存zL。一个变量在定义它的整个函数内都是有效的Q函数内的Q何语句块都不会削减变量的生命期或限制变量的作用域?/p>

如果一个变量未l生命就直接使用Q或声明q后再次声明Q都会破坏变量的生命期。前一U情况会D变量没有开始声明期Q即没有“生命”;而后一U情况则D变量声明期没有结束以前就重新赋予声明期,卌它多ơ“降生”。这都会D变量无效使用。下面函C的变量用就说明了这一问题Q?/p>

function foo(){

x=1;//错误Q变量用前没有声明Q改变量q没有“声明”?/p>

var x,y,z;

y=x+3;

var zd =invalid

if(x){

var(y);//错误Q这一变量已经声明Q这里是重复声明?/p>

}Q?/p>

}Q?/p>

4.4.3 变量的?/p>

WMLScript的变量只能在定义它的函数内用。用时需要声明变量,声明变量是可以同时对变量赋|甚至对变量进行运。例如,下面的简单函数就说明了变量的q种灉|的用方法:

function ourAge(){

var myAge=38;

var yourAge=26;

var ourAge=myAge+yourAge;

return ourAge;

};

使用变量时可通过调用变量名字的Ş式来实现。上面例子中的“var ourAge=myAge+yourAge;”一句,通过调用变量名,变量ourAge对变量myAge和变量yourAge实行了求和操作?/p>

4.4.4 变量cd与数据类?/p>

WMLScript是一U“弱cd”的语言Q及其变量没有确定的cd。WMLScript变量的类型有改变量所赋数据的cd军_QƈҎ数据cd的改变而改变。WMLScript只支持内部定义的数据Q因此我们编写程序是无需指定WMLScript变量的类型,WMLScript减根据变量而赋数据的类型自动进行匹配。由于WMLScript的数据类型共有整数、QҎ、字W串、布型和“无效型”五U类型,所以WMLScript变量的类型所能匹配的也就是这五种cd?/p>

4.4.5 变量值域

׃变量cd其所赋数据的cd军_Q所以变量g域其所赋数据的可取范围{h的。下面的我们q出整数、QҎ、字W串和布型的区D_以参照确定应cd变量的值域?1.整数的范围。WMLScript支持的整数是32位的Q也是说整数的区D围是?147483648?2147483647。我们可以在E序q行期是用Lang函数来取得这些|如:

Lang.maxInt(); //获取最大的整数

Lang.maxInt(); //获取最的整数

2.点数的范围。它是指WMLScript点数的_ֺ所能表C的最和最大数值WMLScript支持32为的单精度QҎQ其最大至?.40282347E+38Q最的非零的数?.17549435E-38或更(按照正常的精度)?/p>

我们可以使用点Float函数库在E序q行其取得这些数|

Float.maxFloa(); //获得WMLScript所支持的最大Q点?/p>

Float.maxFloa(); //获得WMLScript所支持的最Q点?br />对于q行期出现的一些特D的点敎ͼWMLscript按照下q规则处理:

其一Q如果操作结果是一个不能被单精度QҎ所能表C的数|那么该结果将被认为是invalidQ即无效|

其二Q如果操作结果发生下溢出Q那么结果将作ؓ0.0处理Q?/p>

其三Q负的零和正的零是完全相{的?/p>

3.字符串的范围。Q何由于字母、数字或Ҏ字符l成的符号串都是WMLScript中定义的有关字符串的操作或String库中的函数控制字W串?/p>

4.布尔型数据的范围。布型数据只有ture和flase两个取|q也是布型变量的两U数倹{我们可以用布型数据取初始化或指定某一变量的数|或将布尔值变量写入一个需要布g为参数的语句。布值可以是数D的l果Q也可以是逻辑q算的结果?/p>

下面是定义布尔型变量ƈ赋初值的例句Q?/p>

var truth=truth;

var lie=!truth;


4.5 操作W与表达?/p>

在WMLScript中,表达式可以把变量、常量与操作W结合v来,l过q算能够产生一定的q算l果。表辑ּq算后生的l果可以是整数型、QҎ型、字W串型或布尔型的数据。其实,对于表达式我们ƈ不陌生,例如Q?+2是一个简单的表达式?/p>

WMLScript的表辑ּ主要有两U类型。一U是赋D辑ּQ即把数据赋l变量的一U表辑ּQ例如,myBook=3Q在q个表达式中Q将3 赋给变量myBookQ同Ӟq个表达式本w也有一个运结果,那就?。另外一U是q算表达式,它是指生一个运结果而不q行赋值操作的表达式,例如1+2是一个运表辑ּQ在q个表达式运生的l果?Q?但这个表辑ּq没有把q算l果赋给变量?/p>

在表辑ּq算的过E中Q表辑ּ中操作一个或q两个数据生运的W号做操作符Q被操作W操作的数据UC操作敎ͼ在WMLScript中我们会使用到各U操作符Q下面就Ҏ作符及有关的表达式进行详l讲解?/p>

4.5.1 赋值操作符

赋值操作符用于赋值操作,即给变量指定所需的数|它能把有操作数的q算l果l做操作敎ͼ最单的赋值操作符是?”,例如x=2Q就是将2赋值给变量x。在如以下几行语句都是赋值操作:

var="abc";

var b=a;

b="def";

赋值操作符不需要指定用对象,也不会改变赋值操作符双变量的数倹{WMLScript的赋值操作符主要包括以下几种Q?/p>

1.=。用于赋值操作,有操作数赋l左操作?/p>

2 +=。将有操作数与左操作数进行相见运,然后把运结果赋值给左操作数。例如,假设x=3Q那么x+=2q算后的l果为x=5?/p>

+=是比较特别的操作W,因ؓ它可以将两个字符串相q,所?=操作W也可以对字W串q行操作Q然后将q接后的字符串赋l左操作数。例如,假设x="Happy",那么x+="new Year"q算后结果是x="Happy New Year"?/p>

3.-=。将左操作数取有操作敎ͼ然后把运结果赋值给左操作数。例如,假设x=3那么x-=q算后的l果为x=1?/p>

4*=。将左操作属于有操作W进行相乘运,然后把运结果赋值给左操作数。例如,假设x=6Q那么x*=2q算后的l果为x=6?/p>

5/=。将x作属于右操作W进行相乘运,然后把运结果赋值给左操作数。例如,假设x=6Q那么x*=2q算后的l果为x=6?/p>

6div=。拥有操作数处理左操作数Q然后把q算l果中的整数部分赋值给左操作数Q例如x=7Q那么xdiv=2q算后的l果为x=3?/p>

7%=。功能是求余数ƈ赋|用右操作数除以做操作敎ͼ最后把q算得到的余数值给操作数。例如,假设x=7Q那么x%=3q算后的l果为x=1?/p>

8<<=。功能是带符号左位移q赋|卛_左操作和x作数q行左位UL作,在将l果赋给左操作数?/p>

9>>=。可左操作和右操作q行x作进行补零右位移操作Q在结果赋l左操作数?/p>

4.5.2 数学q算操作W?/p>

数学q算操作W可以对数值类型的操作数进行运,然后q回一个数值类型的q算l果?/p>

1+。这是加q算操作{,它对应着数学q算中的加法q算Q例如表辑ּ1+2的运结果ؓ3?/p>

加操作符q可以对字符串类型的操作数进行运,然后两个字W串相连h作ؓq算

2- 。即操作W,对应着速学q算中的减法q算Q例如表辑ּ2-1的运结果ؓ1?/p>

同时Q?”还是一个取负操作符Q当它作为取负操作符的是一个操作数Q取负操作符的功能ɘq回操作数的相反数?/p>

3*。这是乘操作W,它对应着数学q算中的乘法q算Q例如表辑ּ2*3的运结果ؓ6?/p>

4/。即除操作符Q对应着数学q算中的除法q算Q但WMLScript中的除法q算有些特别Q在WMLScript中,除法q算后的l果是一个QҎQ而不想C语言或者Java语言那样在整数进行除法运式井运结果强行{化整数。在WMLScript中,1/2=0.5Q而在Jave中,1/2=0?/p>

5div。这是整除操作符Q对应着数学q算中的整数q算Q运后的结果一个整敎ͼq一点与C语言或者Java语言中的情况是一LQ可以在整数q行除法q算式将q算l果转换整数?/p>

6%。即取模操作W,它对应着数学q算中的取莫q算Q也是两个操作相除,q回盔R后的余数?/p>

取模操作W主要用于判断一个数字是否能被另一个数字整除?/p>

((the Year%3==0))&&(the Year%100!=0))||(the Year%400==0)

其中&&代表的是逻辑q算中的与运,||代表的是逻辑q算中的或运,关于逻辑q算Q我们后面会详细介绍?/p>

7++。这是递增操作W,它只有一个操作数Q操作可以在操作W的左边Q也可以在操作符的右边,它所完成的运操作是操作数?。假设操作数名称为jQgؓ2Q那?+j?Q然后返回j的?Q而j++则实现返回j的?,然后j??/p>

在@环中Q我们常怼用到递增操作W的作用正好相反。递减操作完成的运操作是l操作数?。例如,假设操作数名UCؓj,gؓ2Q那?-j先将j?Q然后返回的?Q而j--是先q回j的?Q然后将j??/p>

4.5.3 位操作符

为操作符在运实现将操作转化32位的二进制数Q然后对每个操作数分别按位进行运,q算后在二q制的结果按照标准WMLScript数值类型返回运结束?/p>

1&。这是ؓ与操作符Q它可以对两个操作数按位q行于操作,其运规则是Q?/p>

0&0=0,0&1=0,1&0=0,1&1=1

2|。这是位或操作符Q它可以对两个操作数按位q行或操作,q算规则是:

0|0=0 Q?|1=1Q?|0=1Q?|1=1

3^。这是唯一或操作符Q它可以对两个操作按位进行异或操作,其运规则是Q?^0=0,0^1=1,1^0=1,1^1=0

4~。这是位非操作符Q它只有一个操作数Q可Ҏ作数按位q行非操作,q算规则是:~0=1Q~=0

5<<。这是左UL作,它可以对左操作数q行向左一位的操作Q由操作数给定了要移动的位数Q在Udq程中,左操作数的最低ؓ补充0?/p>

6>>。这是右UL作符Q它可以对左操作数进行向右移位的操作Q由操作数给定要Ud的位敎ͼ在移位的q程中,丢弃向右Uȝ位?/p>

7>>>。这是填0右移操作W,它与右移操作W相伹{当对证正数q行操作Ӟ它们的效果完全相同;不同之处在于Q当q行负整数右UL作时Q因责{化ؓ二进制后Q最高ؓ1Q所以在q行右移操作后,最高位仍然补充1Q而在q行?右移操作Ӟ最高ؓ补充的是0Q因此,q是负数{化ؓ正数?/p>

4.5.4 逻辑操作W?/p>

逻辑操作W可以将布尔cd的表辑ּl合hQ完成逻辑q算操作Q然后返回逻辑q算的结果——真或假Q这样就可以完成比较复杂的逻辑判断工作。逻辑操作共有3U;

1&&。即逻辑与操作符它只有在两个操作数都为ture的时候,q回l果为ture,在其他情况下Q返回结果ؓfalse或者invalid?/p>

2||。这是或操作W,它在两个操作数至有一个ؓture的时候,q回l果为ture,在其他情况下Q返回结果ؓfalse或者invalid?/p>

3!。即非操作符Q它只有一个操作数。当操作CؓtureӞq回l果为flaseQ返回结果ؓture.

4.5.5 比较操作W?/p>

比较操作W可以把操作数进行比较,然后q回一个逻辑|表明q个比较操作的结果是否ؓ真。比较操作的操作数可以是数值类型或者字W串cd的数据。比较操作符也常被称为关p运符?/p>

WMLScript支持的比较操作符共有6U,下面被介l一下?/p>

1. ==。即{于操作W,它可以比较两个操作数是否相等。如果两个操作数相等Q则q回tureQ否则返回false

2. Q?。即不等操作W。它可以比较两个操作数是否相{。如果两个操作数相等Q则q回false,否则q回ture?/p>

3. >。即大于操作{。其q算规则Ӟ如果左操作数大于x作数Q则q回ture?/p>

zhyiwww 2006-07-05 11:28 发表评论
]]>
W三?WML~程(转蝲)http://m.tkk7.com/zhyiwww/archive/2006/07/05/56673.htmlzhyiwwwzhyiwwwWed, 05 Jul 2006 03:01:00 GMThttp://m.tkk7.com/zhyiwww/archive/2006/07/05/56673.htmlhttp://m.tkk7.com/zhyiwww/comments/56673.htmlhttp://m.tkk7.com/zhyiwww/archive/2006/07/05/56673.html#Feedback0http://m.tkk7.com/zhyiwww/comments/commentRss/56673.htmlhttp://m.tkk7.com/zhyiwww/services/trackbacks/56673.html

W三?WML~程

[日期Q?span id="TimeLabel">2004-11-23] 来源Q?span id="SourceLabel">赛_|?/a>  作者: [字体Q?a href="javascript:ContentSize(16)">?/a>?/a>?/a>]
  元素和标{是WML的主要语法,它们军_了WML~程的基本原则。本章我们将从WML的元素、标{、属性等斚w详细讲解WML的编E方法。学习本章知识之前,读者应当了解WML元素与标{区别。WML的元素通常有一个首标签、内宏V其它元素及一个尾标签l成。也pQ单独的标签是一个元素,成对出现的标{与其包含的内容也构成一个元素。由于元素牵涉及标签Q标{֏涉及属性?br />
3.1 卡片、卡片组及其属?/b>

  我们前面介绍了WML的卡片与卡片l,主要从概念和怺关系的角度进行了分析。我们这里则从卡片、卡片组的组成、相兛_素、标{技术性等~程角度q行分析和讲解?3.1.1 共有属?br />
WML元素的共有属性主要有3个:id、class和xml:lang属性?br />
  WML的所有元素都有两个核心属性,xC(idQ和c(classQ属性。它们主要用于服务器方的信息传输。其中,id属性用于定义元素在卡片l中的唯一标示Q即它的名称Qclass属性用于给当前元素定义一个或更多的类QclassQ。与卡片l一Pc(classQ也是有名字的,而且多个元素可以使用一个类QclassQ名。具有相同类名的单一卡片l中的所有元素均可被看作相同cȝ一个部分。类名是区分大小写的。如果在class属性列表中Q一个元素多个唯一的类名,那么该元素可以看作这些类中的一部分。具有同一属性的多个cd必须用两个以上的I格间隔QWMLE序执行时将忽视其中多余的类名及其属性?br />
  另外Q在WMLE序Q所有包含文本的元素均具有“xml:lang”属性。该属性用于指定当前元素及其属性所用的描述语言Q如英国p、美国英语、法语、d语等Qƈ可以为用h览器选择昄文本的语a提供依据?br />
3.1.2 WMLE序的文件头

  合法的WML卡片l均属合法的WML文gQ因此它必须包含WML的声明及文gcd的声明。典型的WMLE序的文件头包括我们前面多次提到的以下两行程序:

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

  ~写WMLE序Ӟ我们必须写入q两行程序,q放在程序的开始处。其?-//wapforun//DTD WML 1.1//EN"是标准通用标记语言SGML的公共标C;"http://www.wapforum.org/DTD/wml_1.1.xml"是WMLE序文档cd的标C。文档类型标CZ可以?text/vnd.wap.wml"或“application/vnd.wap.wmlc”,其中前者制定WML的原文类型,后者制定WMLE序~译后代码类型?br />
3.1.3 WML元素

  WML的WML元素用于定义一个卡片组Qƈ通过<wml>?lt;/wml>标签包含和封装该卡片l中的所有卡片及信息。它的语法格式如下:

<wml xml:lang="lang">
内容(content)
</wml>

其中xml:lang="lang"用于指定文档所用语aQ前面已有介l)Q语a"lang"的值属于NMTOKEN型数据?br />
  wml元素中包含的内容QcontentQ中除了文本、图像等信息之外Q还可以包含head、template及card元素。其中head、template元素如果包含的话则只可包含一ơ,而card元素必须臛_包含一ơ。有兌些元素的用法我们后面介绍?br />
3.1.4 template元素

  template元素用于为当前卡片组中的所有卡片定义一个模板,同一规定卡片的某些参数。模版中的事件处理功能则可将q些参数自动应用于同一卡片l中的所有卡片。不q,我们也可以是其中某个或某几个卡片不采用模板规定的形式Q方法是在该卡片中定义一个同名的事g来替代模板块中相应的事g。template元素通过<template>?lt;/template>标签含所需内容QcontentQ而实现模板功能的Q其语法格式如下Q?br />
<template oneterforward="href" onenterbackwared="href" ontimer="href">
内容(content)
</template>

  template元素包含的内容中Q除了卡片的一般参数外Q还可以包含L多次的do元素和onevent元素。template元素属性的功能及用法说明如下:

1Qoneterforward。当用户在浏览器中进入当前卡片时Q该属性将指定链QhrefQ的URL地址Q浏览器据此打开URL指定的卡片或事g?br />
2Qoneterbackward。与上一属性类|该属性也可以指定其相应卡片或事g的URL地址。如果用h览时执行prevdQ那么浏览器׃定位到该属性所指定链QhrefQ的URL地址Qƈ打开URL指定的卡片或事g?br />
3Qontimer。当指定旉timerq期的时候,用户览器就Ҏontimer属性指定的URL打开相应的卡片?br />
3.1.5 card元素

  WML的卡片组是由一个或多个卡片QcardQ构成的Q每个卡片都包含有一套用户和览器交互操作的配置及模式。用户对交互操作的需求是多样性的Q所以卡片定义时也必L多样性的。ؓ此,WML提供了card元素Q通过<card>?lt;/card>标签定义一个卡片的各种属性、包含内宏V它的语法格式如下:

<card id="name" title="label" newcontext="boolean" ordered="true" onenterforward="href" onenterbackward="href" ontimer="href">
内容QcontentQ?br /></card>

  card元素中包含的内容QcontentQ中除了文本、图像信息之外,q可以包含onevent、timer、do和p元素。其中,timer元素只可使用一ơ,其余3U可使用多次。而且Q如果card元素包含onevent元素或timer元素的话Q那么onevent元素必须攑֜最前面Qtimer元素攑֜onevent元素的后面,随后才可以用do或p元素。这个优先顺序是不能q?br />
card元素属性的功能及用法介l如下:

1Qid。用于指定card的名字。改名字是程序导航定位的依据Q可以用作程序段锚点Q比?lt;go href="#cardname"/>。其中的cardname便是由id指定的卡片名?br />
2Qtitle。用于ؓ卡片制订一个简单的标题或说明信息?br />
3Qnewcontext。用于指定WAP手机览当用户重新进入的时候是否需要初始化卡片中所有的内容。它有true和false两种选择Q当指定newcontext="ture"Ӟ卡片的所有内容在用户重新q入时将q行初始化,也不清除历史U录Q否则,指定newcontext="false"Ӟ不q行初始化设|,也不清除历史U录。默认状态下的设|gؓfalse。另外,newcontext仅当作ؓgod的一部分时才可被执行?br />
4Qordered。用于向用户手机的浏览器指明卡片内容的组lŞ式,以便让浏览器Ҏ自n特点及卡片内容组l及时安排显C布局。它有两U布值得讄Q即true和false?br />
  当ordered="true"Ӟ览器将按照U性顺序显C卡片各区域的内宏V这个线性顺序通常是大多数用户所习惯采用的信息浏览顺序,比如发送E-mail信息Ӟ我们依次需要E-mail首g人地址、主题及E-mail内容Q这个逻辑序数U性顺序?br />
  当ordered="flase"Ӟ览器将Ҏ用户选择或指定的序来显C内宏V这U情况主要是用于昄用户选项、无序组建或用户输入的简单数据纪录等?br />
5Qonenterforward。onenterforward事g仅当用户使用god或类ggo的Q务位和浏览卡片时才可发生Q即如果用户执行godQ则览器就会定?lt;go>标签中指定超?href)的URL指定的卡片。card元素中的onenterforward属性是onevent元素的一个简单格式,用于直接指定onenterforward事g的URL地址?br />
6Qonenterbackward。该属性可以指定其响应旉的URL地址。如果用h览时执行prevdQ那么浏览器׃定位到该属性所制定链 QhrefQ的URL地址Qƈ打开URL指定的卡片。onenterbackward属性也属于onevent元素的一个简单格式?br />
7Qontimer。当指定旉timerq期的时候,用户览器就Ҏontimer属性指定的URL打开相应的卡片。它也属于onevent元素的一个简单格式?br />
3.1.7 access元素

access元素是由一个单独的的标{?lt;access>标签实现的元素。用于定义WML整个卡片l的操作权限Q即讉K控制参数。access元素必须在head元素内和其它的meta信息一起声明,而且每个卡片l只能有一个access元素。其语法格式如下Q?br />
<head>
<access domain="domain" path="path">
...
</head>

access元素属性的功能及用法如下:

1Qdomain。用于指定对卡片l进行操作的URL域,默认域是当前卡片l所在的域。domain的目的是限制讉KQ用h览时览器将Ҏdomain值所规定的值来得出与值匹配的地址Qƈ讉K该地址对应的卡片或事g?2Qpath。用于指定卡片组操作的其它卡片组所在的根目录。默认目录是?”,卛_前卡片组所在的根目录。默认目录的规定使得所有在domain域下的卡片组都可以操作当前卡片组。path的值是讉K旉要匹配的路径Q它的工作原理与domain十分怼Q需要与路径的每个子路径相匹配,否则均属无效?br />
3.1.8 meta元素

meta元素用于定义WML卡片l相关的通用meta信息。该元素是由一个单独的标签?lt;meta/>标签实现的元素,其语法格式如下:

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

其中Qname属性和http-equiv属性只能选择使用一个;content属性是必选的Q其值根据属性而定Qscheme属性目前尚不支持;forua属性ؓ可选属性。各属性功能及用法说明如下Q?br />
1Qcontent。该属性用于指定meta信息的性质的|是不必选的?br />
2Qname。用于指定meta信息性质的名U。用h览器通常忽略已经命名meta数据Q网l服务企业拒l发送包含该属性所指定meta数据名称的内宏V?br />
3Qhttp-equiv。该属性用于替代name属性,可将meta数据转ؓWSP或HTTP协议的响应头?br />
4Qforua。该属性用于指定那些开发者希望传送值用h览器的性质。它有ture和fales两个取|如果取falseQ则卡片l在发送往客户端以前必ȝ中间代理去除meta元素信息Q这是因Z输的协议可能改变Q若取gؓtrueQ则meta数据必须如实送往用户的浏览器。默认的状态下Q该属性的gؓfalse?br />
5Qscheme。该属性用于指定解释meta信息性质值的形式或结构。具体的形式或结构因meta数据的类型不同而不同?br />
3.2 d及其元素

WML允许我们在程序中指定一些Q务,当某些特定的事gȀzLQ即可执行这些Q务,从而完成需要的操作。例如,我们可以讑֮dQ当用户按下相应的功能键Ӟ览器就可以打开指定的卡片组或卡片。目前,WML提供?个Q务元素,即go、prev、noop和refreshQ它们主要与do元素和onevent元素中指定的事g相响应。本节我们就对Q务的q些元素做一详细介绍?br />
3.2.1 god

god是通过go元素来声明的Q而go元素是通过<go>?lt;go/>标签q行定义的。go元素主要用来定义览器需要导航的URL地址。如果该地址是一个WML卡片或卡片组的名字,则浏览器׃打开q显C相应的卡片、卡片组Q否则,览器就会执行该URL指定的Q务或事g{。在历史推栈中,god执行的是一个“推q(pushQ”操作,也就是说Q它执行时浏览器览的URL地址送入历史U录列表中,以被它用?br />
go元素中可以包含Q意次的setvar元素或postfield元素。postfield元素前面已有介绍Q这里不再重qͼsetvar元素我们后面介绍?br />
god的语法格式如下:

<go href="href" sendreferer="false|true" method="get|post" accept-charset="charset">
内容(context)
<go/>

其中属性的功能及用法介l如下:

1Qhref。该属性用于指定目标URL地址Q比如让览器显C的卡片的地址卛_U等。属性是必选的Q其它属性ؓ可选?br />
2Qsendreferer。该属性用于指定是否传递调用href所指定的URL的卡片的URLQ也是当前页的URLQ即HTTP头中HTTP_REFERER。有两种选择Qtrue或false。其中,默认gؓfalse?br />
3Qmethod。与HTML中的表单FORM的method属性一P该属性用于指定表单是以GET的方式还是post的方式递交Q以侉K用|关接口CGI处理。默认gؓgetQ但如果没有指定method属性,?lt;go>?lt;go/>之间存在postfield元素Q则WAP手机览器会自动以post方式传递?br />
4Qaccept-charset。当web服务器处理来自浏览器的输入信息时Q该属性可指定服务器进行数据编码时必须采用的字W集列表。也是_该属性指定的字符集替代HTTP头里指定的字W集Q以便作为服务器选用字符集的标准?br />
3.2.2 prevd

prevd是由prev元素实现的。该元素通常是一个单独的标签<prve/>Q不q有时也可由<prev>?lt;/prev>一Ҏ{进行定义。它用于指定浏览器D臛_史推栈中的前一个URL地址。在览器操作的历史推栈中,prevd执行的是“取出”操作,前一个URL地址取出Qƈ把当前URL地址推进历史推栈。如果历史推栈中没有前一个URL地址Q即prev/元素不执行Q何Q务?br />
prevd的语法格式ؓQ?br />
<prev/>
?lt;prev> 内容QcontentQ?</prev>

在后一语法格式中,prev元素包含的内定w面一般是setvar元素Q该元素的含义前面已有介l,q里不再重述Q具体的用法随后介绍?br />
3.2.3 refreshd

refreshd由refresh元素声明Q它用于h当前的卡片,对卡片内指定的变量进行更新。其语法格式为:

<refresh>
内容(context)
</refresh>

其中包含的内?content)中一般有setvar元素Q其语法格式?lt;setvar name="name" value="value"/>Q它可指定更新的变量名nameQ即更新的变量值value。另外,refresh元素也可以不包含setvar元素。而通过旉限制Qtimer元素Q对卡片q行h?br />
3.2.4 noopd

noopd由noop元素q行声明Q表CZ么也不做Q是一个空操作Q在替代卡片l的do元素是十分有用。该元素是一个单独的标签Q即 <noop/> 标签。其语法格式如下Q?br />
<nnop/>

noop元素没有属性,下面的简单程序中包含了noop元素实现得空d操作Q?br />
<card id="card1">
<do type="options" name="dome">
<noop/>
</do>
...
</card>

3.3 旉及其元素

WML提供了几个元素,专门用于处理用户览器的D和事件。利用这些元素用户可以给某Q务制定关联事件。那么当事g触发Ӟ览器就会执行相应的dQ比如URLD是通过事g实现的。而且Q事件可以和一个需要完成的d捆绑在一赗事件捆l时一般是通过几种元素及其标签声明来实现的Q如go、do和onevent{元素。下面我们就讲解WML的事件元素及事g?br />
3.3.1 do元素

do元素提供了一个通用的事件处理机Ӟ使得用户可以参与当前卡片的事件处理。通过<do>?lt;/do>标签用户交互和某一个Q务联pd一赗用户交互可以是用户按下的功能键、选择的菜单项Q也可以是用L声音提示。当用户Ȁz这些交互功能时Q用h览器׃执行与do元素相关的Q务。其语法格式如下Q?br />
<do type="type" label="label" name="name" optional="boolean">
d(task)
</do>

其中tast是与do元素兌的动作,也是条gȀzL览器即执行的内容。在do元素中,用户必须l定且只能绑定go、prev、noop和refresh四种元素所实现d中的一个Q务(taskQ。go元素用于定位制定的URL地址Qprev元素用于定位q打开前一操作或Q务,doop为空操作Qrefresh用于h当前卡片l或dQ有关他们的详细用法我们后面会陆l介l?br />
do元素可以用于卡片一U,也可用于卡片l一U。当用于卡片一U时Qdo元素必须包含在card元素中;而用于卡片组一U时Qdo元素必须包含在template元素中,由此定义的do元素同时应用于当前卡片l的所有卡片。此时如果某个卡片不惛_用模板中的do元素及其dQ则需采用我们前面介绍的方法,使用同名事g处理来替代模板中的do元素的事件处理。而且Q不Z件关联的d是否相同Q当do元素定义的事件名U相同时Q卡片的do元素忽视卡片组一Udo元素的媄响,及卡片一l的do元素被优先执行?br />
另外Q含有空操作d的do元素Q不论它是否被激z,它都不会传送或昄到用L览器中Q这在一定程度上可以加快览器的工作效率Q因为服务器端体它抛弃了一些空d的判断?do元素各个属性的功能及用法讲解如下:

1Qtype。用于指定do元素的类型(typeQ,也即需要关联、绑定的用户交互事gQ是必选属性。用h览器接到q些事g后,׃Ȁzd们ƈ执行相应的操作与处理。如果在一个卡片中定义了多个do元素q拥有同样typeQ那么用户必Mؓ每个do指定不同的事件名才行Q否则就会发生判断؜q错误?br />
do元素典型的类型(typeQ及执行条g介绍如下Q?br />
1、accept。当用户选择或按下相应功能键?accept)、选项、命名或按钮Ӟ览器接收或Ȁzd前所作选择?2、prev。激zprev键时Q浏览器导航到历史记录中的前一个卡片?br />
3、help。激zHELP功能键或相应按钮、命名时Q浏览器昄与当前内容相关的帮助信息?br />
4、reset。激zreset功能键或相应按钮、命名时Q清除或重置当前卡片l或览器的状态?br />
5、options。激zoptions功能键或相应按钮、命名时Q浏览器昄与当前内Ҏ关的选项或附加操作?br />
6、delete。激zdelete功能键或相应按钮、命名时Q删除当前项目或选择?br />
7、unknown。如果给出的cd不能为do元素所识别Q则一律按照unknown型处理,相当于类型ؓI,即type=""?br />
8、vnd.*。vnd.*及其它不同大写l合[Vv][Nn][Dd].*。这U类型定义的都是vnd.cotypeQ用于激zM应商或用h览器自定义的某个特定功能Q其中co为公?company)名的~写?br />
9、X-*与X-*。扩展类型,目前WML中还没有使用?br />
2Qlabel。该属性指定的文本字符串可以表C用L交互事g。例如,当把某一个Q务绑定在accept键上之后Qƈ讄了label属性,比如label="gone"Q那么浏览器׃label的值“gome”显C在屏幕上;如果不指定,览器则会显C默认的“ok”字W串。ؓ了保证能在较的手机上显C出来,label的属性值最多不过6个字W。不q这可能因WAP手机品牌、型号不同而稍有不同,有的手机最多不能超q?个字W。而且Q如果手机浏览器不支持动态标{显C,那么它就会忽视label属性?br />
3Q该属性用于指定do元烦所l定事g的名U。如果多个do元素制定了相同的nameQ那么他们绑定的事gl属一个。如果卡片一般与卡片l一U中do元素制定了相同的事g名,那么卡片一U的旉被优先执行Q卡片组一U的事g被忽视?br />
WML规定Q在同一卡片或在同一模板中,不得指定h相同事g名(nameQ的两个或两个以上的do元素?br />
另外Q如果name属性gؓI,则相当于没有指定name属性,q时do元素执行的事件或操作由type的属性值决定?br />
4Qoptional。指定浏览器是否忽视do元素及其包含的Q务。有两个可选|true和false。如果gؓtrueQ则览器将忽视当前do元素Q即不执行它所l定的Q务。反之,若gؓfalseQ则执行do元素?br />
3.3.2 ontimer事g

ontimer用于指定一个事件。当<timer/> 标签指定的时间到期后Q浏览器执行ontimer所指定的这个事件。ontimer的时间可以是一个URL地址Q一个卡片组Q一个WML|页Q一q图像或其他W合URL定位的规则的文g?lt;timer/>标签指定的时间ؓ正整敎ͼ单位大小?/10U?br />
ontimer旉只能包含在card元素或template元素的标{中q行定义Q其语法形式如下Q?br />
<card id="name" title="label" newcontext="boolean" ordered="true" onenterforward="href" onenterbackward="href" ontimer="href">
内容QcontentQ?br /></card>

或:

<template onenterforward="href" onenterbackward="href" ontimer="href">
内容QcontentQ?br /></template>

ontimer事g只有一个属性,即ontimer。它用于指定一个超链(hrefQ的URL地址Q指定时间timerq期的时候,用户览器就会按照超链(hrefQ的URL打开相应的卡片?br />
3.3.3 onenterforward事g

onenterforward事g仅当用户使用god或类ggod的Q务来定位和浏览卡片时才可发生。设|onenterforward事g后,当用戯入当前卡片组Ӟ览器就会定位onenterforward属性或<go/>标签中指定超链(hrefQ的URL地址Qƈ打开URL指定的卡片?br />
onenterforward事g需要包含在card元素、template元素或onevent元素的标{中q行定义Q其语法格式为:

<card id="name" title="label" newcontext="boolean" ordered="true" onenterforward="href" onenterbackward="href" ontimer="href">
内容QcontentQ?br /></card>

或:

<template onenterforward="href" onterbackward="href" ontimer="href">
内容QcontentQ?br /></template>

或:

<onevent type="onenterforward">
<go href="href"/>其他dQtaskQ?br /></onevent>

前两U格式中Qonenterforward事g作ؓcard元素或template元素标签中的一个属性进行定义的Q该属性即为onenterforwardQ它制定了一个超链(hrefQ的URL地址Q当用户q入当前卡片Ӟ览器就据此打开URL指定的卡片。这U格式制定的d相当与god?br />
3.3.4 onenterbackward事g

当用户用prevd或类似的d来导航至某一卡片Ӟonenterbackward事g才可发生。换句话_当用户从历史堆栈中选取URL地址Qƈ通过览器打开q一地址对应的卡片时Qonenterbackward事g才可能发生?br />
与onenterforward事gcMQonenterbackward事g也需要包含在card元素、template元素或onevent元素的标{中q行定义。其具体语法格式如下Q?br />
<card id="name" title="label" newcontext="boolean" ordered="true" onenterforward="href" onenterbackward="href" ontimer="href">
内容QcontentQ?br /></card>

或:

<template onenterforward="href" onterbackward="href" ontimer="href">
内容QcontentQ?br /></template>

或:

<onevent type="onterbackward">
<go href="href"/>其他dQtaskQ?br /></onevent>

前两U格式中Qonterbackward事g是作为card元素或template元素标签中的一个属性进行定义的Q该属性即为onterbackwardQ它指定了一个超链(hrefQ的URL地址Q当用户使用prev{Q务项回到地址Ӟ览器就会打开URL指定的卡片?br />
后一U格式中Qonterbackward事g作ؓonevent元素的一l类型|q结?lt;go/>标签指定事gȀzL览器需要打开的卡片的URL地址?br />
3.3.5 onpick事g

onpick事g在定义时一般通过onpick属性指定一些项目,当用户选择或取消这些项目时Q即可触发onpick事gQ执行onpick属性所指定的项目,如打开卡片、卡片组或其他事件等。onpick事g通常在option元素的标{中q行定义Q其语法格式如下Q?br />
<option value="value" onpick="href">
内容QcontentQ?br /></opiton>

可以看出onpick旉作ؓoption元素的一个属性来定义具体的动作。这个属性即onpickQ它指定了事件触发时览器需要定位的链的URL地址?br />
3.3.6 onevent元素

onevent元素通过<onevent>?lt;/onevent>标签可以把包含的d与特定的旉捆绑在一赗当用户Ȁz这一特定事gӞonevent元素所l定的Q务就会被立即执行。onevent元素的语法格式如下:

<onevent type="type">
dQtaskQ?br /></onevent>

其中task是与onevent元素兌的动作,也是条gȀzL览器即执行的内容。与do元素一Ponevent元素中用户也必须l定且只能绑定go、prev、noop和refresh四种元素所实现d中的一个Q务,go元素用于定位指定URL地址、prev元素用于定位q打开前一操作或Q务,noop为空操作Qrefresh用于h当前卡片l或d?br />
onevent元素只有一个属性,即type属性,它是必选属性,主要用于定义特定事g的名U。该属性值的数据cd为CDATA型?br />
3.3.7 postfield元素

postfield元素用于指定当浏览器接到URLhӞ向原服务器(origin serverQ传送的域名其域倹{传输时Q传输域及传输值的实际~码方式主要依赖于浏览器与原服务器的通信方式。postfield元素是通过单独?lt;postfield/>标签q行定义的,其语法格式如下:

<postfield name="name" value="value">

它共有两个属性:name与valueQ它们的取值均属于VDATA型数据。其中,name属性用于指定传输域的名Uͼvalue属性用于定义传输的倹{这两个属性均为必选属性?br />
3.4 变量讄元素与变量设|的有关规定

几乎所有的WML内容都可通过讄参数来实玎ͼqؓ我们灉|的开发WMLE序提供了方ѝ本节我们先介绍一个变量设|元素,然后再介l与变量讄有关的一些具体规定?br />
3.4.1 setvar元素

setvar元素用于指定在当前上下文内容中的变量的|从侧面媄响正在运行的d。其语法格式如下Q?<setvar name="name" value="value"/>

它有两个属性:name和value。前者用于指定变量的名称Q后者用于指定所需赋给变量的倹{这两个属性都是必选的Q它们的数据cd均属于VDATA型。如果name属性所规定的变量名不合法或不符合运行环境的要求Q那么setvar元素在WMLE序q行中将被忽视,不能发挥其应有的作用?br />
3.4.2 变量讄

WML~程中可以用变量,变量使用前必进行定义。变量的命名原则及定义方法我们上一章已l讲q了Q这里不再重q。在q里Q我们主要介lWMLE序中设|变量的规定?br />
如前所qͼsetvar元素可用来设|变量,讄时setvar元素一般需要在go、prev或refresh元素中进行定义。另外,利用input和select元素也可以设|变量。其中前者是用戯入的文本赋给变量Q作为变量的|而后者则用户从option元素中选择的value属性的Dl变量。有关input元素和select元素的语法格式及具体用法我们后面再行介绍?br />
讄变量Ӟ以下几种情况q应当引起大家注意:

1Q可以用WMLScript的变量D|WML的变量,反之亦然。也是_使用WML及WMLScript~写E序Ӟ它们可以使用同名~程?br />
2Q在WAP开发工具中Q通常提供有对变量q行理和维护的选项卡或对话框,开发h员从中也可以对相应的变量q行讄及编辑?br />
3Q在当前上下文内容中Q可以用card元素的newcontext属性来消除所有的变量倹{?br />
3.5 用户输入处理元素

通过WAP手机的按键,用户可以向浏览器昄的卡片中输入数据信息或操作信息。WML为此专门提供了处理用戯入的元素?br />
3.5.1 input元素

input元素用于定义文本实体对象Q包含有对输入文本内容的格式、数据类型、长度、倹{变量名{多U属性的具体规定。当用户输入满input元素的规定时Q则接收输入信息Qƈ赋给指定的变量灵z进行相应的操作、处理;否则Q就通过览器给出具体的处理意见Qƈq行是单个输入处理或变量初始化操作,比如h卡片以让用户重新输入Q或l用h入错误所在ƈ{待q一步的处理指o{。input元素是WML~程中处理用户交互活动的重要元素Q它通过单独?lt;input/>标签q行定义Q其语法格式如下Q?br />
<input name="variable" title="label" type="type" value="value" default="default" format="specifier" emptyok="false|true" size="n" maxlength="n" tabindex="n"/>

其中除了name属性是必选的以外Q其他属性都是可选的。这些属性的功能和用法介l如下: 1Qname。该属性用于指定用来保存用戯入文本的变量和名U。定义name属性后WML根据该属性也卛_量名Qؓ卛_输入的文本实体对象与之存储空_以便接收用户输入?br />
2Qtitle。该属性用于input元素的标{,通常是位于输入框前的提示信息?br />
3Qtype。用于指定文本输入区的类型,有text和password两种选择。默认gؓtextQ指定的用户可以输入文本Q而且输入的文本会同时逐渐响应q显C在览器中。如果选择passwordQ则指定用户输入的文本作为密码文本处理,WMLE序按文本实体接收输入的数据Q而浏览器上响应用戯入显C时逐渐均ؓ星号(*)Q由此vC密的目的?br />
4Qvalue。该属性用于指定name属性所定义变量的|它将昄在输入框中?br />
5Qdefault。该属性用于指定name属性所定义变量的默认倹{?br />
6Qformat。该属性用于格式化输入的数据?br />
7Qmaxlength。该属性用于指定用户可输入字符串的最大长度。该属性的上限?56Q最多不能超q?56个字W?br />
8Qemptyok。用于指定用h否可以不在输入框内输入内宏V?br />
9Qsize。该属性用于指定输入框的宽度,宽度gؓ字符个数?br />
10Qtabindex。用于指定多个输入框存在ӞcM于HTML中Tab键的具体位置?br />
3.5.2 select元素

选择列表属于输入元素Q允许用户从选项列表中选择需要的目。WML不仅支持单选列表,及单选项Q而且支持多选列表,也就是复选项。select元素允许用户从选列表中选择所需的项目。列表中的选项采用后面我们p讲到的option元素q行定义Q一般是一行格式化的文本。编E时Q我们可以用optgroup元素option元素的情况项目分成不同别或层次的选项l,为用户选择提供方便?br />
select元素是通过<select>?lt;/select>标签q行定义的,语法格式如下Q?br />
<select title="label" multiple="false|true" name="variable" default="default" iname="index_var" ivalue="default" tabindex="n">
内容QcontentQ?br /></select>

其中所有属性都是可选的。select元素各个属性的功能和用法介l如下:

1Qmultiple。该属性用于指定选择列表是否可以使用复选框?br />
2Qname。该属性用于指定接攉项值的变量的名Uͼ变量值由value属性预讑֮?br />
3Qvalue。用于制定name属性所定义变量的默认倹{?br />
4Qiname。用于指定包含排序号的变量的名称?br />
5Qivalue。用于指定选择列表中被选中选项的|是一个具有排序号性质的倹{?6Qtitle。用于指定选择列表的标题?br />
7Qtabindex。用于指定当前选择光标在选择列表中的具体位置Q该位置即ؓ当前选择操作要选择的选项所在的位置?br />
3.5.3 option元素

option元素用于定义select元素中的一l单选项。它通过<option>?lt;/option>标签q行定义Qƈ可包括事件和单选项的显C文本等信息Q其语法格式如下Q?br />
<option title="label" value="value" onpick="href">
内容QcontentQ?br /></option>

option元素的属性均为可选,各属性功能及用法说明如下Q?br />
1Qvalue。该属性用于设|键倹{当用户选到该选项之后Qoption元素׃该Dlselet元素的name属性所指定的变量?br />
2Qtitle。用于option元素制定的一个标题,以便提示用户操作?br />
3Qonpick。该属性用于指定用户选到该项q按accept键后所打开卡片l的L?br />
3.5.4 optgroup元素

optgroup元素用于多个相关的option元素q行分组Q用h览器可以借助q种分组来安排选项列表的显C布局Q以方便用户选择。optgroup元素是通过<optgroup>?lt;/optgroup>标签q行定义的,其语法格式如下:

<optgroup title="label">
内容QcontentQ?br /></optgroup>

它所包含的内容中需要包含至一ơoption元素或其他的optgroup元素?br />
optgroup元素只有一个属性,即title属性,用于定义optgroup元素的标题,以便提示用户操作?br />
3.5.5 fieldset元素

fieldset元素用于讑֮输入框和相应的说明文本,从而用户就可以利用input元素{借助该输入框输入所需的数据信息。fieldset元素的语法格式如下:

<fieldset title="label">
内容(content)
</fieldset>

׃fieldset元素和输入有养I所以它们的内容中可以包含与输入有关的其他元素?其语法格式可以看出,fieldset元素只有一个属性,即title属性,用于定义fieldset元素的标题,以便提示用户操作?br />
3.6 锚、图像、定时器及其元素

本节我们讲解与定位和定时控制有关?cd素,包括anchor、a、img、timer几种元素。用它们可以在WML卡片中创链接Q或在文本流中显CZq图像,或设|定时器来控制用h作及卡片昄{?br />
3.6.1 anchor元素

anchor元素用于创徏一个超链接的头部,链接的其余部分为用h定的URL地址。当E序q行中用户选中该超链接Ӟ览器就会被引入到超q接指定的地址Q如其他卡片l或同一卡片l中的其他卡片?br />
anchor元素?lt;anchor>?lt;/anchor>标签q行定义Q它所包含的超q接必须是真实存在的Q而且是能够正连接的连接。anchor元素定位链接时Q必通过相关的Q务元素完成定位处理,如go元素、prev元素、refresh元素{。不q,在anchor元素中只能包?个定位Q务,多于一个时会导致WMLq行错误?br />
anchor元素的语法格式如下:

<anchor title="label">
d
文本
</anchor>

其中的Q务需要包含一个进行定位的d元素。可以看刎ͼanchor元素只有一个属性,即title属性,用于定义fieldset元素的标题,它用于定义即title属性,用于定义fieldset元素的标题,以便提示用户操作。元素的连接的标题。用h览时可利用这一标题来及时了解操作的连接的名称或者有xCZ息?br />
3.6.2 a元素

a元素是由anchor元素的简化Ş式,它内含了anchor元素需要包含的go元素功能爱完成超q接定位Qƈ且不再包含其他Q何变量设|。它使用<a>?lt;/a>标签q行定义?br />
3.6.3 img元素

img元素用于格式化的文本中防止和昄一q图像。当Ӟ前提是用h用的览器必L持图像显C。img元素由单独的<img/>标签q行定义Q它不包含其它元素。其语法格式如下Q?br />
<img alt="text" src="url" localsrc="icon" aligh="alignment" height="n" width="n" vspace="n" hspace="n"/>

属性中alt和src是必要有的Q其他可选。另外,需要注意的是img元素要放在p元素?br />Q而不能放在do或option元素里?br />
img元素各个属性的功能和用法介l如下:

1Qalt。该属性用来指定当手机不支持图像显C用来替代现实的文字文本?br />
2Qsrc。该属性用于指定图像文件的URL地址?br />
3Qlocalscr。该属性用来指定显C存在手机ROM的图标文件?br />
4Qalign。该属性用来指定图像显C是相对当前文本行的寚w方式?br />
5Qheight。用于设定图像显C时的高度?br />
6Qwidth。与height属性类|用于讑֮囑փ昄时的宽度或宽度百分比?br />
7Qvspace。该属性用于指定图像显C时的上边距和下边距Q默认gؓ0?br />
8Qhspace。与vspace属性类|该属性用于指定图像显C时的左边距和右边距?br />
3.6.4 timer元素

timer元素用于讑֮一个定时器Q可以g时显C卡片组、卡片,或实现WMLE序的等待操作,或在卡片l和卡片之间实现切换以取得动L果?br />
一个卡片只能用一ơtimer元素Q也x说只能设|一个定时器。当用户q入q有定时器的卡片Ӟ定时器就会开始工作,其时间值就会逐渐减小。timer元素指定的时间值单?/10U。其语法格式如下Q?br />
<timer name="variable" value="value"/>

它的两个属性中Qvalue属性是必选的Qname属性ؓ可选。name属性用于指定表C时间值的变量的名Uͼ该变量的取值由定时器的旉值决定,旉值减,该变量的g相应地减,q终始保持不变?br />
value属性用于指定name属性所定义变量的初始倹{如果name属性定义的变量在定时器初始化时q没有|那么该变量就采用value属性指定的|否则Q改变量׃忽视value属性的倹{如果没有定义name属性,也就是说Q没有指定时间变量,那么timer元素指定的定时器仍将采用value属性的D行g时处理?br />
3.7 文本格式化及其元?/b>

WMLE序中,Z昄的文本呈现出丰富的样式,WML提供了一些用于格式化的元素,我们通过q些元素及其相应的标{֏以对文本q行标注和控Ӟ从而实C同的昄效果?br />
3.7.1 增强元素

增强元素都是一些成对的标签Q用于指定文本的增强昄信息。比如b元素通过<b></b>标签可以控制其中的文本按照粗体字q行昄?3.7.2 br元素

“br”即breakQ是用于换行的元素,它是使用单独?lt;br/>标签q行定义的。br元素的作用相当于插入一个回车符?br />
3.7.3 p元素

“p”即指paragraphQp元素用于划分D落Q是当前文本换行q插入一个空白行。p元素可以使用单独?lt;p/>标签q行定义Q也可以使用<p>?lt;/p>标签成对的进行定义。其语法格式为:

<p aligh="alignment" mode="wrapmode"/>

?br />
<p aligh="alignment" mode="wrapmode"/>
文本
</p>

1Qalign。该属性用于设|段落在览器中的对齐方式,有left、center和righ三种取倹{这三种参数值分别表Cp元素当前定义的文本段落及览器窗口的左侧、中间和右侧q行寚w。默认gؓleftQ及D落与浏览器H口的左侧对齐排列?br />
2Qmode。该属性用于指定下一D落的换行方式?br />
3.7.4 td元素

td元素用于规定表格单元格的内容。其语法格式如下Q?br />
<td> 单元格内?</td>

3.7.5 tr元素

WML中的表格是按照行、列q行l织的。一个表格由若干行组成,每行pq列l成。tr元素用于定义表格的行。其语法格式如下Q?br />
<tr> 单元格内?</td>
</tr>

3.7.6 table元素

table元素与tr元素、td元素一P可用来创容纳文本和图像的表格Qƈ可设|表格各列中文本和图像的寚w方式。其语法格式如下Q?br />
<table align="alignment" title="label" columns="n">

?br />
<table align="alignment" title="label" columns="n">
内容
</table>

其中各个属性的功能和用法介l如下:

1Qalign。该属性用于指定表各个列中文本和图像的寚w方式?br />
2Qtitle。该属性用于指定table元素的标题?br />
3Qcolumns.该属性用于指定表格的列数Q该C能ؓ0?/div>

zhyiwww 2006-07-05 11:01 发表评论
]]>W二?WML语言基础(转蝲)http://m.tkk7.com/zhyiwww/archive/2006/07/05/56671.htmlzhyiwwwzhyiwwwWed, 05 Jul 2006 02:59:00 GMThttp://m.tkk7.com/zhyiwww/archive/2006/07/05/56671.htmlhttp://m.tkk7.com/zhyiwww/comments/56671.htmlhttp://m.tkk7.com/zhyiwww/archive/2006/07/05/56671.html#Feedback0http://m.tkk7.com/zhyiwww/comments/commentRss/56671.htmlhttp://m.tkk7.com/zhyiwww/services/trackbacks/56671.html

W二?WML语言基础

[日期Q?span id="TimeLabel">2004-11-23] 来源Q?span id="SourceLabel">赛_|?/a>  作者: [字体Q?a href="javascript:ContentSize(16)">?/a>?/a>?/a>]
  完成WAP服务器的建立和WAP览器的安装之后Q我们接下来可以用WML语言来编写WAP|页或应用,q过WAP服务器及览器进行调试。从本章开始我们将pȝ地学习WML语言Q本章主要讲解WML语言的基知识Q下一章全面讲解WML的语法、标{֒规则?br />
2.1 WML的简单例子及~辑、测试方?/b>

  无限标记语言WML(Wireless Markup Language)是一U基于扩展标记语aXML(Extension Markup Language)的语aQ是XML的子集。它可以昄各种文字、图像等数据Q是由WAP论坛Qhttp://www.wapforum.orgQ提出ƈ专ؓ无线讑֤用户提供交互界面而设计的Q目前版本ؓ1.1版。这些无U设备包括移动电话,呼机和个人数字助理PDA(Personal Digital Assistants){?br />
2.1.1 WML与WAP讑֤

Z更好的了解和使用WML语言Q开发h员应对WML使用的设备和支持WML的设备的特点、特征有个大概的了解?br />
一般而言QWML使用的无U设备通常h以下特点Q?br />
与普通的个h计算机相比,体积较小Q?br />讑֤的内存有限,且其CPU性能也有限;
通讯带宽较窄、时延较ѝ?br />
以移动电话、PDAZ来讲Q支持WML的设备主要具有以下特征:

有一个显C屏q,可显C?.凶址?2各字W;2.凶址型ǔQūQ舾δ馨サ囊恍?br>支持数字和字W的输入Q?br />支持操作者用箭头或数字按钮q行选择Q?br />支持ASCII的可打印码;
通常都有两个可编E功能键Q即Accpet键和Options键,一般安排在接近键盘的屏q下方;
通常有一个PrevD键?br />
我们介绍WML所使用WAP讑֤的目的,是希望读者通过WAP讑֤的特炏V特征来了解WML语言的特点,q而对WML~程所要解决的问题有个大概的认识?br />
2.1.2 使用文本~辑器面写WMLE序

使用WML语言~写WAP|页或应用时Q需要用一个编辑器q行~辑。与HTML~程一PWML~写的程序也是纯文g文本Q可以用Q意文本编辑器q行~写Q比如Windowspȝ中的“记事本QNotePadQ”等。也可以使用比如Nokia WAP Toolkie{YӞ有关此具体的用法会在以后的学习过E中提vQ。我们先介绍W一U方法,随后介绍W二U?br />
如果要?C本(NotePadQ?来编写WMLE序Q则可以在Windowspȝ中,单击“开始”按钮,然后从出现的菜单中,依次光标指向“程序”、“附件”、“记事本”,启动“记事本”程序。屏q上随后׃出现它的~辑H口Q从中就可以输入q编写WMLE序了?br />
作ؓ举例Q我们可以输入如下简单的E序?br />


<?xml version="1.0"?>
<!DOCTYPE wml PUBLIC "-//wapforun//DTD WML 1.1//EN" "http://www.wapforum.org/DTD/wml_1.1.xml">
<xml>
<card id="card1" title="Title">
<P>
<!--Write your card implementation here.-->
Hello World!!
</P>
</card>
</xml>


输完后将它保存ؓhello.xml文g。保存时注意文g的扩展名应ؓxml而不是txt?br />
2.2 WMLE序l构

上一节我们降解了一个简单的WMLE序Q具有HTML~程的读者可以看出,WMLE序在结构上形式上与htmlE序有很多相g处。下面我们就Ҏ一个实例来分析一下WMLE序的结构及l成?br />
2.2.1 WML的元素和标签

分析实例之前Q我们有必要对WML的元素和标签予以单说明。与HTMLcMQWML的主要语法也是元素和标签。元素是W合DTDQ文档类似定义)的文档组成部分,如title(文档标题)、IMGQ图像)、table(表格){等Q元素名不区分大写。WML使用标签来规定元素的属性和它在文档中的位置。标{用小于号Q?lt;Q和大于P>Q括hQ即采用?lt;标签?gt;”的形式。标{ֈ单独出现的标{֒成对出现的标{两U。大多数标签是成对出现的Q由首标{֒标{成。首标签和尾标签又分别称v始标{֒l止标签。首标签的格式ؓ?lt;元素?gt;”,标{格式为?lt;/元素?gt;”。成Ҏ{于规定元素所含的范围Q比?lt;b>?lt;/b>标签用于界定黑体字的范围Q也是?lt;b>?lt;/b>之间包住的部分采用黑体字昄。单独标{格式为?lt;元素?>”,他的作用是在相应的位|插入元素。如〈br/〉标{表C在该标{所在位|插入一个换行符?br />
2.2.2 WMLE序l构形式及组成的实例分析

了解了上q知识后Q下面我们在分析一个实例程序。程序如下:

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

<wml>

<card id="card1" ontimer="#card2" title="Tookit Demo">
<timer value="50"/>
<p aligh="center">
</br></br></br>
<big>
<!--Write your card implementation here.-->
Welcome to....
</big>

</p>
</card>

<card id-"card2" ontimer="#card 3"title="Toolkit Demo">
<timer value="50"/>
<p align="center">
<br/><br/>
<b>
The Nokia<br/>
</b>
Wireless Application Protocol
</u>
...
</p>
</card>

<card id="card3"title="Toolkit Demo">
<p align="center">
<br/><br/><br/>
<big>
<i>
Toolkit
</i>
</big>
</p>
</card>

</xml>


该程序运行后在WAP手机屏幕依次昄3屏信息。先昄"Welcome to ..."Q然后显C?The Nokia Wireless Application Protocol..."Q最后显C?Tookit!"。显C时每屏都有标题"Tookit Demo"Q相M屏之间g时ؓ50Q其单位大小?/10U,延时50?U?br />
通过以上实例我们可以了解到WMLE序的结构Ş式及l成Q?br />
1)语法。WML与HTML极ؓ怼。仍然是一U标记语aQƈ且gl了XML的语法规则,具体的语法我们会以后的学习过E中遇到?br />
2)文g声明。所有的WMLE序必须在文件的开头处声明XML文gcdQ包括XML的版本,WML的文档类型、所用规范等。声明Ş式如下:

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


3)标签。在WML语言中需要用标{(TagQ,其用Ş式与HTML和XML{标记语a中的形式是完全一致的?br />
4Q元素。WML的元素(ElementQ用于描q卡片组QDeckQ的标记信息即结构信息。一个元素通常有一个首标签、内宏V其它元素及一个尾标签l成Q具有下qCU结构之一Q?br />
<首标{?gt;内容</标{?gt;
?br /><标签/>

元素包含的内容中q可以有元素Q这些元素也是有首标{、相应内宏V其它元素及标{成。不包含内容的元素成为空元素。它Z个单独的标签。或者说Q单独的标签也是一U元素?br />
5)属性。WML与XML一P其标{֏以包含很多属性。属性用于给标签提供必要的附加信息,且属性内定w常在v始标{ֆ使用。不q,属性内容不会被览器显C,它至作ؓ参数为标{提供必要的信息?br />
指明属性值的时候,需要把该值用引号扩v来,可以是单引号或者双引号Q引号通常成对嵌套使用。属性名U必d写。例如:<card id="card 1" ontimer="#card2" title="Toolkit Demo">

而且Q单引号的属性中q可以包含双引号的属性。实体字W也可以作ؓ属性倹{实体字W是指诸?amp;?lt;?gt;??的特D字W,在WMLE序中显C着cdW需要特D处理,后面我们介绍具体Ҏ?br />
6)注释。WMLE序中也可以加入注释。注释内容用于给开发h员顺利阅L代码提供方便Q它不会被浏览器昄出来。注释内容在标签中用感叹PQ)引出Qƈ用于<!--注释内容-->的Ş式。例如:<!-- Write your card implementation here.-->。需要说明的是,XMLE序中不支持注释的嵌套?br />
7)文档l构。WML文档是由“卡片(CardQ”和“卡片组QDeckQ”构成的Q一个Deck是一个或多个Card的集合。当客户端发求之后,WML即从|络上把Deck发送到客户览器,q是用户可以浏览Deck内包含的所有CardQ而不必从|上单独下蝲每一个CardQ程序中的第一个Card是缺省得可见的Card?br />
注意QDeck是一副纸牌的意思,q里是指一叠卡片,所以我们在q里UC为它为“卡片组”。另外,Card指的是WAP手机屏幕大小的网,管有时一个Card可能需要多屏才能显C完Q但我们也可以把它翻译成“页面”,不过q样与HTML中的面Ҏ混合。因此我们在q里UC为卡片?br />
2.2.3 WMLE序的基本结?br />
以上我们单分析了WML的程序结构及l成Q由此大家可以对WMLE序有个整体上的初步认识。下面我们给出WMLE序的基本结构?br />
<?xml version="1.0"?>
<!DOCTYPE wml PUBLIC "-//WAPFORUM//DTD WML 1.1//EN" "http://www.wapforum.org/DTD/wml_1.1xml">
<wml>
<head>
<access/>
<meta..../>
</head>
<card>
Some contents...
</card>
<wml>


该基本结构可以分Z下几个关键部分:

1Q声明。WMLE序有许多Deckl成Q对于每一个DeckQ在其文档开头必进行XML的声明和文档cdDOCTYPE的声明?br />
XML声明L在文件的W一行,注意前面最好不要有I格或者还行:

<?xml version="1.0"?>

2Q紧跟着是DOCTYPE声明Q注意声明是字母的大写不要搞错Q?br />
<!DOCTYPE wml PUBLIC "-//WAPFORUM//DTD WML 1.1//EN" "http://www.wapforum.org/DTD/wml_1.1xml">

3Q?lt;xml>标签。该标签用于包含和定义WML的一个Deck。它有一个可选的xmlQlang属性来制定文档的语aQ比?lt;wml xml:lang="zh">表示文档语言Z文?br />
4Q?lt;head>标签。该标签用于包含和定义Deck的相关信息?lt;head>标签之间可以包含一?lt;access>标签和多?lt;meta>标签?br />
5Q?lt;access/>标签。它的一般Ş式是<access domain="? path="/路径"/>Q主要用于制定当前Deck的访问控制信息,有两个可选的属性。其中,domain用来制定域,默认gؓ当前域,path用来制定路径Q默认gؓ?”,卌目录。由?lt;access>单独使用Q所以要用?”结,后面我们q会pȝ的讲解WML的各U标{,q里即看不懂也没关p,主要有些感性的认识可以了?br />
6Q?lt;meta...>标签。它的一般Ş式是<meta 属?content="? scheme"格式" forua="true|false"/>Q用于提供当前Deck的meta信息Q包括内存数据处理方式,以及数据传输方式和处理方式等。有兌标签的详l内Ҏ们后面会专门l出?br />
7Q?lt;card>标签。一个Deck可以包含多个CardQ每个Card的内容可能不止一屏显C。对于每一个CardQWML均?lt;card>?lt;/card>q行包含和定义?<card>同时可以包含多个可选的属性,?lt;card id="name" title="label" newcontext="false" ordered="true" onenterforwand="url" pmemterbackward="url" ontimer="url">。至于这些属性的具体含义及功能,我们在后面介绍?br />
2.3 WML语言的基本知?/b>

上一节我们介l了WMLE序的基本结构,接下来我们介lWML语言的基本知识,主要包括WML的字W集、变量、数据类型及WMLE序的基本组成部分等?br />
2.3.1 WML的字W集及编?br />
WML使用XML的字W集Q即通用字符集ISO/IEC-1062.Q也即统一字符~码标准Unicode 2.0。同ӞWMLq支持其他系列的字符集子集,例如UTF-8、ISO-8859-1或UCS-2{。其中:

UTF-8是指通用字符集UCS(Universal Character Set)的{换格?(Transformation Format 8)Q主要传输国际字W集的{换编码。UTF-8采用了UCS字符?位编码,提供了十分安全的~码格式Q可以有效避免数据传输过E中的窃听、截取及非法解密。同ӞUTF-8?位ACSII码完全兼容,不会影响此类~码实现的程序;它的~码规则十分严格Q能够有效避免同步传输错误,而且q会支持其它字符集提供了_的空间?br />
ISO-8859-1字符集是国际标准化组lISO(International Standardization Organization)制定的ACSII字符集的扩展集,能够表示所有西Ƨ语a的字W。与ISO Latin-1一PISO-8859-1与Windows环境中普遍用的国国家标准协会ANSI(American National Standards Institute)的字W集极ؓcMQ绝大多数情况下无需区分。在不特别指明的情况下,HTTP协议均用ISOLatin-1字符集。因此,ZWML面中表C非ACSIIQnon-ACSIIQ字W,开发h员需要用相应的ISO Latin-1~码的字W?br />
UCS-2是ISO 1062.标准中自定义的通用?位编码字W集(Universal Multiple-Octer Coded Character Set)?字节Q即16位)~码标准Q其字符~码gUnicode字符的标准编码值相{?br />
WML文档可以采用HTML 2.0规范所定义的Q何字W编码标准经~码处理。一般说来,WML文档的字W编码是需要{换ؓ另外的编码格式,以与WAP用户的手机浏览器所用字W标准相适应Q否则,手机览器就无法昄WML面中的字符。然而,~码转换时可能会丢失一些字W信息,所以,如果在用Lq行WML文档的编码{换,那么可能导致某些结果信息丢p不能被用户所览。因此,如有必要Q我们应当尽量在WML面传送到用户览器之前完成编码{换?br />
Z解决q一问题Q一斚wQ我们需要ؓWeb服务器补充定义WML的数据类型,以让服务器可以准传输这些数据,另一斚wQ我们需要制订编码{换的原则?br />
2.3.2 WML字符使用基本规则

WML是一U比较严格的语言Q字W用必遵守相应的规则Q这些基本规则主要包括以下几个方面:

1Q大写敏感。在WML中,无论是标{օ素还是属性内定w是大写敏感的,q一点承了XML的严格特性,M大小写错误都可能D讉K错误?br />
一般来_WML的所有标{,属性,规定和枚丑֏它们的可接受值必d写,Card的名字和变量可大写和写Q但它是区分大小写的。包括参数的名字和参数的数值都是大写敏感的,例如variable1、Variable1和vaRiable1都是不同的参数?2Q空根{对于连l的I字W,E序q行时只需要一个空根{属性名、符P=Q和g间不能有I格?br />
3Q标{。标{ֆ属性的值必M用双引号Q?Q或单引P'Q括h。对于不成对出现的标{,必须在大于号Q?gt;Q前加上斜杠(/Q,比如换行标签必须写成<br/>才正?br />
4Q不昄的内宏V在WML中,不显C的字符主要包括换行W、回车符、空格和水^制表W,它们?位十六进制内码分别ؓ10?3?2??br />
E序执行ӞWML忽视所有的多于一个以上的不显C字W,即WML会把一个或多个q箋的换行、回车、水q_表符及空D{换成一个空个?br />
5Q保留字W。这是WML的一些特D字W,如小于号Q?lt;Q、大于号Q?gt;Q、单引号?”、双引号?”、和P&Q?br />
6Q显C汉字。如果希望WMLE序执行时能够显C汉字,则只需要程序开头用encoding指定汉字字符集即可。例如:<?xml version="1.0" encoding="gb2312">?br />
注意Q指定汉字字W集的Ş式和Ҏ可能因ؓ开发工hWAP手机的不同而不同?br />
2.3.3 变量

WML~程中可以用变量,变量使用前必进行定义。变量一旦在Deck中的某一个Card上定义过Q其他Card则可以不必重新定义就能直接调用该变量?br />
定义变量的语法格式ؓQ?br />$identifier
$(identifier)
$(identifier:conversion)

其中identifier指变量名Q或说变量标C符Qconversion指变量的替代?br />
变量名是由US-ACSII码、下划线和数字组成的Qƈ且只能以US-ACSII码开头。变量名严格区分大小写,也即Q变量名是大写敏感的?br />
定义变量的语法在WML中n有最高的解释优先U?br />
有关变量的用说明如下:

1Q在WML中,变量可以在字W串中用,q且在运行中可以更新变量的倹{?br />
2Q当变量{同于空字符串时Q变量将处于未设|状态,也就是空QNullQ?br />
3Q当变量不等同于I字W串Ӟ变量处于设|状态,也就是非I(Not NullQ状态?br />
4Q在?identifier”Ş式下QWML通常以变量名后面的一个空DC变量名的l束。如果在某些情况下空格无法表CZ个变量名的结束,或者变量名中包含有I格Q则必须使用括号变量名括v来,即采用?(identifier)”的形式?br />
  WMLE序中的变量是可以替代的Q我们可以把变量的数DlCard中的某一文本。有兛_量替代说明如下:

1Q在WMLE序中,只有文本部分才可以实现替代?br />
2Q替代一般在q行期发生,而且替代不会影响变量现在的倹{?br />
3QQ何标{是按照字符串替代的方式实现的?br />
4Q替代是按照字符串替代的方式实现的?br />
  ׃变量在语法中有最好的优先U,包含变量声明字符的字W串被当作变量对待Q所以如果要使程序显C?”符P则需要连l用两个?”进行说明。例如:<p> Your acconut has $$15.00 in it </p>一句显C的l果为:Your account has $15.00 in it?br />
2.3.2. WML核心数据cd

  WML的核心数据类型均属于字符型数据,是根据XML的数据类型定义的Q共有下q?.掷嘈?1QCDATA型。这U数据类型是WML用得最多的一U,可以是数字、字W串或包含数字的字符丌Ӏ不q定义时Q不论是数字或字W串Q都必须以文本的形式定义Q及数据用引号引h。CDATA型的数据仅用于属性倹{例?$(value)"或name="value"{。注意,q里的value指CDATA型的数据倹{?br />
2QPCDATA型。这是从CDATA中分解出来的一cL据,除了可以是文本Ş式的数字、字W串或两者的混合串外Q还可以是WML的标{。PCDATA型的数据只能用于WML的元素表C?br />
3QNMTOKEN型。这是一cȝD的数据Q凡是包含或部分包含数字、字母及标点W号的数据均属于NMTOKEN型数据。这U数据可以用标点W号开_但不用于定义变量名或元素名?br />
4Qid型。专门用于定义WML元素名称的数据类型?br />
  在这2.掷嘈椭校珻DATA型用h比较灉|Q它可以使变量或数据免于语法查。这是因为,CDATA内的数据内容都会被当作文本来处理Q从而可以避免WML的语法检查,直接作ؓ文本昄出来?br />
2.3.5 WML数据值性质

  除了NMTOKEN型数据外QWML其他3U数据都必须以文本Ş式即加上引号q行定义。我们关心的问题是,q些cd的数据可以表C哪些数据值呢Q或者说Q它们所表示的数据值的性质是什么呢Q?br />
事实上,WML数据只在性质上可以是长度QLengthQ、宏变量QVdataQ、流QFlowQ、内行(InlineQ、布局QLayoutQ、文本(TextQ、超链(HrefQ、布|BooleanQ、数据(NumberQ或增强方式QEmphasisQ?br />
2.3.6 卡片与卡片组

前面我们分析了WMLE序的结构时Q曾讲到WML文档的信息是通过卡片集和卡片l集的Ş式进行组l的。一个Deck是一个或多个Card的集合。当客户l端发出h之后QWML即从|络上把Deck发送到客户的浏览器QDeck是服务器发送信息的最单位。用h览器收到Deck后,可以览其中包含的所有Card。Card用于表示或描qC个或多个用户交互单位?br />
2.3.7 卡片l模?br />
  同一卡片l通常会含有许多卡片,q些卡片的定义、属性或格式通常都大同小异。如果我们逐一定义各个卡片Q显然是十分ȝ的。ؓ此,WML提供了卡片组模板的功能,模板内定义了一pd标准和参敎ͼ可以应用到同一卡片l的所有卡片中去,从而能够大大地提高我们的编E效率。有兛_片组模板的内Ҏ们后面会专门介绍的?br />
2.3.8 WML与URL、程序段锚点

我们知道Q环球网WWW是各U信息和讑֤的网l,Z证全球范围内的交互,Z制定?U规?其一Q统一资源定位器URL提供所有网l资源的标准命名方式和定位方式;其二Q标准协议,如HTTP协议{,提供WWW资源的传输方式;其三。标准内容类型,如HTML、WMLQ提供WWW资源的内容Ş式及标准。WML沿用了这些规范,q扩大了URL使用的范围。在WML中,不仅连接、文件\径及文g名可以作为URL处理Q卡片名、宏变量名及各种内部资源名等也可作ؓURL处理?br />
为此QWML改进了HTML命名资源位置的方式,采用E序锚点QFragment AnchorQ的形式来处理WMLE序中某D늨序的C。程序段锚点Ҏ文档WML规则q行定义Qƈ按照E序D表C符前加井字好(#Q的方式书写。用程序段锚点QWMLE序可以在同一卡片l中定位不同的卡片。如果在E序中不指定E序D,那么E序中引用的URL名称则指整个卡片l,而且卡片l的名称同时也是本卡片组内的W一个卡片的名称?2.3.9 览器操作历?br />
  Z在浏览器端管理WMLE序的执行,WML使用“浏览器前后关系”的功能保存WMLE序执行的状态及各种参数、变量等Q这样可以用来记录用L操作情况。同ӞWMLq提供了一个简单的D历史模型Q以URL地址的Ş式记录了用户览时的各种操作Qƈ把这些URL地址攑օ历史推栈。通过推栈Q用户即可实现历史浏览的回潮及其它操作?/div>

zhyiwww 2006-07-05 10:59 发表评论
]]> վ֩ģ壺 vavava| ĻѾþ99| ޳˰aa߹ۿ| ˳ɫ4444߹ۿ| ˾վ߹ۿ| ۺavһ| ѹۿĻ| AV뾫Ʒһ | þþƷav鶹ɫ | 㽶97ѹ| þþƷ77777| 99Ʒѹۿ| sssۺþþþ| պƵۿ| һŮȫƬѿ| ɫվwwwһ| ³˿Ƭһ | ֻˬִƵ| ޾Ʒ| ձѴ߹ۿ| Ļ | Ʒר| ҹƵ | AV˿߹ۿ| ѿƵվ| 㽶߹ۿ| ˬˬƵѿԿ| һ߹ۿ| һѹۿ| Ʒҳ߲| ڵֻˬվ| ޹Ʒۺϸר| һëƬֱ| һѹۿ| ҴýһAV| av뾫Ʒվ| Ƭѹۿ| ѰvƷƵַ| Ƶ߹ۿ2018| һ߹ۿƷ| þþƷ˳|