<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
<channel>
<title><![CDATA[TkPao's Blog - 程序语言]]></title>
<link>http://www.tkpao.com/</link>
<description><![CDATA[面朝大海 春暖花开……]]></description>
<language>zh-cn</language>
<copyright><![CDATA[Copyright 2005 PBlog3 v2.8]]></copyright>
<webMaster><![CDATA[tkpao@163.com(tkpao)]]></webMaster>
<generator>PBlog2 v2.4</generator> 
<image>
	<title>TkPao's Blog</title>
	<url>http://www.tkpao.com/images/logos.gif</url>
	<link>http://www.tkpao.com/</link>
	<description>TkPao's Blog</description>
</image>

			<item>
			<link>http://www.tkpao.com/article.asp?id=152</link>
			<title><![CDATA[SQL的表名为什么要加方括号?]]></title>
			<author>tkpao@163.com(tkpao)</author>
			<category><![CDATA[程序语言]]></category>
			<pubDate>Fri,17 Apr 2009 16:11:20 +0800</pubDate>
			<guid>http://www.tkpao.com/default.asp?id=152</guid>
		<description><![CDATA[加[ ]用于定界列名或表名等信息，以区别一些特殊的不合命名规则的字串，或是与系统保留字有冲突。如&#34;user&#34;是SQL Server保留的关键字，所以用&#34;sel&#101;ct * from user&#34;查询会提示语法错误。加上中过号，以声明其不是保留字。 &#34;sel&#101;ct * from [user]&#34;如果表名不是关键字，如Company，则用&#34;sel&#101;ct * from Company&#34;是没问题的，不用加中括号,当然最好的办法是表名统统加方括号]]></description>
		</item>
		
			<item>
			<link>http://www.tkpao.com/article.asp?id=150</link>
			<title><![CDATA[什么是LAMP架构]]></title>
			<author>tkpao@163.com(tkpao)</author>
			<category><![CDATA[程序语言]]></category>
			<pubDate>Thu,02 Apr 2009 09:11:35 +0800</pubDate>
			<guid>http://www.tkpao.com/default.asp?id=150</guid>
		<description><![CDATA[1、LAMP就是Linux Apache MySql Php的缩写，是目前非常强大的架站组合。<br/><br/><br/>2、安装<br/>一、软件下载 <br/>分别下载软件以下软件： <br/>Apache-2.0.43 (www.apache.org) <br/>Php-4.2.3 (www.php.net) <br/>Mysql-3.23.53 (www.mysql.com)<br/><br/><br/>二、准备安装 <br/>将所有软件的源代码放置在目录 /home/src 下 ，安装目录为 /server ，下载后的源代码包在/root目录下，故执行以下操作： <br/>mkdir /home/src <br/>mkdir /server <br/>groupadd mysql <br/>useradd -g mysql -d /home/mysql mysql //建立mysql组及用户 <br/>cd /home/src <br/>tar zxvf /root/mysql-3.23.53.tar.gz <br/>tar zxvf /root/httpd-2.0.43.tar.gz <br/>tar zxvf /root/php-4.2.3.tar.gz <br/><br/><br/>三、安装配置过程 <br/>使用 vi 编辑一 shell 文件，内容如下： <br/>----------------------------------- <br/><br/>cd /home/src/mysql-3.23.53 <br/>./configure --prefix=/server/mysql <br/>make <br/>make install <br/>/server/mysql/bin/mysql_install_db <br/><br/>chown -R root /server/mysql <br/>chgrp -R mysql /server/mysql <br/><br/>chown -R root /server/mysql/bin <br/>chgrp -R mysql /server/mysql/bin <br/><br/>chown -R root /server/mysql/var <br/>chgrp -R mysql /server/mysql/var <br/>chmod 777 /server/mysql/var <br/><br/>chown -R root /server/mysql/var/mysql <br/>chgrp -R mysql /server/mysql/var/mysql <br/>chmod 777 /server/mysql/var/mysql <br/><br/>chown -R root /server/mysql/var/mysql/* <br/>chgrp -R mysql /server/mysql/var/mysql/* <br/>chmod 777 /server/mysql/var/mysql/* <br/><br/>chmod 777 /server/mysql/lib/mysql/libmysqlclient.a <br/>#安装 mysql-3.23.53 <br/><br/>cd /home/src/httpd-2.0.43 <br/>./configure --prefix=/server/apache --enable-so <br/>make <br/>make install <br/>#安装 Apache-2.0.43 <br/><br/>cd /home/src/php-4.2.3 <br/>./configure --with-mysql=/server/mysql --with-apxs2=/server/apache/bin/apxs <br/>--eable-track-vars --enable-force-cgi-redirect --enable-pic <br/>--enable-inline-optimiation --enable-memory-limit --enable-bcmath <br/>--enable-shmop --enable-versioning <br/>-enable-calendar --enable-dbx --enable-dio --enable-mcal <br/>--with-config-file-path=/server/apache/conf <br/>make <br/>make install <br/>cp php.ini-dist /server/apache/conf/php.ini <br/>#安装php-4.2.3 ，以上某些模块可不使用，--with-config-file-path=/server/apache/conf 指定 <br/>#php的配置文件在目录 /server/apache/conf <br/><br/>ln -s /server/apache/bin/apachectl /bin/apache <br/>ln -s /server/mysql/bin/mysql /bin/mysql <br/>#创建符号连接 <br/>---------------------------------------------------- <br/><br/>四、修改配置文件 <br/>vi /server/apache/conf/httpd.conf <br/># 加入以下行(装载php4模块并指定.php 文件) <br/># LimitRequestBody (指定php处理的请求数据大小，以下指定为 20M) <br/><br/>LoadModule php4_module modules/libphp4.so <br/><br/>SetOutputFilter PHP <br/>SetInputFilter PHP <br/>LimitRequestBody 20971520 <br/><br/><br/>#注解以下行(在文本前加#)，使apache显示中文，具体原因未知 <br/>ForceLanguagePriority Prefer Fallback <br/>AddDefaultCharset ISO-8859-1 <br/><br/>#加入默认的引导文件index.php(找到DirectoryIndex，修改如下：) <br/>DirectoryIndex index.html index.html.var index.php <br/><br/>#指定网站目录(假设为 /apache 目录) <br/>DocumentRoot &#34;/apache&#34; <br/><br/>vi /server/apache/conf/php.ini <br/>#找到并修改以下参数 <br/>max_execution_time = 600 ;最大运行时间 600 秒 <br/>max_input_time = 600 ;最大输出时间 600秒 <br/>memory_limit = 20M ;最大内存限制 20M <br/>file_uploads = On ;允许上载文件 <br/>upload_max_filesize = 20M ;最大文件大小 20M <br/>post_max_size = 20M ;php可接受的 post 方法大小 20M <br/>session.auto_start = 1 ;session自动启动 <br/><br/><br/>五、运行 <br/><br/>#启动mysql <br/>/server/mysql/bin/safe_mysqld --user=mysql &amp; <br/>#停止mysql <br/>/server/mysql/bin/mysqladmin shutdown <br/><br/>#启动apache <br/>apache start <br/>#停止apache <br/>apache stop <br/><br/>mkdir /apache <br/>echo &#34;/apache/index.php <br/>echo &#34;phpinfo();&#34; &gt;&gt;/apache/index.php <br/>echo &#34;?&gt;&#34; &gt;&gt;/apache/index.php <br/>#生成/apache/index.php 文件 <br/><br/>在浏览器上输入 linux 机器网址，php 的配置信息将显示出来。 <br/><br/><br/>更改php.ini时差了一步，没有把register_globals = Off <br/>改为register_globals = On <br/>还有httpd.conf要把AddDefaultCharset ISO-8859-1 <br/><br/>改为：AddDefaultCharset gb2312才行，不然老是乱码<br/>]]></description>
		</item>
		
			<item>
			<link>http://www.tkpao.com/article.asp?id=125</link>
			<title><![CDATA[安装Ms SQL Server 2005 开发版时出现性能计数器要求安装错误的解决办法]]></title>
			<author>tkpao@163.com(tkpao)</author>
			<category><![CDATA[程序语言]]></category>
			<pubDate>Sat,14 Mar 2009 23:08:07 +0800</pubDate>
			<guid>http://www.tkpao.com/default.asp?id=125</guid>
		<description><![CDATA[首先打开 “控制面板” --&gt; “管理工具” 后，双击 “性能”，显示出性能分析器界面，在右边的控制台节点中展开 “性能日志和警报”后，用鼠标选择 “性能计数器”。<br/><br/>然后双击右边窗口的 “System Overview”，显示 System Overview 属性窗口。<br/><img src="http://www.tkpao.com/attachments/month_0903/s20093142358.gif" border="0" alt=""/><br/><br/>在窗口中的 “添加对象” 和 “添加计数器” 按钮分别单击一次，但单击后显示的窗口不要去动，直接选择取消。<br/><br/>分别单击两个按钮后，单击缺定关闭 System Overview 属性窗口，然后关闭性能窗口。<br/><br/>然后在 “开始” --&gt;&nbsp;&nbsp; “运行”中输入 regedit，开启注册表编辑器。<br/><br/>定位到<br/>[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Perflib<br/>处，在右边的树形目录下可以看到Perflib目录下有004和009两个子目录。<br/><br/>在Sql Server 2005 的安装帮助文件中说的是需要查看009目录的注册表项，而我们大部分人使用的是简体中文的操作系统，所以不能按帮助中说的，而是需要注意004目录中的内容。<br/><br/>打开004 目录中的内容，可以看到如下图：<br/><img src="http://www.tkpao.com/attachments/month_0903/3200931423537.gif" border="0" alt=""/><br/><br/>我们分别双击 “Counter” 项 和 “Help” 项，察看其中的最后的数字，如下图：<br/><br/>Counter 项的内容：<br/><br/><img src="http://www.tkpao.com/attachments/month_0903/r200931423610.gif" border="0" alt=""/><br/><br/>Helper 项内容<br/><img src="http://www.tkpao.com/attachments/month_0903/9200931423633.gif" border="0" alt=""/><br/><br/>这时候，我们知道，Counter 项的数字是5556，Helper项的内容是5557。<br/><br/>然后，操作注册表编辑器的左边的目录树，定位到Perflib目录下，并注意检查右边窗口的 “Laster Counter”项和“Laster Help”项的值，并把Laster Counter的值改成刚才记录下的Counter值5556，把Laster Help 的值改成刚才记下的 Help的值5557。<br/><br/>要注意的是，修改数字的时候，输入的时候必须选则基数是 “十进制”，否则数字将不匹配，Sql Server 2005 检查将再次失败。<br/><br/>然后关闭注册表编辑器，开始安装 Sql Server 2005 ，绝对可以安装成功。<br/><br/>注意：我上面说的5556和5557的数字，每个人每台计算机的数字都是不同的，所以必须要一步步来，检查出准确的数字填入，而不是直接看到5556/5557填写，这样还不行的。]]></description>
		</item>
		
			<item>
			<link>http://www.tkpao.com/article.asp?id=124</link>
			<title><![CDATA[Microsoft VBScript 编译器错误 option explicit  缺少语句]]></title>
			<author>tkpao@163.com(tkpao)</author>
			<category><![CDATA[程序语言]]></category>
			<pubDate>Tue,10 Mar 2009 22:24:03 +0800</pubDate>
			<guid>http://www.tkpao.com/default.asp?id=124</guid>
		<description><![CDATA[错误类型：<br/>Microsoft VBScript 编译器错误 (0x800A0400)<br/>缺少语句<br/>/book2/config.asp, line 3<br/>option explicit<br/><br/>因为option explicit 只能用在首行。<br/>]]></description>
		</item>
		
			<item>
			<link>http://www.tkpao.com/article.asp?id=123</link>
			<title><![CDATA[access数据库记录删除文件并没减小的原因]]></title>
			<author>tkpao@163.com(tkpao)</author>
			<category><![CDATA[程序语言]]></category>
			<pubDate>Sun,08 Mar 2009 22:33:00 +0800</pubDate>
			<guid>http://www.tkpao.com/default.asp?id=123</guid>
		<description><![CDATA[发现问题：当我们从access数据库中删除若干条数据后，发现数据库文件并没有因此而减小，同时，如果使用了“自动编号”字段时，会发现删除记录后，后续的记录编号并不是连续的，之间间隔了被删除的记录的编号，这是因为，access在删除记录后，并不是实际的将其从文件中删除了，而是给这些记录打上了删除的标记，这和windows的文件管理是类似的。<br/> <br/>解决办法：为了减少文件体积和使得自动编号连续，我们需要对数据库进行压缩。点击菜单栏“工具”项目，然后选择“数据库使用工具”中的“压缩和修复数据库”。此时将自动关闭数据库文件并进行压缩，压缩完毕后自动重新打开数据库，这样我们即完成了对已经删除的数据所占用空间的释放。]]></description>
		</item>
		
			<item>
			<link>http://www.tkpao.com/article.asp?id=98</link>
			<title><![CDATA[利用ASP技术开发动态WAP页面]]></title>
			<author>tkpao@163.com(tkpao)</author>
			<category><![CDATA[程序语言]]></category>
			<pubDate>Tue,18 Sep 2007 12:11:06 +0800</pubDate>
			<guid>http://www.tkpao.com/default.asp?id=98</guid>
		<description><![CDATA[利用ASP技术可以开发出动态WAP页面，将ASP技术和数据库技术相结合，则可以开发更为复杂的WAP应用。有关ASP和Web数据库的知识请读者参考专门书籍，我们这里以WML为例，说明ASP和数据库技术在WAP开发中的应用。<br/>11.2.1 在WML程序中使用ASP<br/>在WML程序中使用ASP的规则很简单，只要做到以下5条即可：<br/>(1) 声明ASP采用的脚本语言。与ASP中声明的方式类似，格式为：<br/>&lt;%@ Language=VBScript %&gt;<br/>(2) 声明wml文件类型。这可采用ASP的Response对象，并将ContentType作为它的方法，书写时使用&lt;%和%&gt;包含起来，格式为：<br/>&lt;% Response.ContentType=&#34;text/vnd.wap.wml&#34; %&gt;<br/>(3) 在WAP服务器端，增加服务器对ASP的处理能力。这可在IIS中选中WAP站点或其主目录，并单击鼠标右键，从出现的菜单中选择&#34;属性&#34;命令，打开它的对话框，选择其中的&#34;虚拟目录&#34;选项卡。这里面有一项应用程序设置，将&#34;许可&#34;一项设置为&#34;执行(包括脚本)&#34;即可。更详细的方法可参考我们第4章的内容。<br/>(4) 其余语句和形式采用WML的编程方法即可。<br/>(5) 程序文件保存时要采用&#34;.asp&#34;的扩展名。<br/>例如，下面就是一个在WML程序中应用ASP的简单例子：<br/><br/>&lt;%@ Language=VBScript %&gt;<br/>&lt;% Response.ContentType=&#34;text/vnd.wap.wml&#34; %&gt;<br/>&lt;?xml version=&#34;1.0&#34;?&gt;<br/>&lt;!DOCTYPE wml PUBLIC &#34;-//WAPFORUM//DTD WML 1.1//EN&#34; &#34;<a href="http://www.wapforum.org/DTD/" target="_blank" rel="external">http://www.wapforum.org/DTD/</a> wml_1.1.xml&#34;&gt;<br/>&lt;wml&gt;<br/>&lt;card id=&#34;main&#34;&gt;<br/>&lt;p&gt;<br/>Hello!<br/>&lt;/p&gt;<br/>&lt;/card&gt;<br/>&lt;/wml&gt;<br/><br/>这是一个显示&#34;Hello!&#34;的程序，可把它保存为hello.asp。注意，文件扩展名一定是.asp才行，它与hello.wml是两个不同的文件。我们可以把该文件放到或上传到WAP服务器的相应目录中，比如wap目录。然后，我们启动模拟浏览器，比如WinWap，并在URL栏里输入&#34;<a href="http://127.0.0.1/wap/hello.asp" target="_blank" rel="external">http://127.0.0.1/wap/hello.asp</a>&#34;并按回车，即浏览使用ASP的WML页面的效果。<br/><br/>11.2.2 在ASP中编写WML程序<br/>我们也可以直接在ASP程序中编写WML程序，并可把它输出为WML程序。具体的处理规则如下：<br/>(1) 将WML程序使用&lt;%和%&gt;包含起来，格式为：<br/>&lt;%<br/>……(语句)<br/>%&gt;<br/>(2) 声明wml文件类型。与前面讲述的方法相同，可采用ASP的Response对象，并将ContentType作为它的方法，但书写时不再需要使用&lt;%和%&gt;。格式为：<br/>Response.ContentType=&#34;text/vnd.wap.wml&#34;<br/>(3) 对于其他的WML语句，一律采用Response对象的write方法来处理。基本格式为：<br/>Response.write(&#34;……(WML标签或语句)&#34;)<br/>其中的&#34;WML标签或语句&#34;在write方法中可以连写，以节省程序代码行。<br/>(4) 在WAP服务器端，增加服务器对ASP的处理能力。操作方法与前面介绍的一样，这里不再重述。<br/>(5) 程序文件保存时也要采用&#34;.asp&#34;的扩展名。<br/>下面的程序就是在ASP中编写WML页面的简单例子：<br/><br/>&lt;% <br/>&#39;msg = &#34;Hello &#34;<br/>Response.ContentType = &#34;text/vnd.wap.wml&#34;<br/>Response.write(&#34;&lt;?xml version=&#34;&#34;1.0&#34;&#34;?&gt;&lt;!DOCTYPE wml PUBLIC &#34;&#34;-//WAPFORUM//DTD WML 1.1//EN&#34;&#34; &#34;&#34;<a href="http://www.wapforum.org/DTD/" target="_blank" rel="external">http://www.wapforum.org/DTD/</a>wml_1.1.xml&#34;&#34;&gt;&#34;) <br/>Response.write(&#34;&lt;wml&gt;&lt;card&gt;&#34;)<br/>Response.write(&#34;hello wml ! test ok !&#34;)<br/>Response.write(&#34;&lt;/p&gt;&lt;/card&gt;&lt;/wml&gt;&#34;)<br/>%&gt;<br/><br/>当然，我们这里给出的属于ASP与WML结合使用的简单例子，但采用这种基本方法，并利用ASP的复杂功能，便可以开发出能够实现丰富功能的WML页面。<br/>例如，下面的ASP程序不仅可以显示&#34;Hello&#34;信息，同时可以显示信息的来源地或所在环境，这是通过利用Request对象的ServerVariables方法来获取服务器的HTTP_X_UP_SUBNO和HTTP_X_UP_UPLINK两个变量实现的。程序代码如下：<br/><br/>&lt;% <br/>&#39; hellowml.asp<br/>&#39;<br/>Dim msg, subId, uplink<br/><br/>msg = &#34;Hello &#34;<br/>subId = Request.ServerVariables(&#34;HTTP_X_UP_SUBNO&#34;)<br/>uplink = Request.ServerVariables(&#34;HTTP_X_UP_UPLINK&#34;)<br/><br/>If Not Len(subId) = 0 Then <br/>msg = msg &amp; &#34;from &#34; &amp; subId<br/>End If<br/>If Not Len(uplink) = 0 Then <br/>msg = msg &amp; &#34; at &#34; &amp; uplink<br/>End If<br/><br/>Response.ContentType = &#34;text/vnd.wap.wml&#34;<br/>Response.write(&#34;&lt;?xml version=&#34;&#34;1.0&#34;&#34;?&gt;&lt;!DOCTYPE wml PUBLIC &#34;&#34;-//WAPFORUM//DTD WML 1.1//EN&#34;&#34; &#34;&#34;<a href="http://www.wapforum.org/DTD/" target="_blank" rel="external">http://www.wapforum.org/DTD/</a>wml_1.1.xml&#34;&#34;&gt;&#34;) <br/>Response.write(&#34;&lt;wml&gt;&lt;card&gt;&lt;p&gt;&#34;)<br/>Response.write(msg)<br/>Response.write(&#34;&lt;/p&gt;&lt;/card&gt;&lt;/wml&gt;&#34;)<br/>%&gt;<br/><br/>为增强大家对ASP编写WML程序的印象，我们再给出Phone.com提供的一个例子。该例的作用是根据对服务器和客户端设置测试结果的不同，给出不同的警告信息。程序代码如下：<br/><br/>&lt;% <br/>&#39; pushAlert.asp<br/>&#39;<br/>Dim uplink, subId, url, ttl, alertType, title<br/>Dim contentType, lastResult<br/>contentType = &#34;application/x-up-alert&#34;<br/><br/>uplink = Request.ServerVariables(&#34;HTTP_X_UP_UPLINK&#34;)<br/>subId = Request.ServerVariables(&#34;HTTP_X_UP_SUBNO&#34;)<br/><br/>url = &#34;<a href="http://updev.phone.com/dev/hdml/devhome3.hdml" target="_blank" rel="external">http://updev.phone.com/dev/hdml/devhome3.hdml</a>&#34;<br/>ttl = 3600<br/>alertType = &#34;D---&#34;<br/>title = &#34;Call: &#34; &amp; subId<br/><br/>Set NtfyCl = Server.Cr&#101;ateObject(&#34;Ntfn3Client.Ntfn3Client.1&#34;)<br/>NtfyCl.NtfnSetHost uplink<br/>NtfyCl.NtfnSetTimeout ttl<br/>NtfyCl.NtfnPostAlert subId, url, ttl, alertType, title<br/>lastResult = NtfyCl.NtfnGetLastResult<br/><br/>Dim errString, msg<br/>If lastResult &lt;&gt; 0 Then<br/>errString = NtfyCl.NtfnGetErrorDetail<br/>If errString &lt;&gt; NULL Then<br/>msg = errString<br/>Else<br/>msg = &#34;No error detail, error number: &#34; &amp; lastResult<br/>End If<br/>Else<br/>msg = &#34;Sent alert to &#34; &amp; subId &amp; &#34; at &#34; &amp; uplink<br/>End If<br/><br/>Dim my, digestString<br/>set my = Server.Cr&#101;ateObject(&#34;PDCDigestUtils.CPDCDigest&#34;)<br/>my.DeckType = 0<br/>my.DigestAddDeck &#34;deck1&#34;, &#34;&lt;wml&gt;&lt;card&gt;&lt;p&gt;&#34; &amp; msg &amp; &#34;&lt;/p&gt;&lt;/card&gt;&lt;/wml&gt;&#34;<br/><br/>my.DigestSuppressContentType 1<br/>digestString = my.DigestSerialize(0)<br/>Response.ContentType = my.DigestGetContentType<br/>Response.BinaryWrite(digestString)<br/>%&gt;<br/><br/>为便于大家学习，我们本书所附光盘中都提供了这些程序的源代码，大家不要忘了实际测试一下。<br/>11.2.3 利用ASP在WML中实现动态数据库应用<br/>通过前面介绍的例子，我们可以看出利用ASP技术可以为WML实现非常复杂的应用。我们知道，ASP的数据库处理能力是很强的，所以，利用ASP我们可以在WML中实现动态的数据库应用。由于举例说明这种应用需要占用很大的篇幅，所以我们这里只给出基本的开发步骤：<br/>第一步，分析WAP的实际问题，设计出所需的数据库，并建立其中的数据表。例如，我们可以使用Microsoft Access等数据库系统来完成这一方面的工作。<br/>第二步，建立ODBC源，并对上述数据库进行命名。操作方法十分简单：以Windows 95/98/NT/2000为例，我们只需在&#34;控制面板&#34;中双击&#34;ODBC数据源&#34;图标，从打开的&#34;ODBC数据源管理器&#34;对话框中即可完成相关操作。<br/>第三步，根据实际问题，编写引用和处理数据库的ASP/WML程序。<br/>第四步，将程序上载到WAP服务器，随后就可以进行测试。通过测试后，就可以为WAP用户使用了。]]></description>
		</item>
		
			<item>
			<link>http://www.tkpao.com/article.asp?id=97</link>
			<title><![CDATA[第五章 WMLScript脚本程序设计 下]]></title>
			<author>tkpao@163.com(tkpao)</author>
			<category><![CDATA[程序语言]]></category>
			<pubDate>Fri,14 Sep 2007 17:24:07 +0800</pubDate>
			<guid>http://www.tkpao.com/default.asp?id=97</guid>
		<description><![CDATA[5.2 函数的声明与调用<br/><br/>在WML Script中，函数是一种能够完成某种功能的代码块，并可以在脚本中被事件处理或被其他语句调用，也可以被WML程序所处理和调用。一般地，当我们编写WML Script脚本时，如果脚本中的代码长度还是很长，则一般还可以根据功能将函数再进行划分，分成为几个功能更加单一的函数。虽然说这样对长代码的处理方法并不是编写脚本程序的强制性要求，但通过函数的划分和运用，我们可以使得WML Script脚本具有更好的可读性，也便于我们对脚本程序的编写与调试。而且，如果在某些脚本中有多处完全相同的代码块，那么我们也可以将这些代码快些为一个函数，然后在脚本中调用这个函数，从而提高代码的重要性，简化代码的编写工作。<br/><br/>WML Script的函数共用和Jave语言、C/C++语言的函数有所不同。我们知道，Jave语言、C/C++语言中有函数和过程之分，函数能够完成一定的功能并有返回值，而过程进可完成一定的功能但没有返回值。可是，WML Script中并不区分函数和过程，因为它只有函数，没有过程。WML Script的函数完成一定功能后始终有返回值，不过返回值分两种情况，即非空的返回值和空字符串（&#34;&#34;）形式的返回值。前者是真正的返回值，后者其实相当于没有返回值。也就是说，WML Script中的函数同时具有其他语言中的函数和过程的功能。<br/><br/>5.2.1 函数的声明<br/><br/>使用函数时，要根据函数的调用使用，而调用函数前必须声明函数，也就是需要先定义函数。WML Script中定义函数的一般方式如下：<br/><br/>function函数名（参数列表）<br/><br/>{<br/><br/>代码块<br/><br/>}；<br/><br/>另外，WML Script规定使用extern关键字来声明一个外部函数：<br/><br/>extern function函数名（参数列表）<br/><br/>{<br/><br/>代码块<br/><br/>}；<br/><br/>从中可以看出，函数的定义有以下3部分组成：<br/><br/>（1）函数名。即函数的名称，其命名规则应遵守WML Script的标识规则。调用函数时都是通过函数名进行调用的，所以函数必须要有函数名。<br/><br/>函数命名时，一般要使用能够描述函数功能的但此来作为函数名，也可以使用多个单词组合进行命名，这样做的好处是能够提高WML Script脚本的可读性。<br/><br/>函数名在同一个WML Script脚本文件里必须是唯一的。如若不然，则会导致函数定义混乱。<br/><br/>（2）参数列表。即调用函数时需要的参数。参数列表通常是可选的，有的函数需要，有的函数可能不需要。参数列表的作用是向函数传递一些参数，使得函数可以直接使用这些参数的值。<br/><br/>调用函数的时候，参数个数和类型必须和函数定义示所声明的参数个数即类型保持一致。而且函数的参数就如同似函数体内的局部变量，它们在函数调用的时候被初始化。<br/><br/>（3）代码块。它是函数的主体部分。代码块中的代码包含在以对花括号（{ }）中，代码块可以执行并完成函数的功能。编写代码块是应当遵循WML Script的编程规则。<br/><br/>有时，函数需要返回一个值给调用函数的语句，则应该在代码块的后面一行使用return语句，返回所需的数值。<br/><br/>与C/C++等语言类似，WML Script的函数是可以嵌套的，以就是说，在一个函数中还可以调用其他函数。但是，函数声明是不能嵌套，这是WML Script的强制性规定。<br/><br/>下面几行语句就是定义函数的简单例子：<br/><br/>function currencyConverter(currency,exchangeRate)<br/><br/>{<br/><br/>return currency*exchangeRate;<br/><br/>};<br/><br/><br/>其中，该函数的名称为currencyConverter,参数有currency和exchangeRate两个，函数代码块包含一条语句，用于返回currency和exchangeRate的乘积。<br/><br/>下面是一个使用extern定义外部函数的例子。其中函数名为textIt,它没有参数，函数体中定义了两个赋值变量，一个赋整数，一个赋函数值：<br/><br/>extern function testIt(){<br/><br/>var USD=10；<br/><br/>var FIM =currencyConverter(USD,5.3)<br/><br/>};<br/><br/>5.2.2 函数的调用<br/><br/>编写好的函数必须经过合法的调用，才可以发挥它应用的作用。函数调用将返回一个值，比如一个计算结果。WML Script中的函数主要可以分为内部函数、外部函数和库函数，下面我们就介绍这3类函数的调用方法。<br/><br/>内部函数<br/><br/>所谓内部函数是指函数的定义与其调用函数在同一个脚本文件内的函数，对内部函数的调用称为内部调用。内部函数的调用非常简单，只需提供函数名和所需参数值即可，参数值必须和函数定义时指定的参数个数即类型一致。而且函数调用需要使用操作符来接收或处理被调用的返回值。<br/><br/>内部函数可以在其定义之前调用，也可以在其定义之后调用。例如，下面就是一个在函数定义之后调用的例子。<br/><br/>function test1(val){<br/><br/>return val*val;<br/><br/>}；<br/><br/>function test2(param){<br/><br/>return test1(param+1);<br/><br/>};&nbsp;&nbsp;<br/><br/><br/>这个例子中定义了两个函数test1和test2。test1函数用于计算给定参数值的平方并将结果返回；test2函数将给定的参数值加1，然后这个和为参数值，来调用test1函数，得到结果后在将给结果返回到调用test2函数的语句。<br/><br/>注意，本例中test2函数调用了test1函数，这种在函数中调用其他函数的方法称为函数调用嵌套。WML Script的内部函数、外部函数和库函数都支持嵌套调用，后面我们专门介绍这方面的内容。<br/><br/>外部函数<br/><br/>外部函数使一个在WML Scrupt外部文件中定义的函数。调用外部函数的方法与调用内部函数的方法基本类似，不同之处在于调用处外部函数时一是要指定外部文件的地址即名称，二是要在调用的外部函数名的前面加上外部文件的名称。<br/><br/>WML Script规则使用use url来指定外部文件，语法格式为：<br/><br/>use url还有外部函数的外部文件名 外部文件所在的URL;<br/><br/>这样，WML Script的预编译头就可以将外部文件映射为一个可以在内部使用的标识。然后，使用这个标识并加上井号键（#）和标准的函数调用即可实现外部函数调用，语法格式为：<br/><br/>外部文件名#外部函数（参数列表）；<br/><br/>例如，<a href="http://www.host.com/scri&#112;t" target="_blank" rel="external"><a href="http://www." target="_blank" rel="external"><a href="http://www." target="_blank" rel="external">http://www.</a></a>host.com/scri&#112;t</a>下有我们需要的外部文件，名为OtherScript,所以我们可使用use url来指定该文件：<br/><br/>use url OtherScript&#34;<a href="http://www.host.com/scri&#112;t" target="_blank" rel="external"><a href="http://www." target="_blank" rel="external"><a href="http://www." target="_blank" rel="external">http://www.</a></a>host.com/scri&#112;t</a>&#34;<br/><br/>这一外部文件中含有我们需要调用的外部函数testme,则可采用“外部文件名#外部函数（参数列表）”的形式来调用它：<br/><br/>OtherScript#testme(param+1);<br/><br/>这个例子完整的写出来，就是下面的程序：<br/><br/>use url OtherScript&#34;<a href="http://www.host.com/scri&#112;t" target="_blank" rel="external"><a href="http://www." target="_blank" rel="external"><a href="http://www." target="_blank" rel="external">http://www.</a></a>host.com/scri&#112;t</a>&#34;<br/><br/>function test(param){ <br/><br/>return OtherScript#testme(param+1);<br/><br/>};<br/><br/>库函数<br/><br/>特别指定，WML Script的库函数一律是指它的标准库函数。因为与标准库函数对应，WML Script还有一些非标准的库函数。我们这里先介绍标准库函数，非标准库函数后面再介绍。<br/><br/>所有库函数都有所数的库，函数的库中通常含有一类函数。因此，调用某个库函数时，一要指定它的库名，二要指定它的函数名。WML Script规定，调用标准库函数时可以通过在函数库的名字后面加上句点号（.）和库函数的标准调用来实现，语法格式为：<br/><br/>函数库名.函数名（参数列表）；<br/><br/>例如，WML Script的浮点库即Float库中有一个开根方的函数sqrt,该函数只有一个参数，那么调用squrt库函数的方法为：<br/><br/>Float.sqrt(number);//这里要求number大于或等于0<br/><br/>下面给出了调用库函数的简单例子。首先一param参数值调用Lang.abs()函数，返回结果加1后再作为参数调用Float.sqrt()函数，它的返回结果作为内部函数test的返回值：<br/><br/>function test(param){<br/><br/>return Float.sqrt(Lang.abs(param)+1)；<br/><br/>}；<br/><br/>2.3 函数的嵌套调用<br/><br/>WML Script的函数定义都是互相平行、独立的，定义函数的时候我们不能在一个函数内定义另外一个函数，也就是说，函数定义是不能嵌套的。但是，函数调用确是可以嵌套的，也就是说，我们可以在调用一个函数的过程中调用另外一个函数。<br/><br/>它的执行过程是：<br/><br/>（1）执行a函数开头部分；<br/><br/>（2）遇到调用b函数的操作语句，流程则专区执行b函数；<br/><br/>（3）执行b函数开头部分；<br/><br/>（4）遇到调用c函数的操作语句，流程则专区执行c函数；<br/><br/>（5）执行b函数,如果没有其他嵌套的函数，则完成c函数的全部操作；<br/><br/>（6）返回调用c函数的语句，即返回到b函数；<br/><br/>（7）继续执行b函数中尚未执行的操作，直到b函数结束；<br/><br/>（8）返回a函数中调用b函数的语句；<br/><br/>（9）继续执行a函数的剩余操作，直到函数结束。<br/><br/>function myFunC(param1){<br/><br/>return param1*param1=Float.squt(Lang.abs(param)+1)；<br/><br/>}；<br/><br/>function myFunB(param0){<br/><br/>return myFunC(param0+1)*|param0+12;<br/><br/>};<br/><br/>function myFunA(param){<br/><br/>return myFunB(param*param+1);<br/><br/>};<br/><br/><br/>5.3 预编译<br/><br/>WML Script的预编译主要用于在编译阶段控制编译器的行为。与编译头一般在文件开头和函数声明之前指定，WML Script规定所有的预编译头都是一关键词use加上指定的预编译属性进行指定。<br/><br/>在大多数的编程中，我们比较长用的预编译行为主要涉及外部文件声明、访问权和Meta信息设置。<br/><br/>5.3.1 外部文件<br/><br/>我们知道，使用URL地址可以定位一个WML Script文件。利用该URL地址；在WML Script编程中我们可以通过预编译来调用WML Script的外部文件，外部文件预编译头的声明方法是use url，其语法格式如下：<br/><br/>use url外部文件名 &#34;URL&#34;地址<br/><br/>这样，我们在当前文件的编程中就可以使用该预编译头声明的外部文件，从而可以调用该外部文件的函数。其语法格式为：<br/><br/>外部文件名#函数名（参数列表）；<br/><br/>例如，我们希望在当前的WML Script程序中调用OtherScript外部文件中的check()函数，而且我们知道OtherScript文件的URL地址为<a href="http://www.host.com/app/scri&#112;t" target="_blank" rel="external"><a href="http://www." target="_blank" rel="external"><a href="http://www." target="_blank" rel="external">http://www.</a></a>host.com/app/scri&#112;t</a>。因此，我们可以使用use url来声明这一外部文件：<br/><br/>use url OtherScript&#34;<a href="http://www.host.com/scri&#112;t" target="_blank" rel="external"><a href="http://www." target="_blank" rel="external"><a href="http://www." target="_blank" rel="external">http://www.</a></a>host.com/scri&#112;t</a>&#34;<br/><br/>随后，我们就可以在程序中调用OtherScript中的check()函数了：<br/><br/>function test(par1,par2)<br/><br/>{<br/><br/>return OtherScript#check(par1,parr2);<br/><br/>};<br/><br/>其中调用执行的过程如下：<br/><br/>（1）找到WML Script外部文件的URL地址；<br/><br/>（2）当前函数从指定的URL地址值装载外部文件；<br/><br/>（3）检测外部文件的内容，并执行其中的check（）函数。<br/><br/>ure url 预编译头指定的外部文件名在当前程序中必须唯一，用户不能指定不同URL地址的同名外部文件，否则在调用外部文件时就会发生混乱。<br/><br/>另外，use url预编译头中的URL地址也可以是相对URL地址。相对URL的起始位置是当前程序文件所在的位置，并在此基础上根据URL进行定位。<br/><br/>如果URL地址中的字符包含有转义字符，则WML Script将根据转义要求进行转义。不过，程序在编译的时候编译器并不会对他们进行转义，而是在程序执行时完成，检查URL格式和URL地址的有效性。<br/><br/>5.3.2 访问权限<br/><br/>我们可以使用访问权限预编译设保护文件的内容，实现访问控制。WML Script编程中，必须在调用外部函数之前使用访问权限预编译头声明外部文件的访问权限。不过，WML Script访问权限检查的缺省值是不进行检查，即disabled.但访问权限一经声明，以后当调用外部函数的时候，编译器就会检查外部文件的访问权限，以决定调用这是否有权使用该文件及其内含函数。<br/><br/>访问权限预编译头的声明方法是use access,其语法格式如下：<br/><br/>use access domain操作域名 path操作路径：<br/><br/>访问权限预编译头通过指定domain和path属性来决定编译器将要进行什么样的检查工作。如果文件有domain或者path属性，那么文件所在的URL就必须和属性中的值一致。比较时，域和路径都依据URL大写规则进行比较。具体的比较预则如下：<br/><br/>（1）操作域与URL中的域后缀相匹配。与后缀匹配是值所有的子域从后向前都必须一致。例如：www.wapforum.org和wapforum.org相匹配，而与forum.org并不匹配。<br/><br/>（2）操作路径和URL中的路径前缀相匹配。路径前缀匹配是值从前向后必须一致。例如：“/X/Y”与“/X”相匹配，而不是和“/XZ”相匹配。<br/><br/>（3）却省的domain数行为当前的文件域，就是“/”。<br/><br/>不过，为了简化编程，有时WMLScript并不需要直到外部文件的绝对路径，我们只需提供文件的相对URL即可，用户浏览器执行程序是卡相对路径自动转换为绝对路径，根据路径属性进行匹配。例如：如果访问权限预编译头及其指定属性为：<br/><br/>use access domain&#34;wapforum.org&#34;path&#34;/finance&#34;;<br/><br/>则可以使用以下的路径来调用指定文件中的外部函数，它们都符合相对URL地址匹配规则：<br/><br/><a href="http://wapforum.org/finance/money.cgi" target="_blank" rel="external">http://wapforum.org/finance/money.cgi</a><br/><br/><a href="http://www." target="_blank" rel="external"><a href="http://www." target="_blank" rel="external">http://www.</a></a> wapforum.org/finance/money.cgi<br/><br/><a href="http://www." target="_blank" rel="external"><a href="http://www." target="_blank" rel="external">http://www.</a></a> wapforum.org/finance/demos/packages.cgi?x+123&amp;y+456<br/><br/>而以下的路径调用则非法的，因为它们或者操作域不对，或者URL地址不能与指定的相对URL相匹配：<br/><br/>heep//www.test.net/finance<br/><br/>http//www.qapforum.org/internal/foo.wml<br/><br/>需要强调指出的是，WML Script规定，同一程序中只能定义一个访问权限与编译头，否则就会导致编译错误。<br/><br/>5.3.3 Meta 信息<br/><br/>我们还可以通过与编译头的形式声明WML Script文件的Meta信息。Meta信息主要用于指定文件所需Mete属性的属性名（Property name)、属性值(Content)以及文件的配置（信息），属性都属于字符串类型的数据。Mate信息域编译头使用use meta声明，其语法格式为：<br/><br/>usr meta 属性 该属性Meta信息：<br/><br/>Meta的属性主要包括Name、HTTP Equiv和User Agent三种，下面我们分别讲解它们的声明方法：<br/><br/>（1）Name。该属性用于指定服务器使用的Meta信息。这些信息仅供服务使用，用户浏览器并不理会这些信息。<br/><br/>例如，以下Name属性的Meta信息指定了服务器的创建时间：<br/><br/>use meta name &#34;Cr&#101;ated&#34;&#34;26-June-2000&#34;;<br/><br/>该信息只会作用于服务器，而不会影响用户浏览器的操作。<br/><br/>（2）HTTP Equiv。该属性用于指定需要解释为HTTP头的Meta信息。对于已经编译的文件来说，当它到达用户浏览器前，WML Script将根据HTTP Equiv属性指定的Meta信息将文件转换为WSP或HTTP的响应头,进行文件的解释和执行。<br/><br/>例如，以下声明的http equiv属性指定按照脚本语言的关键字来解释当前文件：<br/><br/>use meta http equiv&#34;Keywords&#34;&#34;Script,Language&#34;;<br/><br/>(3)User Agent。该属性用于定义用户浏览器使用的数据类型。例如：<br/><br/>use meta user agent&#34;Type&#34;&#34;Test&#34;;<br/><br/>它指定当前数据必须立即发送给用户浏览器，然后马上清除掉。<br/><br/>5.4 执行时的错误检测与处理<br/><br/>WML Script函数的功能提供用户服务，并希望用户界面能在任何的状况下运作顺利，因此错误的处理是最大的课题，这表示了语言可能不提供预期的机制，如他应该可以防止错误发生或提醒用户注意并采取适当的动作，种植储蓄执行是最后的手段。下面几个小节列出了当为码下载并执行时会发生的错误，一些程序上的错误并不在谈论的范围（如无穷循环），像这类的例子就需要手动来终止。<br/><br/>5.4.1 错误检测<br/><br/>错误检测工具能让你检测错误但会干扰系统的动作，因为WML Script是弱格式语言，所以由一些特殊功能的工具来检测有invalid数据格式所引起的错误:<br/><br/>检测给定的变量包含的是正确值：WML Scritp含有格式确认函数库程序如：Lang.isInt()Lang.isFloat()、Lang.parseInt()、Lang.parseFloat。<br/><br/>检测给定的变量包含的只是正确的格式：WMLScript含有运算符typeof与isvalid能让你使用。<br/><br/>5.4.2错误处理<br/><br/>错误处理是在发生错误之后，有些状况是错误检测无法防止的，如内存限制后外部信号等，或者是数据很难处理，如溢出（overflow）或亏失（underflow）,而这些状况可以分为两类：<br/><br/>严重错误（fatalerror）:这种错误会造成程序终止，因为WML Scritp程序会让一些用户界面调用，程序终止通常会跟调用它的用户界面发出信号，用户界面就会告知用户这个错误。<br/><br/>错误（non-fatalerrow）:这种错误会把信号传回程序，如一些特殊的值，然后由程序决定所要采取的行动。<br/><br/>下列的错误是根据他们的严重性来区分。<br/><br/>5.4.3 严重错误（fatalerror）<br/><br/>下面的小节会讨论WML Script的严重错误。<br/><br/>位码错误（bytedode error）<br/><br/>这些错误跟位码与由WML Script位码解译器所执行的指令有关他们指出了错误的元素群、无效的指令、指令所使用的参数无效，或指令无法执行。<br/><br/>验证错误（verification failed）<br/><br/>说明：调用的程序中的特定位码无法通过验证。<br/>如何发生：每次程序试着用外部程序。<br/>范例：var a = 3*OtherScript#doThis(param)<br/>严重性：严重。<br/>判定状况：当检测位码验证式。<br/>解决方法：终止程序与WML Script解译其调用者的错误信号。<br/><br/>说明：调用一个函数库程序时发生严重错误。<br/>如何发生：每次调用函数库程序。<br/>范例：var a = string.format(param)<br/>严重性：严重。<br/>判定状况：无<br/>解决方法：终止程序与WML Script解译其调用者的错误信号。 <br/>说明:调用函数参数的数目跟被调用函数的参数数目不符合。<br/>如何发生：调用外部程序。<br/>范例：编译器参生一个无效的参数给予指令使用，或者被调用的程序参数数目改变了。<br/>严重性：严重。<br/>判定状况：无<br/>严重性：严重。<br/>解决方案：终止程序与WML Script解译器调用着的错误信号。<br/><br/>说明: 在特定的程序中找不到所需要的外部程序。<br/>如何发生：调用外部程序。<br/>范例： var a =3*OtherScript#doThis（param）<br/>严重性：严重。<br/>判定状况：无<br/>解决方案：终止程序与WML Script解译器调用着的错误信号。<br/><br/><br/>说明: 由于在网络服务器的程序存取又无法修复的错误或特定程序并不在网络服务器中所引起的程序无法载入。<br/>如何发生：调用外部程序。<br/>范例： var a =3*OtherScript#doThis（param） <br/>严重性：严重。<br/>判定状况：无<br/>解决方案：终止程序与WML Script解译器调用着的错误信号。<br/><br/>说明: 存取错误，所调用的外部程序加了保护。<br/>如何发生：调用外部程序<br/>范例：var a =3*OtherScript#doThis（param） <br/>严重性：严重。<br/>判定状况：无<br/>解决方案：终止程序与WML Script解译器调用着的错误信号。<br/><br/>说明: 因为程序错误造成stack underflow。 <br/>如何发生：程序要取出（pop）一个空堆<br/>范例： 当组译器产生错误码。<br/>严重性：严重。<br/>判定状况：无<br/>解决方案：终止程序与WML Script解译器调用着的错误信号。<br/><br/>说明:执行调用Lang.abort（） 是发生的错误。<br/>如何发生：每当程序调用Lang.abort（）函数。<br/>范例： Lang.abort(&#34;unrecoverable error&#34;)<br/>严重性：严重。<br/>判定状况：无<br/>解决方案：终止程序与WML Script解译器调用着的错误信号。<br/><br/>说明:发生堆栈溢出。 <br/>如何发生：程序资源太多或要推入太多的变量到运算之中。<br/>范例： function f|（x）（f（x+1）；）；<br/>严重性：严重。<br/>判定状况：无<br/>解决方案：终止程序与WML Script解译器调用着的错误信号。<br/><br/><br/>说明:没有多余的内存可供解译器使用。<br/>如何发生：作业系统无法配置多余的空间给解译器适使用。<br/>范例： function f（x）{<br/>x=x+&#34;abcdefghijklmnopqrstuvxyz&#34;;<br/>f(x) ;<br/>};<br/>严重性：严重。<br/>判定状况：无<br/>解决方案：终止程序与WML Script解译器调用着的错误信号。<br/><br/>说明:用户终止程序的执行(如按下reset钮)<br/>如何发生：随时。<br/>范例： 当应用程序正在执行是用户按下reset钮。<br/>严重性：严重。<br/>判定状况：无<br/>解决方案：终止程序与WML Script解译器调用着的错误信号。<br/><br/>说明:当程序执行中，发生了外部严重的错误。<br/>如何发生：随时。<br/>范例： 电力微弱，系统自动。<br/>严重性：严重。<br/>判定状况：无<br/>解决方案：终止程序与WML Script解译器调用着的错误信号。<br/><br/>5.4.4 一般错误（Nonfatal error）<br/><br/>下面说明了WML Script的一般错误：<br/><br/>计算错误（computational error）<br/><br/>这些错误是由于WML Script数学上的运算所造成。<br/><br/>除以零（divide by zero）<br/>说明：发生了除以零的状况<br/>如何发生：当程序中有除以零的状况。<br/>范例：var a= 10；<br/>var b= 0；<br/>var x= a/b；<br/>var y= a div b；<br/>var z= a%b；<br/>a/=b；<br/>严重性： 一般。<br/>判定状况：高<br/>解决方案：产生结果为invalid。<br/><br/>说明：发生了除以零的状况<br/>如何发生：程序要执行浮点数运算。<br/>范例：var a = Float.precision();<br/>var b = Float.precision();<br/>var c = a* b<br/>严重性：一般。<br/>判定状况：高，在某些状况很困难。<br/>解决方法：产生的结果为浮点数值0.0<br/><br/>常数参考错误（constant reference error）<br/><br/>说明：所参考的浮点数实字为not a number。<br/>如何发生：程序试着存取一个浮点数实字但组译器产生了not a number的浮点数常数。<br/>范例：参考浮点数常数。<br/>严重性：一般。<br/>判定状况：高<br/>解决方法：这会产生invalid值。 <br/><br/>说明：参考的浮点数实字不是正无穷大就是负无穷大的浮点数常数。<br/>如何发生：程序试着存取一个浮点数实字但组译器产生了正无穷大或负无穷大的浮点数常数。<br/>范例：参考浮点数常数。<br/>严重性：一般。<br/>判定状况：高<br/>解决方法：这会产生invalid值。<br/><br/>说明：需要参照浮点数值所发生的错误。<br/>如何发生：程序需要使用浮点数值但环境值支持整数值。<br/>范例：var a = 3.14;<br/>严重性：一般<br/>判定状况：高 <br/>解决方法：这会产生invalid值。 <br/><br/>转换错误<br/><br/>这个错误的发生同WML Script所支持的自动转换有关。<br/><br/>说明：欲转换成整数值，但这个值超过整数所能接受的范围（正或负）。<br/>如何发生：程序试着自动转换成整数时。<br/>范例： var a = -&#34;99999999999999999999999999999999999999999&#34;;<br/>严重性：一般 <br/>判定状况：高<br/>解决方法：这会产生invalid值。 <br/>说明：欲转换成浮点数，但这个值小于浮点数所能接受的范围（正或负）。<br/>如何发生：程序时值自动转换成浮点数时。 <br/>范例：var a = -&#34;99999999999999999999999999999999999999999&#34;; <br/>严重性：一般 <br/>判定状况：高 <br/>解决方法：这会产生invalid值。 <br/><br/>说明：欲转换成浮点数，但这个值小于浮点数所能接受的范围（正或负）。<br/>如何发生：程序时值自动转换成浮点数时。<br/>范例：var a = -&#34;99999999999999999999999999999999999999999&#34;; <br/>严重性：一般 <br/>判定状况：高<br/>解决方法：这会产生浮点数0.0。<br/>]]></description>
		</item>
		
			<item>
			<link>http://www.tkpao.com/article.asp?id=96</link>
			<title><![CDATA[第五章 WMLScript脚本程序设计 上]]></title>
			<author>tkpao@163.com(tkpao)</author>
			<category><![CDATA[程序语言]]></category>
			<pubDate>Fri,14 Sep 2007 17:22:56 +0800</pubDate>
			<guid>http://www.tkpao.com/default.asp?id=96</guid>
		<description><![CDATA[作为一种编辑语言，WMLScript提供了强大的函数、语句和库功能，以及外部编辑、访问控制等支持，同时对程序运行中可能产生的错误给出了检测手段和具体的解决办法。这些内容属于WMLScript的脚本程序设计知识和进一步的编程规定，我们本章就对此进行详细介绍。<br/><br/>5.1 语句<br/><br/>前面我们学习了变量、操作符和表达式，但仅由这些内容并不能完成某个完整的功能，因为他们不能形成完整的操作或处理程序。变量就如同与严重的单词，表达式如语言中的词组，他们都不能表达一个完整的意思；只有语句，是语言中完整的句子，能够表达完整的意思并实现某个完整的功能。WML Script提供了丰富的语句功能，使用这些语句我们可以在WML的卡片中建立交互功能和其他需要的复杂功能。<br/><br/>在WML Script中，每条语句的后面都需要以一个分号（；）结尾。为了养成严谨的编程风格，建议大家编写脚本时，语句后一定要加上分号（；），这也有助于我们形成一种良好的编程习惯。<br/><br/>WML Script语句的书写和排列格式比较自由。我们可以在同一程序行中连续写上多个语句，也可以把同一语句分成多行排列。WML Script将根据分号（；）来确定语句的具体内容。<br/><br/>WML Script的语句主要包括两类。第一类是基本语句，如空语句、表达式语句、块语句、变量语句和return语句等；第二类是条件语句，如if语句；第三类是循环语句，如while语句、for语句、break语句和continue语句等。下面我们分别讲解这些语句的语法、功能和使用方法。<br/><br/>5.1.1 基本语句<br/><br/>WML Script基本语句主要用于程序格式控制和变量声明，其中有些语句我们已经不太陌生了。<br/><br/>空语句<br/><br/>空语句用于定义一个空的程序行，它没有任何标识符和操作符，也不执行任何操作。它只是以分号（；）结束。其语法格式为：<br/><br/>；<br/><br/>显然，空语句是一种十分特殊的语句。由是我们为了让程序具有更好的可读性，通常在程序中的适当地方加上几个空语句，以起到分隔或突出的作用。例如，下面的几行程序中就含有一个空语句：<br/><br/>str=&#34;Hello&#34;;<br/><br/>val=25;<br/><br/>;<br/><br/>MyVal=val*val+5;<br/><br/>alert(&#34;Hi,Hi!!!&#34;);<br/><br/>再如，while语句用于判断一个条件并在条件满足的时候执行相应的任务，但如果希望条件满足的时候什么也不作，那么就可以给它配上一个空语句，使之条件满足的执行空操作：<br/><br/>while（！poll(device)）;<br/><br/>这实际上是while语句和空语句组成的两条语句。其中的分号（；）在这里就代表了空语句。这两条语句的作用是在poll()函数为真（）之前一直等待。<br/><br/>表达式语句<br/><br/>表达式语句用于向变量赋值，或进行数学计算，或进行函数调用。表达式语句也是我们最常用的一种语句，语法格式为：<br/><br/>表达式；<br/><br/>下面几行程序都是合法的表达式语句：<br/><br/>str=&#34;Hey&#34;+yourName;<br/>val3=prevVal+4<br/>counter++;<br/>myValue1=counter,myValue2=val3<br/>alert(&#34;Watch out!&#34;);<br/>retVal=16*Lang.max(val3,counter);&nbsp;&nbsp;<br/><br/><br/>块语句<br/><br/>块语句使用两个花括号（{ }）包含一个语句集，形成一个语句体。WML Script的许多语句都需要使用块语句来实现语句体，快语句的语法格式为：<br/><br/>{<br/><br/>语句列表；<br/><br/>}<br/>下面的简单程序就是使用块语句的例子：<br/><br/><br/>}<br/>vari=0;<br/>var x=Lang.abs(b);<br/>popUp(&#34;Remember!&#34;);<br/><br/>}<br/><br/>变量语句<br/><br/>变量语句用于生命变量并可进行变量的初始化赋值。如果用户不赋值，那么WML Script会自动将变量语句生命的变量赋予一个空字符串（&#34;&#34;）。基本的语法格式为：<br/><br/>var 变量名;<br/><br/>如果像一次生命多个变量，则相邻变量名之间使用逗号（，）间隔，其语法格式为：<br/><br/>VAR 变量名1，变量名2......，变量名n;<br/><br/>如果想在生命变量时同时初始化变量，则可按如下语法格式书写：<br/><br/>var 变量名=初始化<br/><br/>为便于大家更好的掌握变量语句，我们给出一个多出使用该语句的程序： <br/><br/>function count(stu){<br/><br/>var result=0; //声明变量的同时初始化变量<br/><br/>while(str!=&#34;&#34;){<br/><br/>var ind=0; //每次循环都初始化一次<br/><br/>// 为退出循环，本块语句内应当提供修改变量str值的语句<br/><br/>}；<br/><br/>return result<br/><br/>};<br/><br/>function example(param){<br/><br/>var a=0;<br/><br/>if(param&gt;a){<br/><br/>var b=a+1; //声明b变量的同时使用a变量初始化b变量<br/>}else{<br/><br/>var b=a+2； //声明c变量的同时使用a变量初始化c变量<br/>};<br/><br/>return a; //返回a变量的值<br/><br/>}；&nbsp;&nbsp;<br/><br/><br/>注释语句<br/><br/>严格来讲，注释语句在WML Script中还不算是真正的语句，它只是一种前指向的规定。不过它也有严格的语法和标注方法，所以我们这里还是像其他编程语言处理的一样，把WML Script注释方法以语句的形式介绍一下。<br/><br/>注释在程序执行的时候没有任何作用，但是可以用于对程序进行解释，则增强程序的可读性。为了形成良好的编程风格，我们应该养成书写注释的良好习惯，注释有两种表达方式：<br/><br/>（1）通过双斜线注释一行，这样在双斜先后的字符将成为注释而不被执行。该注释行可以单独一行书写，也可以放在其他语句的后面。<br/><br/>例如，可以进行如下所示的注释：<br/><br/>//变量j用于小数每月的天数<br/><br/>j=0； //我们这里将j赋值为0<br/><br/>（2）通过符号“/*”和“*/”来规定注释语句，这种注释方式可以进行多行注释，符号“/*”和“*/”之间的内容就是注释语句。例如，可以进行如下所示的多行注释：<br/><br/>/*我们定义了两个变量：i和j。其中：<br/><br/>i用于描述每年中的月数，<br/><br/>而j用于描述每月的天数*/<br/><br/>j=0； /*我们这里将j赋值为0*/<br/><br/>return语句<br/><br/>return语句主要用在函数体中，在函数结束前，可以通过return语句，把函数处理的结果返回给调用函数的语句。它的语法格式如下：<br/><br/>return表达式；<br/><br/>下面的函数给出了应用return语句的例子： <br/><br/>function square(x){<br/><br/>if(!(Lang.isFloat(x)))return invalid;<br/><br/>return x*x<br/><br/>};&nbsp;&nbsp;<br/><br/><br/>5.1.2 条件语句<br/><br/>在条件语句中，当满足某种条件时 ，就会执行指定的一些代码，而在代码组另外某种条件时，则会执行另外一些代码。WML Script的条件语句就是if...else语句，它的一般表达相识如下：<br/><br/>if(条件){<br/><br/>代码块1<br/><br/>}<br/><br/>else{<br/><br/>代码块2<br/><br/>}&nbsp;&nbsp;<br/><br/><br/>这样，当条件满足时，就执行代码块1；如果条件不满足则执行代码块2。代码块和代码块2中如果只有一个条语句，那么，花括号（{ }）就可以省略；而如果有多条语句，则必须实用花括号将代码块包括在其中。在if...else语句种，其中的else部分是可选的，也就是说，我们可以使用如下的表达形式：<br/><br/>if(条件){<br/><br/>代码块<br/><br/>}<br/><br/>这样，当条件满足时，就执行代码块，如果条件不满足则什么也不做。<br/><br/>例如，如果我们需要对一个学生的成绩进行判定，如果大于等于60分，那么我们就认为该学生成绩合格了，反之则认为不合格，同时一并将状态记录到变量status种，相应的WMLScript语句如下所示：<br/><br/>if(score&gt;=60) status=&#34;pass&#34;;<br/><br/>else status=&#34;fail&#34;;<br/><br/>再如，我们可以通过对天气是否阳光普照（sunShines）的情况进行判断，来给变量myDay赋值，并累计好天气（goodDays）的天数。程序如下：<br/><br/>if(sunShines) {<br/>myDay=&#34;Good&#34;;<br/><br/>goodDays++;<br/><br/>}else<br/><br/>myDays=&#34;Oh well...&#34;;&nbsp;&nbsp;<br/><br/><br/>5.1.3 循环语句<br/><br/>使用循环语句可以反复执行某个代码块，直到循环结束条件满足后才停止执行。WML Script中有两种循环语句：for语句和while语句,同时还有两终于循环密切相关的操作语言：break语句和continue语句。<br/><br/>for语句<br/><br/>for语句可以创建一个带条件的循环，它还有3个可选的条件表达式，用于控制循环。这3个条件表达式放在一个括号里，并以分号（；）间隔。for语句的一般语法形式如下：<br/><br/>for（初始表达式；循环条件；递增表达式）{<br/><br/>代码块<br/><br/>}<br/><br/><br/>for语句的执行主要包括以下几个步骤:<br/><br/>（1）执行初始表达式。在一般情况下，初始表达式完成的功能是在循环中对循环计数器赋初值。所以在这种意义上，初始表达式也可以采用“var 变量声明列表；”的形式来定义。<br/><br/>（2）判断循环条件。如果循环条件为真（ture），则执行循环体中的语句，即至步骤（3）；否则，循环条件为假（false）或者invalid,就结束循环；<br/><br/>（3）执行循环代码。然后，在执行递增表达式。一般情况下，我们在递增表达式中对循环计数器进行处理，最后在返回步骤2执行。<br/><br/>例如，下面的for语句建立了一个循环。初始表达式为定义变量index并付初值0，循环条件为index＜100，递增表达式为每循环一次index增加1。当index增加到100时候，循环结束。程序如下： <br/><br/>for(var index=0;index＜100;index++){<br/><br/>count+=index;<br/><br/>myFunc(count);<br/><br/>};&nbsp;&nbsp;<br/><br/><br/>while 语句<br/><br/>while语句也可常见一个循环，它的一般语法表达式如下：<br/><br/>while（循环条件）{<br/><br/>代码块<br/><br/>}&nbsp;&nbsp;<br/><br/><br/>while语句的执行过程包括以下几个步骤：<br/><br/>(1)判断循环条件是否为真。如果循环条件为真，则执行循环；如果为假或为invalid，则跳出循环。<br/><br/>（2）执行循环中的代码块，然后返回步骤（1）<br/><br/>下面的程序就是使用while语句的简单例子：<br/><br/>var counter=0<br/><br/>var total=0<br/><br/>while(counter&lt;3){<br/><br/>counter++;<br/><br/>total+=c;<br/><br/>};&nbsp;&nbsp;<br/><br/><br/>其中建立的循环仅当变量counter的值小于3时执行，否则就结束循环。<br/><br/>显然，如果循环条件不能为假或为invalid,那么while循环就会无休止的反复执行下去。因此，我们在代码块中一定要有能够改变循环条件的变量，否则，就很有可能会陷入死循环而不能终止程序，下面就是一个死循环的例子：<br/><br/>var x=1;<br/><br/>var y=0;<br/><br/>while(x&lt;=1){<br/><br/>y=x+1;<br/><br/>}&nbsp;&nbsp;<br/><br/><br/>这个程序中，因为变量x的值在循环中不能发生变化，所以循环条件在判断的时候永远为真，所以成为了死循环。因此，对于while语句我们往往使用如下所示的语法形式：<br/><br/>初始表达式<br/><br/>while（循环条件）{<br/><br/>代码块<br/><br/>递增表达式<br/><br/>}<br/><br/>这种情况下，while语句的功能和for语句的功能就一样了，不过用while语句编写的程序可读性更强一些。所以我们也可以采用while语句来完成index增加到100的循环。<br/><br/>程序如下:<br/><br/>var index=0<br/><br/>while (index&lt;100){<br/><br/>counter+=index;<br/><br/>myFunc(count);<br/><br/>index++;<br/><br/>};&nbsp;&nbsp;<br/><br/><br/>break语句<br/><br/>为了更好的解决死循环问题，WML Script项大多数编成语言一样提供了break语句。break语句可以使程序执行跳出循环。不论是for语句还是while语句，只要在循环中使用了break语句，那么程序执行到break语句后就立即跳出当前循环，然后继续执行下去。<br/><br/>break语句的予发行时如下：<br/><br/>break;<br/><br/>例如，在下面的函数中我们使用了break语句，它是当index=3时跳出循环。如果不是用该语句，函数中的while循环直到index=6时才可以结束。程序如下：<br/><br/>funcition testBreak(x){<br/><br/>var index=0;<br/><br/>while(index&lt;6){<br/><br/>if(index==3)break;<br/><br/>index++<br/><br/>}；<br/><br/>retrun index*x;<br/><br/>；&nbsp;&nbsp;<br/><br/><br/>continue语句<br/><br/>continue语句的功能和break语句的功能看起来有些类似，但实际上却不一样。循环执行时遇到break语句通常是跳出当前循环，但循环执行到continue语句并不跳出当前循环，而是不执行循环中在continue语句后面的代码块，直接结束循环的本轮运行，然后马上开始下一轮循环的运行。<br/><br/>在while语句的循环中，遇到continue语句后，程序会直接判断循环条件从而开始下一轮循环。在for语句的循环中，遇到continue语句后程序会直接执行递增表达式，然后判断循环条件从而开始下一轮循环。<br/><br/>例如，我们想利用for循环求1到10之间偶数的和，其WML Script语句如下：<br/><br/>var sum=0;<br/><br/>for (var j=1;j&lt;=10;j++){<br/><br/>if(j%2!=0)<br/><br/>continue;<br/><br/>sun+j;<br/><br/>};&nbsp;&nbsp;<br/><br/><br/>在这个例子中，在j%2!=0的情况下，也就是j为奇数的情况下，程序执行continue语句，这时，并没有如同break语句一样跳出循环的运行，而是不执行循环中后面的语句而直接执行递增表达式开始下一轮循环的执行，这样，就可以不将其数j的之类即如总和中。<br/><br/>再如，我们想利用while循环求0到4之间出3以外几个数的和，则可以使用continue语句进行控制。程序如下；<br/><br/>var index=0；<br/><br/>var count=0；<br/><br/>while (index&lt;5){<br/><br/>index++;<br/><br/>if(index==3)<br/><br/>continue;<br/><br/>cont+=index;<br/><br/>};&nbsp;&nbsp;<br/><br/><br/>这以程序中，当index等于3时，“index==3”为真,所以执行continue语句，不再把此时index的值加大count中，而是开始下一轮的循环。]]></description>
		</item>
		
			<item>
			<link>http://www.tkpao.com/article.asp?id=95</link>
			<title><![CDATA[第四章 WML Script语法基础]]></title>
			<author>tkpao@163.com(tkpao)</author>
			<category><![CDATA[程序语言]]></category>
			<pubDate>Fri,14 Sep 2007 17:21:13 +0800</pubDate>
			<guid>http://www.tkpao.com/default.asp?id=95</guid>
		<description><![CDATA[WML Script是属于无限应用协议WAP应用层的一部分，使用它可以向WML卡片组和卡片中添加客户端的处理逻辑，目前最新的版本是1.1版。WML Script1.1是在欧洲计算机制造商协议会制定的ECMAScript脚本语言的基础上，经过修改和优化而指定的。它能够更好的支持诸如移动电话类的乍带宽通信设备，在WML编程中使用WML Script可以有效的增强客户端应用的灵活性，而且，我们也可以把WML Script作为一个工具使用，开发出功能强大的WAP网络应用和无限网页。本章我们将详细讲解WML Script1.1编程的基础预法制时，如基本规则、变量预数据类型、操作赋予表达式等。为了叙述上的简便，以后我们将“WML Script1.1”简称“WMLScript ”。<br/><br/>4.1 WML 程序中调用WML Script函数<br/><br/>经过前两章的学习，熟悉C语言的读者可能会认识到，WML 的函数功能、逻辑运算功能等都是十分有限的。而WMLScript提供了丰富的函数功能，我们在WAP应用开发可以使用WMLScript来增强WML编程。因此，WMLScript成为扩展WML编程能力的主要开发工具。<br/><br/>4.2 WMLScript的主要优点及其字节码解释器<br/><br/>WMLScript具有一套定义好的字节码和一个解释器参考结构。无线网络传输中WMLScript的数据均以二进制格式进行传输，所以，用户可以使用乍带宽通信信道，从而能够保持客户端手机只需要最小限度的内存。ECMAScript修改后得到的WMLScript能够更快、更小、更容易的编译程序为字节码形式。所有这些特点，是WMLScript具备了WML所不能具备的很多优点和功能。<br/><br/>4.2.1 使用WMLScript的主要优点<br/><br/>WMLScript的设计宗旨是为WMLScript系统提供一般的脚本处理能力，使用WMLScript我们可以进一步补充基于XML的WML语言的编程功能，开发针对乍带宽的网络应用及内容，如文本、图像、选择列表等，我们可以使用简单的格式编写出更灵活和更具可读性的用户界面。WMLScript具备的WML所不能具备的优点和功能，主要包括如下几个方面： （1）检查用户输入的合法性：<br/><br/>（2）扩展用户浏览器的功能，比如允许程序员开发手机的电话呼叫、发送短信息、存储电话号码、管理电话簿或SIM卡等；<br/><br/>（3）生成用户端的确认、提示、警告信息或操作对话框，并使之快速显示在浏览器上；<br/><br/>（4）在用户浏览器的更改后，能够对浏览器端的软件和参数进行扩展与配置；<br/><br/>（5）最大程度克服客户端的乍带宽通信连接限制，并提供丰富的程序功能；<br/><br/>（6）补充WML并使之实现针对微型移动终端设备的多种服务，如支持高级用户界面、增加客户端智能型、提供用户浏览器外围功能的访问能力，以及在服务器与客户端浏览传输数据是减少带宽占用等。<br/><br/>4.2.2 WMLScript的字节码解释器<br/><br/>在WMLScript的字节码解释器解释之前，WMLScript语言编写的文本格式的程序将被首先编译为二进制格式的代码。编译时，编译器通常先将WMLScript程序分成若干个编辑单位，每个单位的程序都包含一定数量的语句行和WMLScript函数，然后，WMLScript的编译器将按照这些编译单位，逐一将WMLScript程序作为输入内容，而把对应的字节码作为输出内容。当用户通过WAP手机调用WMLScript程序时，编译器的编码功能即被激活、执行。<br/><br/>4.3 WMLScript基本规则<br/><br/>WMLScript在许多基本规则方面沿用了WML的做法。不过，由于WMLScript是以C语言为蓝本而指定的，所以它的语法特征和C语言非常相像。如果大家对C语言比较熟悉，那么学习和掌握这部分内容应当是比较容易的。<br/><br/>4.3.1 WMLScript与URL<br/><br/>与WML一样，WMLScript也沿用了WWW和HTML访问资源的URL、HTTP等规范，并扩大了URL使用的范围。在WMLScript中，不仅超链接、文件路径即文件名可以作为URL处理，外部函数、访问控制信息等也可以作为URL处理。<br/><br/>为此，WMLScript采用了WML的变通方法，即改进HTML命名资源为值的方式，采用程序段锚点（Fragment Anchor）的形式来处理资源定位。程序段锚点根据文档URL规则进行定义，并按照程序段标识符前加井字号（#)的方式书写。使用程序段锚点，WMLScript程序可以在WMLScript编译单位内可任意指定的函数，并可在调用该函数的同时传递所需的参数。<br/><br/>4.3.2 词法结构<br/><br/>WMLScript编程中的词法结构并不复杂，我们下面就从大小写敏感、空格、换行、注释即保留字等方面讲解相关的具体规则。<br/><br/>（1）内容类型。WMLScript的内容类型主要针对文件形式和二进制形式两种情况，类型结构可以在服务器端进行指定，具体形式为：<br/><br/>文本形式：text/vnd.wap.wmlscript;<br/><br/>二进制形式：application/vnd.wap.wmlscriptc。<br/><br/>具体指定方法我们在第4章已经介绍过，这里不再重述。<br/><br/>（2）大小写敏感。WMLScript1.1是一种大小写敏感的脚本语言。它所设计的各种关键字、变量和函数名都必须合理的使用大小写。<br/><br/>（3）空格和换行。一般情况下，WMLScript程序值形式将忽略所有的空格、制表符合换行符等。但如果把这些特殊字符通过代码进行表述，或者作为字符串进行处理时，WMLScript将不再忽略它们。了如，字符串&#34;Oct 28,2001&#34;中含有空格，该空格在执行时就不会被忽略，它与不含空格的字符串&#34;Oct28,2001&#34;是不同的。<br/><br/>（4）注释。与WML编程一样，在WMLScript脚本程序中也可以加入注释内容。注释内容不被程序执行，且注释不能嵌套。WMLScript的注释方法有两种：<br/><br/>其一，行注释。即使用双斜行号（//）引导以一行内容,这一行内容全部作为注释内容。如：<br/><br/>//这是以行注释，由双斜杠号开始到结束都是注释。<br/><br/>其二，块选择。即以符号“/*”开始，而以符号“/*”结束的期间所有内容都是注释内容。如：<br/><br/>/*这就是块注释，加在中间的内容就是注释内容*/<br/><br/>（5）数据类型与直接编码。WMLScript允许将4种类型的数据直接编码并可嵌套并可嵌如在程序之中。直接编码的4中数据类型为：整数、浮点数、字符串和布尔值。另外，“无效性”值也可直接编码” 1. 整数。当以十进制、十六进制或八进制方式使用整数时，可对这类整数进行直接编码。<br/><br/>编程序时，十进制的数字均不以0开头，只包含0~9的数值串；十六进制的数据以OX或者Ox开头，只包含0~9、a~f或者A~F的字符串；八进制的数均以0开头，只包含0~7的数字串。<br/><br/>2.浮点数。浮点数通常定义为含有小数点的数字，可以包含小数和指数部分。浮点数的形式较多，可以使十进制的整数或浮点数，可以是分数，也可以是指数；但一个浮点数必须至少有一个数。<br/><br/>指数是以e或E开头，后面跟着一个整数。指数是以10为底幂。例如：e0时10的零次幂，例如：e0时10的另次幂，e-2时10的负2次幂集等于0.01。指数可以带符号，正好（+）或者减号（-），它们分别代表是正指数和负指数。<br/><br/>3.字符串。字符串是指定义在成对的双引号（&#34;&#34;）或单引号（‘ ’）之间的内容。<br/><br/>由于WMLScript只允许使用成对的双引号或但引号来定义字符串，所以程序中使用一个单引号或一个双引号时就会出现编译错误。<br/><br/>考虑到有些特殊字符不能在字符串中直接显现出来，所以WMLScript提供了转译序列来表示这些特殊字符。<br/><br/>4.布尔型。它只是ture和false两个数值，用于表示WMLScript中的“真值”或“假值”。布尔型数据可参与异、或等运算，具体规则我们后面介绍。<br/><br/>5.无效型。也称为“空类型”，它是WMLScript支持的一个表示无效值的量，以invalid表示。该两与C语言中的NULL类似。<br/><br/>4.保留字。WMLScript中定义有一个保留字集合，含有一些表示特殊意义的单词这些次不能另外定义，也不能最为其他标识符。WMLScript中的保留字如下：<br/><br/>acces http agent if break isvalid continue meta header<br/><br/>div name div= path domain return else typeof while<br/><br/>equiv url extern use for user function var<br/><br/>另外，WMLScript还为将来的版本预留了一些保留字，主要有：<br/><br/>case finally catch import class private const public debugger<br/><br/>sizeof default struct do super enum switch export throw<br/><br/>extends try<br/><br/>WMLScript还有一些没有使用的保留字：<br/><br/>del&#101;te null in this lib void new with<br/><br/>7.标识符。WMLScript的标识符可以指定或命名3种元素：变量、函数和标注。标识符不能以数字开头，但能一段下划线（-）开头，而且，标识符不能是WMLScript的保留字。例如，timeOfDay、speed 、quality、HOME_ADDRESS、_myName、__、varO等都是合法的标识符；而以数字或非短下划线的特殊符号开头的字串，以及保留字等都属于不合法的标志赋，如while、for、if、my~name、$sys、123、3piecs、take.this等。<br/><br/>由于WMLScript是严格区分大小写的，所以字母相同但大小写不同的标识符不是同一个标识，例如，Work和work就是不同的标识符。<br/><br/>8.名称空间。WMLScript提供了比较自由的名称空间，同一标识符可以同时用作不同的目的。例如，作为某一函数名称的标识符，还可以同时用作变量名、函数参数、程序标注等，使用时他们的属性或值等并不相互影响。在下面的简单的例程中，myTest这一标识符即用作了函数名，又用作了变量名、函数参数名、函数参数名、常量名。显然，WMLScript的这一特定为我们编写程序提供了很大的方便。<br/><br/>4.3.3 WMLScript程序的基本书写规则<br/><br/>WMLScript程序的基本书本写规则：<br/><br/>1.程序由若干语句或函数组成，函数有由若干语句组成；<br/><br/>2.每个完整的语句后面必须加上分号（；），语句关键词语操作数之间必须有空间；分号（；）是WMLScript程序的组成部分；<br/><br/>3.函数体之间必须使用成对的花括号（{ }）括起来，而且函数结束时在右花括号（}）的后面还要加上分号（；）；函数说明部分，如函数名、函数类型、函数参数等要放在花括号（{｝）的前面；<br/><br/>　　4.有些语句可能也需要实用花括号（{ }）办含内容，这类语句通常也可以放在函数中，所以花括号（{ }）是可以嵌套的。<br/><br/>当然，不同的语句、参数、变量等元素在声明和书写时可能还有一些更细的要求，具体我们后面介绍这些元素是再专门给出，<br/><br/>4.4 变量与数据类型<br/><br/>变量即数据类型是所有编程语言的概念和组成部分，WMLScript对此也不例外。它对其变量使用方法和数据类型定义方法给出了详细的规定。变量通常与某数据之相对应，我们可以给变量赋值，并可在程序执行中改变变量的值。下面我们讲解WMLScript有关变量与数据类型的详细规定。<br/><br/>4.4.1变量及其声明<br/><br/>变量是在WMLScript脚本程序中具有值的符号名，或说标识符。使用变量可以存储和改变程序中需要的数据。与C语言不同的是，WMLScript仅支持函数内定义的变量或用于传送数的参变量。<br/><br/>变量使用前必须进行声明，也就是定义变量，即指定变量的名字。声明变量的关键字是var，它的后面根上作为变量名的合法的标识符，并于最后加上分号（；），即完成一个量的声明。声明变量是可以使用var一次声明多个变量名，相邻变量之间使用都号（，）间隔。<br/><br/>一般情况下，我们在给变量命名的时候，都希望能够使用有意义的变量名。例如，当需要使用一个变量表示一本书的价格时，虽然将变量命名为j或book都没有什么错误，但若能命名为bookPrice则会是的WMLScript脚本程序具有更好的可读性，可以方便编程人员进行脚本的编写和调试工作。而且，由于WMLScript在给变量命名是不能使用保留字，所以考虑到避免由于一时的疏忽时变量名欲保留字发生冲突，我们建议使用多个单词组合在以其作为一个变量的名称，这是一个比较好的解决办法。例如，如果要定义一个变量来存储的、一本书的价格，那我们可以不妨使用bookPrice或者book_price作为变量的名称，这样，一方面可以时变量显得更加清晰，另一方面也可以避免变量与保留字的冲突问题。<br/><br/>以上只是我们对于变量命名的建议，并不是强制性的要求，用户完全可以不按照我们的要求来做，只要遵守WMLScript对于标识符命名的要求就可以了，但养成良好的编程风格不论是对编程人员还是对脚本编写人员来说，都是十分有意义的。<br/><br/>4.4.2 变量的作用域与生命期<br/><br/>一个变量的作用域是指在程序中能够引用这个变量的一段代码。由于WMLScript仅支持函数内定义的变量，所以WMLScript变量的作用与通常就是定义它们的那个函数。在该函数之外，变量不再发挥直接作用。<br/><br/>变量的生命起始值从变量声明开始到失效为止。变量的生命期也被称为变量的持久期、存活期。一个变量在定义它的整个函数内都是有效的，函数内的任何语句块都不会削减变量的生命期或限制变量的作用域。<br/><br/>如果一个变量未经生命就直接使用，或声明过后再次声明，都会破坏变量的生命期。前一种情况会导致变量没有开始声明期，即没有“生命”；而后一种情况则导致变量声明期没有结束以前就重新赋予声明期，即让它多次“降生”。这都会导致变量无效使用。下面函数中的变量使用就说明了这一问题：<br/><br/>function foo(){<br/><br/>x=1;//错误：变量使用前没有声明，改变量还没有“声明”。<br/><br/>var x,y,z;<br/><br/>y=x+3;<br/><br/>var zd =invalid<br/><br/>if(x){<br/><br/>var(y);//错误：这一变量已经声明，这里是重复声明。<br/><br/>}；<br/><br/>}；<br/><br/>4.4.3 变量的使用<br/><br/>WMLScript的变量只能在定义它的函数内使用。使用时需要声明变量，声明变量是可以同时对变量赋值，甚至对变量进行运算。例如，下面的简单函数就说明了变量的这种灵活的使用方法：<br/><br/>function ourAge(){<br/><br/>var myAge=38;<br/><br/>var yourAge=26;<br/><br/>var ourAge=myAge+yourAge;<br/><br/>return ourAge;<br/><br/>};<br/><br/>使用变量时可通过调用变量名字的形式来实现。上面例子中的“var ourAge=myAge+yourAge;”一句，通过调用变量名，变量ourAge对变量myAge和变量yourAge实行了求和操作。<br/><br/>4.4.4 变量类型与数据类型<br/><br/>WMLScript是一种“弱类型”的语言，及其变量没有确定的类型。WMLScript变量的类型有改变量所赋数据的类型决定，并根据数据类型的改变而改变。WMLScript只支持内部定义的数据，因此我们编写程序是无需指定WMLScript变量的类型，WMLScript减根据变量而赋数据的类型自动进行匹配。由于WMLScript的数据类型共有整数、浮点数、字符串、布尔型和“无效型”五种类型，所以WMLScript变量的类型所能匹配的也就是这五种类型。<br/><br/>4.4.5 变量值域<br/><br/>由于变量类型尤其所赋数据的类型决定，所以变量值与域其所赋数据的可取范围等价的。下面的我们就给出整数、浮点数、字符串和布尔型的区值范围，以参照确定应类型变量的值域。 1.整数的范围。WMLScript支持的整数是32位的，也就是说整数的区值范围是从2147483648到+2147483647。我们可以在程序运行期是用Lang函数来取得这些值，如：<br/><br/>Lang.maxInt(); //获取最大的整数<br/><br/>Lang.maxInt(); //获取最小的整数<br/><br/>2.浮点数的范围。它是指WMLScript浮点数的精度所能表示的最小和最大数值WMLScript支持32为的单精度浮点数，其最大至时3.40282347E+38，最小的非零的数是1.17549435E-38或更小（按照正常的精度）。<br/><br/>我们可以使用浮点Float函数库在程序运行其取得这些数值：<br/><br/>Float.maxFloa(); //获得WMLScript所支持的最大浮点值<br/><br/>Float.maxFloa(); //获得WMLScript所支持的最小浮点值<br/>对于运行期出现的一些特殊的浮点数，WMLscript将按照下述规则处理：<br/><br/>其一，如果操作结果是一个不能被单精度浮点数所能表示的数值，那么该结果将被认为是invalid，即无效值；<br/><br/>其二，如果操作结果发生下溢出，那么结果将作为0.0处理：<br/><br/>其三，负的零和正的零是完全相等的。<br/><br/>3.字符串的范围。任何由于字母、数字或特殊字符组成的符号串都是WMLScript中定义的有关字符串的操作或String库中的函数控制字符串。<br/><br/>4.布尔型数据的范围。布尔型数据只有ture和flase两个取值，这也是布尔型变量的两种数值。我们可以使用布尔型数据取初始化或指定某一变量的数值，或将布尔值变量写入一个需要布尔值作为参数的语句。布尔值可以是数值运算的结果，也可以是逻辑运算的结果。<br/><br/>下面就是定义布尔型变量并赋初值的例句：<br/><br/>var truth=truth;<br/><br/>var lie=!truth;<br/><br/><br/>4.5 操作符与表达式<br/><br/>在WMLScript中，表达式可以把变量、常量与操作符结合起来，经过运算能够产生一定的运算结果。表达式运算后产生的结果可以是整数型、浮点数型、字符串型或布尔型的数据。其实，对于表达式我们并不陌生，例如，1+2就是一个简单的表达式。<br/><br/>WMLScript的表达式主要有两种类型。一种是赋值表达式，即把数据赋给变量的一种表达式，例如，myBook=3，在这个表达式中，将3 赋给变量myBook，同时，这个表达式本身也有一个运算结果，那就是3。另外一种是运算表达式，它是指产生一个运算结果而不进行赋值操作的表达式，例如1+2就是一个运算表达式，在这个表达式运算产生的结果是3， 但这个表达式并没有把运算结果赋给变量。<br/><br/>在表达式运算的过程中，表达式中操作一个或这两个数据产生运算的符号做操作符，被操作符操作的数据称作操作数，在WMLScript中我们会使用到各种操作符，下面就对操作符及有关的表达式进行详细讲解。<br/><br/>4.5.1 赋值操作符<br/><br/>赋值操作符用于赋值操作，即给变量指定所需的数值，它能把有操作数的运算结果给做操作数，最简单的赋值操作符就是“=”，例如x=2，就是将2赋值给变量x。在如以下几行语句都是赋值操作：<br/><br/>var=&#34;abc&#34;;<br/><br/>var b=a;<br/><br/>b=&#34;def&#34;;<br/><br/>赋值操作符不需要指定使用对象，也不会改变赋值操作符右边变量的数值。WMLScript的赋值操作符主要包括以下几种：<br/><br/>1.=。用于赋值操作，将有操作数赋给左操作。<br/><br/>2 +=。将有操作数与左操作数进行相见运算，然后把运算结果赋值给左操作数。例如，假设x=3，那么x+=2运算后的结果为x=5。<br/><br/>+=是比较特别的操作符，因为它可以将两个字符串相连，所以+=操作符也可以对字符串进行操作，然后将连接后的字符串赋给左操作数。例如，假设x=&#34;Happy&#34;,那么x+=&#34;new Year&#34;运算后结果是x=&#34;Happy New Year&#34;。<br/><br/>3.-=。将左操作数简取有操作数，然后把运算结果赋值给左操作数。例如，假设x=3那么x-=运算后的结果为x=1。<br/><br/>4*=。将左操作属于有操作符进行相乘运算，然后把运算结果赋值给左操作数。例如，假设x=6，那么x*=2运算后的结果为x=6。<br/><br/>5/=。将右操作属于右操作符进行相乘运算，然后把运算结果赋值给左操作数。例如，假设x=6，那么x*=2运算后的结果为x=6。<br/><br/>6div=。拥有操作数处理左操作数，然后把运算结果中的整数部分赋值给左操作数，例如x=7，那么xdiv=2运算后的结果为x=3。<br/><br/>7%=。功能是求余数并赋值，用右操作数除以做操作数，最后把运算得到的余数值给操作数。例如，假设x=7，那么x%=3运算后的结果为x=1。<br/><br/>8&lt;&lt;=。功能是带符号左位移并赋值，即将左操作和右操作数进行左位移操作，在将结果赋给左操作数。<br/><br/>9&gt;&gt;=。可将左操作和右操作进行右操作进行补零右位移操作，在将结果赋给左操作数。<br/><br/>4.5.2 数学运算操作符<br/><br/>数学运算操作符可以对数值类型的操作数进行运算，然后返回一个数值类型的运算结果。<br/><br/>1+。这是加运算操作等，它对应着数学运算中的加法运算，例如表达式1+2的运算结果为3。<br/><br/>加操作符还可以对字符串类型的操作数进行运算，然后将两个字符串相连起来作为运算<br/><br/>2- 。即检操作符，对应着速学运算中的减法运算，例如表达式2-1的运算结果为1。<br/><br/>同时，“-”还是一个取负操作符，当它作为取负操作符的是一个操作数，取负操作符的功能使返回操作数的相反数。<br/><br/>3*。这是乘操作符，它对应着数学运算中的乘法运算，例如表达式2*3的运算结果为6。<br/><br/>4/。即除操作符，对应着数学运算中的除法运算，但WMLScript中的除法运算有些特别，在WMLScript中，除法运算后的结果是一个浮点数，而不想C语言或者Java语言那样在整数进行除法运算式井运算结果强行转化整数。在WMLScript中，1/2=0.5，而在Jave中，1/2=0。<br/><br/>5div。这是整除操作符，对应着数学运算中的整数运算，运算后的结果一个整数，这一点与C语言或者Java语言中的情况是一样的，可以在整数进行除法运算式将运算结果强行转换整数。<br/><br/>6%。即取模操作符，它对应着数学运算中的取莫运算，也就是将两个操作相除，返回相除后的余数。<br/><br/>取模操作符主要用于判断一个数字是否能被另一个数字整除。<br/><br/>((the Year%3==0))&amp;&amp;(the Year%100!=0))||(the Year%400==0)<br/><br/>其中&amp;&amp;代表的是逻辑运算中的与运算，||代表的是逻辑运算中的或运算，关于逻辑运算，我们后面会详细介绍。<br/><br/>7++。这是递增操作符，它只有一个操作数，操作可以在操作符的左边，也可以在操作符的右边，它所完成的运算操作是将操作数加1。假设操作数名称为j，值为2，那么++j加1，然后返回j的值3；而j++则实现返回j的值2,然后将j加1。<br/><br/>在循环中，我们常常会用到递增操作符的作用正好相反。递减操作完成的运算操作是经操作数减1。例如，假设操作数名称为j,值为2，那么--j先将j减1，然后返回的值1；而j--是先返回j的值2，然后将j减1。<br/><br/>4.5.3 位操作符<br/><br/>为操作符在运算实现将操作转化32位的二进制数，然后对每个操作数分别按位进行运算，运算后在将二进制的结果按照标准WMLScript数值类型返回运算结束。<br/><br/>1&amp;。这是为与操作符，它可以对两个操作数按位进行于操作，其运算规则是：<br/><br/>0&amp;0=0,0&amp;1=0,1&amp;0=0,1&amp;1=1<br/><br/>2|。这是位或操作符，它可以对两个操作数按位进行或操作，运算规则是：<br/><br/>0|0=0 ，0|1=1，1|0=1，1|1=1<br/><br/>3^。这是唯一或操作符，它可以对两个操作按位进行异或操作，其运算规则是：0^0=0,0^1=1,1^0=1,1^1=0<br/><br/>4~。这是位非操作符，它只有一个操作数，可对操作数按位进行非操作，运算规则是：~0=1，~=0<br/><br/>5&lt;&lt;。这是左移操作，它可以对左操作数进行向左一位的操作，由操作数给定了要移动的位数，在移动过程中，左操作数的最低为补充0。<br/><br/>6&gt;&gt;。这是右移操作符，它可以对左操作数进行向右移位的操作，由操作数给定要移动的位数，在移位的过程中，丢弃向右移的位。<br/><br/>7&gt;&gt;&gt;。这是填0右移操作符，它与右移操作符相似。当对证正数进行操作时，它们的效果完全相同；不同之处在于，当进行负整数右移操作时，因为负责转化为二进制后，最高为1，所以在进行右移操作后，最高位仍然补充1，而在进行填0右移操作时，最高为补充的是0，因此，这是负数将转化为正数。<br/><br/>4.5.4 逻辑操作符<br/><br/>逻辑操作符可以将布尔类型的表达式组合起来，完成逻辑运算操作，然后返回逻辑运算的结果——真或假，这样就可以完成比较复杂的逻辑判断工作。逻辑操作共有3种；<br/><br/>1&amp;&amp;。即逻辑与操作符它只有在两个操作数都为ture的时候，返回结果为ture,在其他情况下，返回结果为false或者invalid。<br/><br/>2||。这是或操作符，它在两个操作数至少有一个为ture的时候，返回结果为ture,在其他情况下，返回结果为false或者invalid。<br/><br/>3!。即非操作符，它只有一个操作数。当操作数为ture时，返回结果为flase；返回结果为ture.<br/><br/>4.5.5 比较操作符<br/><br/>比较操作符可以把操作数进行比较，然后返回一个逻辑值，表明这个比较操作的结果是否为真。比较操作的操作数可以是数值类型或者字符串类型的数据。比较操作符也常被称为关系运算符。<br/><br/>WMLScript支持的比较操作符共有6种，下面被介绍一下。<br/><br/>1. ==。即等于操作符，它可以比较两个操作数是否相等。如果两个操作数相等，则返回ture，否则返回false<br/><br/>2. ！=。即不等操作符。它可以比较两个操作数是否相等。如果两个操作数相等，则返回false,否则返回ture。<br/><br/>3. &gt;。即大于操作等。其运算规则时，如果左操作数大于右操作数，则返回ture。<br/>]]></description>
		</item>
		
			<item>
			<link>http://www.tkpao.com/article.asp?id=94</link>
			<title><![CDATA[第三章 WML编程]]></title>
			<author>tkpao@163.com(tkpao)</author>
			<category><![CDATA[程序语言]]></category>
			<pubDate>Fri,14 Sep 2007 17:20:28 +0800</pubDate>
			<guid>http://www.tkpao.com/default.asp?id=94</guid>
		<description><![CDATA[元素和标签是WML的主要语法，它们决定了WML编程的基本原则。本章我们将从WML的元素、标签、属性等方面详细讲解WML的编程方法。学习本章知识之前，读者应当了解WML元素与标签的区别。WML的元素通常有一个首标签、内容、其它元素及一个尾标签组成。也就说，单独的标签是一个元素，成对出现的标签与其包含的内容也构成一个元素。由于元素牵涉及标签，标签又涉及属性。<br/><br/>3.1 卡片、卡片组及其属性<br/><br/>我们前面介绍了WML的卡片与卡片组，主要从概念和相互关系的角度进行了分析。我们这里则从卡片、卡片组的组成、相关元素、标签技术性等编程角度进行分析和讲解。 3.1.1 共有属性<br/><br/>WML元素的共有属性主要有3个：id、class和xml:lang属性。<br/><br/>WML的所有元素都有两个核心属性，即标示（id）和类（class）属性。它们主要用于服务器方的信息传输。其中，id属性用于定义元素在卡片组中的唯一标示，即它的名称；class属性用于给当前元素定义一个或更多的类（class）。与卡片组一样，类（class）也是有名字的，而且多个元素可以使用一个类（class）名。具有相同类名的单一卡片组中的所有元素均可被看作相同类的一个部分。类名是区分大小写的。如果在class属性列表中，一个元素多个唯一的类名，那么该元素可以看作这些类中的一部分。具有同一属性的多个类名必须用两个以上的空格间隔，WML程序执行时将忽视其中多余的类名及其属性。<br/><br/>另外，在WML程序，所有包含文本的元素均具有“xml:lang”属性。该属性用于指定当前元素及其属性所用的描述语言，如英国英语、美国英语、法语、德语等，并可以为用户浏览器选择显示文本的语言提供依据。<br/><br/>3.1.2 WML程序的文件头<br/><br/>合法的WML卡片组均属合法的WML文件，因此它必须包含WML的声明及文件类型的声明。典型的WML程序的文件头包括我们前面多次提到的以下两行程序：<br/><br/>&lt;?xml version=&#34;1.0&#34;?&gt;<br/>&lt;!DOCTYPE wml PUBLIC &#34;-//wapforun//DTD WML 1.1//EN&#34; &#34;<a href="http://www.wapforum.org/DTD/wml_1.1.xml" target="_blank" rel="external">http://www.wapforum.org/DTD/wml_1.1.xml</a>&#34;&gt;<br/><br/>编写WML程序时，我们必须写入这两行程序，并放在程序的开始处。其中&#34;-//wapforun//DTD WML 1.1//EN&#34;是标准通用标记语言SGML的公共标示；&#34;<a href="http://www.wapforum.org/DTD/wml_1.1.xml" target="_blank" rel="external">http://www.wapforum.org/DTD/wml_1.1.xml</a>&#34;是WML程序文档类型的标示。文档类型标示也可以是&#34;text/vnd.wap.wml&#34;或“application/vnd.wap.wmlc”，其中前者制定WML的原文类型，后者制定WML程序编译后代码类型。<br/><br/>3.1.3 WML元素<br/><br/>WML的WML元素用于定义一个卡片组，并通过&lt;wml&gt;与&lt;/wml&gt;标签包含和封装该卡片组中的所有卡片及信息。它的语法格式如下：<br/><br/>&lt;wml xml:lang=&#34;lang&#34;&gt;<br/>内容(content)<br/>&lt;/wml&gt;<br/><br/>其中xml:lang=&#34;lang&#34;用于指定文档所用语言（前面已有介绍），语言&#34;lang&#34;的值属于NMTOKEN型数据。<br/><br/>wml元素中包含的内容（content）中除了文本、图像等信息之外，还可以包含head、template及card元素。其中head、template元素如果包含的话则只可包含一次，而card元素必须至少包含一次。有关这些元素的用法我们后面介绍。<br/><br/>3.1.4 template元素<br/><br/>template元素用于为当前卡片组中的所有卡片定义一个模板，同一规定卡片的某些参数。模版中的事件处理功能则可将这些参数自动应用于同一卡片组中的所有卡片。不过，我们也可以是其中某个或某几个卡片不采用模板规定的形式，方法是在该卡片中定义一个同名的事件来替代模板块中相应的事件。template元素通过&lt;template&gt;和&lt;/template&gt;标签含所需内容（content）而实现模板功能的，其语法格式如下：<br/><br/>&lt;template oneterforward=&#34;href&#34; onenterbackwared=&#34;href&#34; ontimer=&#34;href&#34;&gt;<br/>内容(content)<br/>&lt;/template&gt;<br/><br/>template元素包含的内容中，除了卡片的一般参数外，还可以包含任意多次的do元素和onevent元素。template元素属性的功能及用法说明如下：<br/><br/>1）oneterforward。当用户在浏览器中进入当前卡片时，该属性将指定超链（href）的URL地址，浏览器将据此打开URL指定的卡片或事件。<br/><br/>2）oneterbackward。与上一属性类似，该属性也可以指定其相应卡片或事件的URL地址。如果用户浏览时执行prev任务，那么浏览器就会定位到该属性所指定超链（href）的URL地址，并打开URL指定的卡片或事件。<br/><br/>3）ontimer。当指定时间timer过期的时候，用户浏览器就根据ontimer属性指定的URL打开相应的卡片。<br/><br/>3.1.5 card元素<br/><br/>WML的卡片组是由一个或多个卡片（card）构成的，每个卡片都包含有一套用户和浏览器交互操作的配置及模式。用户对交互操作的需求是多样性的，所以卡片定义时也必须是多样性的。为此，WML提供了card元素，通过&lt;card&gt;和&lt;/card&gt;标签定义一个卡片的各种属性、包含内容。它的语法格式如下：<br/><br/>&lt;card id=&#34;name&#34; title=&#34;label&#34; newcontext=&#34;boolean&#34; o&#114;dered=&#34;true&#34; onenterforward=&#34;href&#34; onenterbackward=&#34;href&#34; ontimer=&#34;href&#34;&gt;<br/>内容（content）<br/>&lt;/card&gt;<br/><br/>card元素中包含的内容（content）中除了文本、图像信息之外，还可以包含onevent、timer、do和p元素。其中，timer元素只可使用一次，其余3种可使用多次。而且，如果card元素包含onevent元素或timer元素的话，那么onevent元素必须放在最前面，timer元素放在onevent元素的后面，随后才可以使用do或p元素。这个优先顺序是不能乱的。<br/><br/>card元素属性的功能及用法介绍如下：<br/><br/>1）id。用于指定card的名字。改名字是程序导航定位的依据，可以用作程序段锚点，比如&lt;go href=&#34;#cardname&#34;/&gt;。其中的cardname便是由id指定的卡片名。<br/><br/>2）title。用于为卡片制订一个简单的标题或说明信息。<br/><br/>3）newcontext。用于指定WAP手机浏览当用户重新进入的时候是否需要初始化卡片中所有的内容。它有true和false两种选择，当指定newcontext=&#34;ture&#34;时，卡片的所有内容在用户重新进入时将进行初始化，也不清除历史纪录；否则，指定newcontext=&#34;false&#34;时，将不进行初始化设置，也不清除历史纪录。默认状态下的设置值为false。另外，newcontext仅当作为go任务的一部分时才可被执行。<br/><br/>4）ordered。用于向用户手机的浏览器指明卡片内容的组织形式，以便让浏览器根据自身特点及卡片内容组织及时安排显示布局。它有两种布尔值得设置，即true和false。<br/><br/>当ordered=&#34;true&#34;时，浏览器将按照线性顺序显示卡片各区域的内容。这个线性顺序通常是大多数用户所习惯采用的信息浏览顺序，比如发送E-mail信息时，我们依次需要E-mail首件人地址、主题及E-mail内容，这个逻辑顺序就数线性顺序。<br/><br/>当ordered=&#34;flase&#34;时，浏览器将根据用户选择或指定的顺序来显示内容。这种情况主要是用于显示用户选项、无序组建或用户输入的简单数据纪录等。<br/><br/>5）onenterforward。onenterforward事件仅当用户使用go任务或类似于go的任务位和浏览卡片时才可发生，即如果用户执行go任务，则浏览器就会定位&lt;go&gt;标签中指定超链(href)的URL指定的卡片。card元素中的onenterforward属性是onevent元素的一个简单格式，用于直接指定onenterforward事件的URL地址。<br/><br/>6）onenterbackward。该属性可以指定其响应时间的URL地址。如果用户浏览时执行prev任务，那么浏览器就会定位到该属性所制定超链 （href）的URL地址，并打开URL指定的卡片。onenterbackward属性也属于onevent元素的一个简单格式。<br/><br/>7）ontimer。当指定时间timer过期的时候，用户浏览器就根据ontimer属性指定的URL打开相应的卡片。它也属于onevent元素的一个简单格式。<br/><br/>3.1.7 access元素<br/><br/>access元素是由一个单独的的标签&lt;access&gt;标签实现的元素。用于定义WML整个卡片组的操作权限，即访问控制参数。access元素必须在head元素内和其它的meta信息一起声明，而且每个卡片组只能有一个access元素。其语法格式如下：<br/><br/>&lt;head&gt;<br/>&lt;access domain=&#34;domain&#34; path=&#34;path&#34;&gt;<br/>...<br/>&lt;/head&gt;<br/><br/>access元素属性的功能及用法如下：<br/><br/>1）domain。用于指定对卡片组进行操作的URL域，默认域是当前卡片组所在的域。domain的目的是限制访问，用户浏览时浏览器将根据domain值所规定的值来得出与值匹配的地址，并访问该地址对应的卡片或事件。 2）path。用于指定卡片组操作的其它卡片组所在的根目录。默认目录是“/”，即当前卡片组所在的根目录。默认目录的规定使得所有在domain域下的卡片组都可以操作当前卡片组。path的值是访问时需要匹配的路径，它的工作原理与domain十分相似，需要与路径的每个子路径相匹配，否则均属无效。<br/><br/>3.1.8 meta元素<br/><br/>meta元素用于定义WML卡片组相关的通用meta信息。该元素是由一个单独的标签即&lt;meta/&gt;标签实现的元素，其语法格式如下：<br/><br/>&lt;meta name=&#34;name&#34;|http-equiv=&#34;name&#34; content=&#34;value&#34; forua=&#34;true|false&#34; scheme=&#34;format&#34;/&gt;<br/><br/>其中，name属性和http-equiv属性只能选择使用一个；content属性是必选的，其值根据属性而定；scheme属性目前尚不支持；forua属性为可选属性。各属性功能及用法说明如下：<br/><br/>1）content。该属性用于指定meta信息的性质的值，是不必选的。<br/><br/>2）name。用于指定meta信息性质的名称。用户浏览器通常忽略已经命名meta数据，网络服务企业拒绝发送包含该属性所指定meta数据名称的内容。<br/><br/>3）http-equiv。该属性用于替代name属性，可将meta数据转为WSP或HTTP协议的响应头。<br/><br/>4）forua。该属性用于指定那些开发者希望传送值用户浏览器的性质。它有ture和fales两个取值，如果取false，则卡片组在发送往客户端以前必须用中间代理去除meta元素信息，这是因为传输的协议可能改变；若取值为true，则meta数据必须如实送往用户的浏览器。默认的状态下，该属性的值为false。<br/><br/>5）scheme。该属性用于指定解释meta信息性质值的形式或结构。具体的形式或结构因meta数据的类型不同而不同。<br/><br/>3.2 任务及其元素<br/><br/>WML允许我们在程序中指定一些任务，当某些特定的事件激活时，即可执行这些任务，从而完成需要的操作。例如，我们可以设定任务，当用户按下相应的功能键时，浏览器就可以打开指定的卡片组或卡片。目前，WML提供了4个任务元素，即go、prev、noop和refresh，它们主要与do元素和onevent元素中指定的事件相响应。本节我们就对任务的这些元素做一详细介绍。<br/><br/>3.2.1 go任务<br/><br/>go任务是通过go元素来声明的，而go元素是通过&lt;go&gt;和&lt;go/&gt;标签进行定义的。go元素主要用来定义浏览器需要导航的URL地址。如果该地址是一个WML卡片或卡片组的名字，则浏览器就会打开并显示相应的卡片、卡片组；否则，浏览器就会执行该URL指定的任务或事件等。在历史推栈中，go任务执行的是一个“推进（push）”操作，也就是说，它执行时浏览器浏览的URL地址将送入历史纪录列表中，以被它用。<br/><br/>go元素中可以包含任意次的setvar元素或postfield元素。postfield元素前面已有介绍，这里不再重述，setvar元素我们后面介绍。<br/><br/>go任务的语法格式如下：<br/><br/>&lt;go href=&#34;href&#34; sendreferer=&#34;false|true&#34; method=&#34;get|post&#34; accept-charset=&#34;charset&#34;&gt;<br/>内容(context)<br/>&lt;go/&gt;<br/><br/>其中属性的功能及用法介绍如下：<br/><br/>1）href。该属性用于指定目标URL地址，比如让浏览器显示的卡片的地址即名称等。属性是必选的，其它属性为可选。<br/><br/>2）sendreferer。该属性用于指定是否传递调用href所指定的URL的卡片的URL，也是当前页的URL，即HTTP头中HTTP_REFERER。有两种选择：true或false。其中，默认值为false。<br/><br/>3）method。与HTML中的表单FORM的method属性一样，该属性用于指定表单是以GET的方式还是post的方式递交，以便通用网关接口CGI处理。默认值为get，但如果没有指定method属性，而&lt;go&gt;和&lt;go/&gt;之间存在postfield元素，则WAP手机浏览器会自动以post方式传递。<br/><br/>4）accept-charset。当web服务器处理来自浏览器的输入信息时，该属性可指定服务器进行数据编码时必须采用的字符集列表。也就是说，该属性指定的字符集替代HTTP头里指定的字符集，以便作为服务器选用字符集的标准。<br/><br/>3.2.2 prev任务<br/><br/>prev任务是由prev元素实现的。该元素通常是一个单独的标签&lt;prve/&gt;，不过有时也可由&lt;prev&gt;和&lt;/prev&gt;一对标签进行定义。它用于指定将浏览器导航至历史推栈中的前一个URL地址。在浏览器操作的历史推栈中，prev任务执行的是“取出”操作，将前一个URL地址取出，并把当前URL地址推进历史推栈。如果历史推栈中没有前一个URL地址，即prev/元素不执行任何任务。<br/><br/>prev任务的语法格式为：<br/><br/>&lt;prev/&gt;<br/>或&lt;prev&gt; 内容（content） &lt;/prev&gt;<br/><br/>在后一语法格式中，prev元素包含的内容里面一般是setvar元素，该元素的含义前面已有介绍，这里不再重述，具体的用法随后介绍。<br/><br/>3.2.3 refresh任务<br/><br/>refresh任务由refresh元素声明，它用于刷新当前的卡片，对卡片内指定的变量进行更新。其语法格式为：<br/><br/>&lt;refresh&gt;<br/>内容(context)<br/>&lt;/refresh&gt;<br/><br/>其中包含的内容(content)中一般有setvar元素，其语法格式为&lt;setvar name=&#34;name&#34; value=&#34;value&#34;/&gt;，它可指定更新的变量名name，即更新的变量值value。另外，refresh元素也可以不包含setvar元素。而通过时间限制（timer元素）对卡片进行刷新。<br/><br/>3.2.4 noop任务<br/><br/>noop任务由noop元素进行声明，表示什么也不做，是一个空操作，在替代卡片组级的do元素是十分有用。该元素是一个单独的标签，即 &lt;noop/&gt; 标签。其语法格式如下：<br/><br/>&lt;nnop/&gt;<br/><br/>noop元素没有属性，下面的简单程序中就包含了noop元素实现得空任务操作：<br/><br/>&lt;card id=&#34;card1&#34;&gt;<br/>&lt;do type=&#34;options&#34; name=&#34;dome&#34;&gt;<br/>&lt;noop/&gt;<br/>&lt;/do&gt;<br/>...<br/>&lt;/card&gt;<br/><br/>3.3 时间及其元素<br/><br/>WML提供了几个元素，专门用于处理用户浏览器的导航和事件。利用这些元素用户可以给某任务制定关联事件。那么当事件触发时，浏览器就会执行相应的任务，比如URL导航就是通过事件实现的。而且，事件可以和一个需要完成的任务捆绑在一起。事件捆绑时一般是通过几种元素及其标签声明来实现的，如go、do和onevent等元素。下面我们就讲解WML的事件元素及事件。<br/><br/>3.3.1 do元素<br/><br/>do元素提供了一个通用的事件处理机制，使得用户可以参与当前卡片的事件处理。通过&lt;do&gt;和&lt;/do&gt;标签将用户交互和某一个任务联系在一起。用户交互可以是用户按下的功能键、选择的菜单项，也可以是用户的声音提示。当用户激活这些交互功能时，用户浏览器就会执行与do元素相关的任务。其语法格式如下：<br/><br/>&lt;do type=&#34;type&#34; label=&#34;label&#34; name=&#34;name&#34; optional=&#34;boolean&#34;&gt;<br/>任务(task)<br/>&lt;/do&gt;<br/><br/>其中tast是与do元素关联的动作，也是条件激活时浏览器即将执行的内容。在do元素中，用户必须绑定且只能绑定go、prev、noop和refresh四种元素所实现任务中的一个任务（task）。go元素用于定位制定的URL地址，prev元素用于定位并打开前一操作或任务，doop为空操作，refresh用于刷新当前卡片组或任务，有关他们的详细用法我们后面会陆续介绍。<br/><br/>do元素可以用于卡片一级，也可用于卡片组一级。当用于卡片一级时，do元素必须包含在card元素中；而用于卡片组一级时，do元素必须包含在template元素中，由此定义的do元素将同时应用于当前卡片组的所有卡片。此时如果某个卡片不想应用模板中的do元素及其任务，则需采用我们前面介绍的方法，使用同名事件处理来替代模板中的do元素的事件处理。而且，不论事件关联的任务是否相同，当do元素定义的事件名称相同时，卡片的do元素将忽视卡片组一级do元素的影响，及卡片一组的do元素将被优先执行。<br/><br/>另外，含有空操作任务的do元素，不论它是否被激活，它都不会传送或显示到用户的浏览器中，这在一定程度上可以加快浏览器的工作效率，因为服务器端体它抛弃了一些空任务的判断。 do元素各个属性的功能及用法讲解如下：<br/><br/>1）type。用于指定do元素的类型（type），也即需要关联、绑定的用户交互事件，是必选属性。用户浏览器接到这些事件后，就会激活它们并执行相应的操作与处理。如果在一个卡片中定义了多个do元素并拥有同样type，那么用户必须为每个do指定不同的事件名才行，否则就会发生判断混乱的错误。<br/><br/>do元素典型的类型（type）及执行条件介绍如下：<br/><br/>1、accept。当用户选择或按下相应功能键时(accept)、选项、命名或按钮时，浏览器接收或激活当前所作选择。 2、prev。激活prev键时，浏览器将导航到历史记录中的前一个卡片。<br/><br/>3、help。激活HELP功能键或相应按钮、命名时，浏览器显示与当前内容相关的帮助信息。<br/><br/>4、reset。激活reset功能键或相应按钮、命名时，清除或重置当前卡片组或浏览器的状态。<br/><br/>5、options。激活options功能键或相应按钮、命名时，浏览器显示与当前内容有关的选项或附加操作。<br/><br/>6、del&#101;te。激活del&#101;te功能键或相应按钮、命名时，删除当前项目或选择。<br/><br/>7、unknown。如果给出的类型不能为do元素所识别，则一律按照unknown型处理，相当于类型为空，即type=&#34;&#34;。<br/><br/>8、vnd.*。vnd.*及其它不同大小写组合[Vv][Nn][Dd].*。这种类型定义的都是vnd.cotype，用于激活供应商或用户浏览器自定义的某个特定功能，其中co为公司(company)名的缩写。<br/><br/>9、X-*与X-*。扩展类型，目前WML中还没有使用。<br/><br/>2）label。该属性指定的文本字符串可以表示用户的交互事件。例如，当把某一个任务绑定在accept键上之后，并设置了label属性，比如label=&#34;gone&#34;，那么浏览器就会将label的值“gome”显示在屏幕上；如果不指定，浏览器则会显示默认的“ok”字符串。为了保证能在较小的手机上显示出来，label的属性值最多不超过6个字符。不过这可能因WAP手机品牌、型号不同而稍有不同，有的手机最多不能超过5个字符。而且，如果手机浏览器不支持动态标签显示，那么它就会忽视label属性。<br/><br/>3）该属性用于指定do元索所绑定事件的名称。如果多个do元素制定了相同的name，那么他们绑定的事件统属一个。如果卡片一般与卡片组一级中do元素制定了相同的事件名，那么卡片一级的时间将被优先执行，卡片组一级的事件将被忽视。<br/><br/>WML规定，在同一卡片或在同一模板中，不得指定具有相同事件名（name）的两个或两个以上的do元素。<br/><br/>另外，如果name属性值为空，则相当于没有指定name属性，这时do元素执行的事件或操作由type的属性值决定。<br/><br/>4）optional。指定浏览器是否忽视do元素及其包含的任务。有两个可选值：true和false。如果值为true，则浏览器将忽视当前do元素，即不执行它所绑定的任务。反之，若值为false，则执行do元素。<br/><br/>3.3.2 ontimer事件<br/><br/>ontimer用于指定一个事件。当&lt;timer/&gt; 标签指定的时间到期后，浏览器就执行ontimer所指定的这个事件。ontimer的时间可以是一个URL地址，一个卡片组，一个WML网页，一幅图像或其他符合URL定位的规则的文件。&lt;timer/&gt;标签指定的时间为正整数，单位大小为1/10秒。<br/><br/>ontimer时间只能包含在card元素或template元素的标签中进行定义，其语法形式如下：<br/><br/>&lt;card id=&#34;name&#34; title=&#34;label&#34; newcontext=&#34;boolean&#34; o&#114;dered=&#34;true&#34; onenterforward=&#34;href&#34; onenterbackward=&#34;href&#34; ontimer=&#34;href&#34;&gt;<br/>内容（content）<br/>&lt;/card&gt;<br/><br/>或：<br/><br/>&lt;template onenterforward=&#34;href&#34; onenterbackward=&#34;href&#34; ontimer=&#34;href&#34;&gt;<br/>内容（content）<br/>&lt;/template&gt;<br/><br/>ontimer事件只有一个属性，即ontimer。它用于指定一个超链（href）的URL地址，指定时间timer过期的时候，用户浏览器就会按照超链（href）的URL打开相应的卡片。<br/><br/>3.3.3 onenterforward事件<br/><br/>onenterforward事件仅当用户使用go任务或类似于go任务的任务来定位和浏览卡片时才可发生。设置onenterforward事件后，当用户进入当前卡片组时，浏览器就会定位onenterforward属性或&lt;go/&gt;标签中指定超链（href）的URL地址，并打开URL指定的卡片。<br/><br/>onenterforward事件需要包含在card元素、template元素或onevent元素的标签中进行定义，其语法格式为：<br/><br/>&lt;card id=&#34;name&#34; title=&#34;label&#34; newcontext=&#34;boolean&#34; o&#114;dered=&#34;true&#34; onenterforward=&#34;href&#34; onenterbackward=&#34;href&#34; ontimer=&#34;href&#34;&gt;<br/>内容（content）<br/>&lt;/card&gt;<br/><br/>或：<br/><br/>&lt;template onenterforward=&#34;href&#34; onterbackward=&#34;href&#34; ontimer=&#34;href&#34;&gt;<br/>内容（content）<br/>&lt;/template&gt;<br/><br/>或：<br/><br/>&lt;onevent type=&#34;onenterforward&#34;&gt;<br/>&lt;go href=&#34;href&#34;/&gt;其他任务（task）<br/>&lt;/onevent&gt;<br/><br/>前两种格式中，onenterforward事件作为card元素或template元素标签中的一个属性进行定义的，该属性即为onenterforward，它制定了一个超链（href）的URL地址，当用户进入当前卡片时，浏览器就据此打开URL指定的卡片。这种格式制定的任务相当与go任务。<br/><br/>3.3.4 onenterbackward事件<br/><br/>当用户使用prev任务或类似的任务来导航至某一卡片时，onenterbackward事件才可发生。换句话说，当用户从历史堆栈中选取URL地址，并通过浏览器打开这一地址对应的卡片时，onenterbackward事件才可能发生。<br/><br/>与onenterforward事件类似，onenterbackward事件也需要包含在card元素、template元素或onevent元素的标签中进行定义。其具体语法格式如下：<br/><br/>&lt;card id=&#34;name&#34; title=&#34;label&#34; newcontext=&#34;boolean&#34; o&#114;dered=&#34;true&#34; onenterforward=&#34;href&#34; onenterbackward=&#34;href&#34; ontimer=&#34;href&#34;&gt;<br/>内容（content）<br/>&lt;/card&gt;<br/><br/>或：<br/><br/>&lt;template onenterforward=&#34;href&#34; onterbackward=&#34;href&#34; ontimer=&#34;href&#34;&gt;<br/>内容（content）<br/>&lt;/template&gt;<br/><br/>或：<br/><br/>&lt;onevent type=&#34;onterbackward&#34;&gt;<br/>&lt;go href=&#34;href&#34;/&gt;其他任务（task）<br/>&lt;/onevent&gt;<br/><br/>前两种格式中，onterbackward事件是作为card元素或template元素标签中的一个属性进行定义的，该属性即为onterbackward，它指定了一个超链（href）的URL地址，当用户使用prev等任务项回到地址时，浏览器就会打开URL指定的卡片。<br/><br/>后一种格式中，onterbackward事件作为onevent元素的一给类型值，并结合&lt;go/&gt;标签指定事件激活时浏览器需要打开的卡片的URL地址。<br/><br/>3.3.5 onpick事件<br/><br/>onpick事件在定义时一般通过onpick属性指定一些项目，当用户选择或取消这些项目时，即可触发onpick事件，执行onpick属性所指定的项目，如打开卡片、卡片组或其他事件等。onpick事件通常在option元素的标签中进行定义，其语法格式如下：<br/><br/>&lt;option value=&#34;value&#34; onpick=&#34;href&#34;&gt;<br/>内容（content）<br/>&lt;/opiton&gt;<br/><br/>可以看出onpick时间作为option元素的一个属性来定义具体的动作。这个属性即onpick，它指定了事件触发时浏览器需要定位的超链的URL地址。<br/><br/>3.3.6 onevent元素<br/><br/>onevent元素通过&lt;onevent&gt;和&lt;/onevent&gt;标签可以把包含的任务与特定的时间捆绑在一起。当用户激活这一特定事件时，onevent元素所绑定的任务就会被立即执行。onevent元素的语法格式如下：<br/><br/>&lt;onevent type=&#34;type&#34;&gt;<br/>任务（task）<br/>&lt;/onevent&gt;<br/><br/>其中task是与onevent元素关联的动作，也是条件激活时浏览器即将执行的内容。与do元素一样，onevent元素中用户也必须绑定且只能绑定go、prev、noop和refresh四种元素所实现任务中的一个任务，go元素用于定位指定URL地址、prev元素用于定位并打开前一操作或任务，noop为空操作，refresh用于刷新当前卡片组或任务。<br/><br/>onevent元素只有一个属性，即type属性，它是必选属性，主要用于定义特定事件的名称。该属性值的数据类型为CDATA型。<br/><br/>3.3.7 postfield元素<br/><br/>postfield元素用于指定当浏览器接到URL请求时，向原服务器（origin server）传送的域名其域值。传输时，传输域及传输值的实际编码方式主要依赖于浏览器与原服务器的通信方式。postfield元素是通过单独?lt;postfield/&gt;标签进行定义的，其语法格式如下：<br/><br/>&lt;postfield name=&#34;name&#34; value=&#34;value&#34;&gt;<br/><br/>它共有两个属性：name与value，它们的取值均属于VDATA型数据。其中，name属性用于指定传输域的名称，value属性用于定义传输的值。这两个属性均为必选属性。<br/><br/>3.4 变量设置元素与变量设置的有关规定<br/><br/>几乎所有的WML内容都可通过设置参数来实现，这为我们灵活的开发WML程序提供了方便。本节我们先介绍一个变量设置元素，然后再介绍与变量设置有关的一些具体规定。<br/><br/>3.4.1 setvar元素<br/><br/>setvar元素用于指定在当前上下文内容中的变量的值，从侧面影响正在运行的任务。其语法格式如下： &lt;setvar name=&#34;name&#34; value=&#34;value&#34;/&gt;<br/><br/>它有两个属性：name和value。前者用于指定变量的名称，后者用于指定所需赋给变量的值。这两个属性都是必选的，它们的数据类型均属于VDATA型。如果name属性所规定的变量名不合法或不符合运行环境的要求，那么setvar元素在WML程序运行中将被忽视，不能发挥其应有的作用。<br/><br/>3.4.2 变量设置<br/><br/>WML编程中可以使用变量，变量使用前必须进行定义。变量的命名原则及定义方法我们上一章已经讲过了，这里不再重述。在这里，我们主要介绍WML程序中设置变量的规定。<br/><br/>如前所述，setvar元素可用来设置变量，设置时setvar元素一般需要在go、prev或refresh元素中进行定义。另外，利用input和sel&#101;ct元素也可以设置变量。其中前者是将用户输入的文本赋给变量，作为变量的值；而后者则将用户从option元素中选择的value属性的值赋给变量。有关input元素和sel&#101;ct元素的语法格式及具体用法我们后面再行介绍。<br/><br/>设置变量时，以下几种情况还应当引起大家注意：<br/><br/>1）可以使用WMLScript的变量值设置WML的变量，反之亦然。也就是说，使用WML及WMLScript编写程序时，它们可以使用同名编程。<br/><br/>2）在WAP开发工具中，通常提供有对变量进行管理和维护的选项卡或对话框，开发人员从中也可以对相应的变量进行设置及编辑。<br/><br/>3）在当前上下文内容中，可以使用card元素的newcontext属性来消除所有的变量值。<br/><br/>3.5 用户输入处理元素<br/><br/>通过WAP手机的按键，用户可以向浏览器显示的卡片中输入数据信息或操作信息。WML为此专门提供了处理用户输入的元素。<br/><br/>3.5.1 input元素<br/><br/>input元素用于定义文本实体对象，包含有对输入文本内容的格式、数据类型、长度、值、变量名等多种属性的具体规定。当用户输入满足input元素的规定时，则接收输入信息，并赋给指定的变量灵活进行相应的操作、处理；否则，就通过浏览器给出具体的处理意见，并进行是单个输入处理或变量初始化操作，比如刷新卡片以让用户重新输入，或给用户指出输入错误所在并等待进一步的处理指令等。input元素是WML编程中处理用户交互活动的重要元素，它通过单独的&lt;input/&gt;标签进行定义，其语法格式如下：<br/><br/>&lt;input name=&#34;variable&#34; title=&#34;label&#34; type=&#34;type&#34; value=&#34;value&#34; default=&#34;default&#34; format=&#34;specifier&#34; emptyok=&#34;false|true&#34; size=&#34;n&#34; maxlength=&#34;n&#34; tabindex=&#34;n&#34;/&gt;<br/><br/>其中除了name属性是必选的以外，其他属性都是可选的。这些属性的功能和用法介绍如下： 1）name。该属性用于指定用来保存用户输入文本的变量和名称。定义name属性后WML将根据该属性也即变量名，为即将输入的文本实体对象与之存储空间，以便接收用户输入。<br/><br/>2）title。该属性用于input元素的标签，通常是位于输入框前的提示信息。<br/><br/>3）type。用于指定文本输入区的类型，有text和password两种选择。默认值为text，指定的用户可以输入文本，而且输入的文本会同时逐渐响应并显示在浏览器中。如果选择password，则指定用户输入的文本作为密码文本处理，WML程序按文本实体接收输入的数据，而浏览器上响应用户输入显示时逐渐均为星号(*)，由此起到保密的目的。<br/><br/>4）value。该属性用于指定name属性所定义变量的值，它将显示在输入框中。<br/><br/>5）default。该属性用于指定name属性所定义变量的默认值。<br/><br/>6）format。该属性用于格式化输入的数据。<br/><br/>7）maxlength。该属性用于指定用户可输入字符串的最大长度。该属性的上限为256，最多不能超过256个字符。<br/><br/>8）emptyok。用于指定用户是否可以不在输入框内输入内容。<br/><br/>9）size。该属性用于指定输入框的宽度，宽度值为字符个数。<br/><br/>10）tabindex。用于指定多个输入框存在时，类似于HTML中Tab键的具体位置。<br/><br/>3.5.2 sel&#101;ct元素<br/><br/>选择列表属于输入元素，允许用户从选项列表中选择需要的项目。WML不仅支持单选列表，及单选项，而且支持多选列表，也就是复选项。sel&#101;ct元素允许用户从选列表中选择所需的项目。列表中的选项采用后面我们就要讲到的option元素进行定义，一般是一行格式化的文本。编程时，我们可以使用optgroup元素将option元素的情况项目分成不同级别或层次的选项组，为用户选择提供方便。<br/><br/>sel&#101;ct元素是通过&lt;sel&#101;ct&gt;和&lt;/sel&#101;ct&gt;标签进行定义的，语法格式如下：<br/><br/>&lt;sel&#101;ct title=&#34;label&#34; multiple=&#34;false|true&#34; name=&#34;variable&#34; default=&#34;default&#34; iname=&#34;index_var&#34; ivalue=&#34;default&#34; tabindex=&#34;n&#34;&gt;<br/>内容（content）<br/>&lt;/sel&#101;ct&gt;<br/><br/>其中所有属性都是可选的。sel&#101;ct元素各个属性的功能和用法介绍如下：<br/><br/>1）multiple。该属性用于指定选择列表是否可以使用复选框。<br/><br/>2）name。该属性用于指定接收选项值的变量的名称，变量值由value属性预设定。<br/><br/>3）value。用于制定name属性所定义变量的默认值。<br/><br/>4）iname。用于指定包含排序号的变量的名称。<br/><br/>5）ivalue。用于指定选择列表中被选中选项的值，是一个具有排序号性质的值。 6）title。用于指定选择列表的标题。<br/><br/>7）tabindex。用于指定当前选择光标在选择列表中的具体位置，该位置即为当前选择操作将要选择的选项所在的位置。<br/><br/>3.5.3 option元素<br/><br/>option元素用于定义sel&#101;ct元素中的一组单选项。它通过&lt;option&gt;和&lt;/option&gt;标签进行定义，并可包括事件和单选项的显示文本等信息，其语法格式如下：<br/><br/>&lt;option title=&#34;label&#34; value=&#34;value&#34; onpick=&#34;href&#34;&gt;<br/>内容（content）<br/>&lt;/option&gt;<br/><br/>option元素的属性均为可选，各属性功能及用法说明如下：<br/><br/>1）value。该属性用于设置键值。当用户选到该选项之后，option元素就会将该值赋给selet元素的name属性所指定的变量。<br/><br/>2）title。用于option元素制定的一个标题，以便提示用户操作。<br/><br/>3）onpick。该属性用于指定用户选到该项并按accept键后所打开卡片组的L。<br/><br/>3.5.4 optgroup元素<br/><br/>optgroup元素用于将多个相关的option元素进行分组，用户浏览器可以借助这种分组来安排选项列表的显示布局，以方便用户选择。optgroup元素是通过&lt;optgroup&gt;和&lt;/optgroup&gt;标签进行定义的，其语法格式如下：<br/><br/>&lt;optgroup title=&#34;label&#34;&gt;<br/>内容（content）<br/>&lt;/optgroup&gt;<br/><br/>它所包含的内容中需要包含至少一次option元素或其他的optgroup元素。<br/><br/>optgroup元素只有一个属性，即title属性，用于定义optgroup元素的标题，以便提示用户操作。<br/><br/>3.5.5 fieldset元素<br/><br/>fieldset元素用于设定输入框和相应的说明文本，从而用户就可以利用input元素等借助该输入框输入所需的数据信息。fieldset元素的语法格式如下：<br/><br/>&lt;fieldset title=&#34;label&#34;&gt;<br/>内容(content)<br/>&lt;/fieldset&gt;<br/><br/>由于fieldset元素和输入有关，所以它们的内容中可以包含与输入有关的其他元素。 其语法格式可以看出，fieldset元素只有一个属性，即title属性，用于定义fieldset元素的标题，以便提示用户操作。<br/><br/>3.6 锚、图像、定时器及其元素<br/><br/>本节我们讲解与定位和定时控制有关的3类元素，包括anchor、a、img、timer几种元素。使用它们可以在WML卡片中创建超链接，或在文本流中显示一幅图像，或设置定时器来控制用户操作及卡片显示等。<br/><br/>3.6.1 anchor元素<br/><br/>anchor元素用于创建一个超链接的头部，超链接的其余部分为用户指定的URL地址。当程序运行中用户选中该超链接时，浏览器就会被引入到超连接指定的地址，如其他卡片组或同一卡片组中的其他卡片。<br/><br/>anchor元素由&lt;anchor&gt;和&lt;/anchor&gt;标签进行定义，它所包含的超连接必须是真实存在的，而且是能够正确连接的超连接。anchor元素定位超链接时，必须通过相关的任务元素完成定位处理，如go元素、prev元素、refresh元素等。不过，在anchor元素中只能包含1个定位任务，多于一个时会导致WML运行错误。<br/><br/>anchor元素的语法格式如下：<br/><br/>&lt;anchor title=&#34;label&#34;&gt;<br/>任务<br/>文本<br/>&lt;/anchor&gt;<br/><br/>其中的任务需要包含一个进行定位的任务元素。可以看到，anchor元素只有一个属性，即title属性，用于定义fieldset元素的标题，它用于定义即title属性，用于定义fieldset元素的标题，以便提示用户操作。元素的超连接的标题。用户浏览时可利用这一标题来及时了解操作的超连接的名称或者有关提示信息。<br/><br/>3.6.2 a元素<br/><br/>a元素是由anchor元素的简化形式，它内含了anchor元素需要包含的go元素功能爱完成超连接定位，并且不再包含其他任何变量设置。它使用&lt;a&gt;和&lt;/a&gt;标签进行定义。<br/><br/>3.6.3 img元素<br/><br/>img元素用于格式化的文本中防止和显示一幅图像。当然，前提是用户所用的浏览器必须支持图像显示。img元素由单独的&lt;img/&gt;标签进行定义，它不包含其它元素。其语法格式如下：<br/><br/>&lt;img alt=&#34;text&#34; src=&#34;url&#34; localsrc=&#34;icon&#34; aligh=&#34;alignment&#34; height=&#34;n&#34; width=&#34;n&#34; vspace=&#34;n&#34; hspace=&#34;n&#34;/&gt;<br/><br/>属性中alt和src是必须要有的，其他可选。另外，需要注意的是img元素要放在p元素里<br/>，而不能放在do或option元素里。<br/><br/>img元素各个属性的功能和用法介绍如下：<br/><br/>1）alt。该属性用来指定当手机不支持图像显示用来替代现实的文字文本。<br/><br/>2）src。该属性用于指定图像文件的URL地址。<br/><br/>3）localscr。该属性用来指定显示存在手机ROM的图标文件。<br/><br/>4）align。该属性用来指定图像显示是相对当前文本行的对齐方式。<br/><br/>5）height。用于设定图像显示时的高度。<br/><br/>6）width。与height属性类似，用于设定图像显示时的宽度或宽度百分比。<br/><br/>7）vspace。该属性用于指定图像显示时的上边距和下边距，默认值为0。<br/><br/>8）hspace。与vspace属性类似，该属性用于指定图像显示时的左边距和右边距。<br/><br/>3.6.4 timer元素<br/><br/>timer元素用于设定一个定时器，可以延时显示卡片组、卡片，或实现WML程序的等待操作，或在卡片组和卡片之间实现切换以取得动画效果。<br/><br/>一个卡片只能使用一次timer元素，也即是说只能设置一个定时器。当用户进入还有定时器的卡片时，定时器就会开始工作，其时间值就会逐渐减小。timer元素指定的时间值单位1/10秒。其语法格式如下：<br/><br/>&lt;timer name=&#34;variable&#34; value=&#34;value&#34;/&gt;<br/><br/>它的两个属性中，value属性是必选的，name属性为可选。name属性用于指定表示时间值的变量的名称，该变量的取值由定时器的时间值决定，时间值减小，该变量的值也相应地减小，并终始保持不变。<br/><br/>value属性用于指定name属性所定义变量的初始值。如果name属性定义的变量在定时器初始化时还没有值，那么该变量就将采用value属性指定的值；否则，改变量就会忽视value属性的值。如果没有定义name属性，也就是说，没有指定时间变量，那么timer元素指定的定时器仍将采用value属性的值进行延时处理。<br/><br/>3.7 文本格式化及其元素<br/><br/>WML程序中，为使显示的文本呈现出丰富的样式，WML提供了一些用于格式化的元素，我们通过这些元素及其相应的标签可以对文本进行标注和控制，从而实现不同的显示效果。<br/><br/>3.7.1 增强元素<br/><br/>增强元素都是一些成对的标签，用于指定文本的增强显示信息。比如b元素通过&lt;b&gt;&lt;/b&gt;标签可以控制其中的文本按照粗体字进行显示。 3.7.2 br元素<br/><br/>“br”即break，是用于换行的元素，它是使用单独的&lt;br/&gt;标签进行定义的。br元素的作用相当于插入一个回车符。<br/><br/>3.7.3 p元素<br/><br/>“p”即指paragraph，p元素用于划分段落，是当前文本换行并插入一个空白行。p元素可以使用单独的&lt;p/&gt;标签进行定义，也可以使用&lt;p&gt;和&lt;/p&gt;标签成对的进行定义。其语法格式为：<br/><br/>&lt;p aligh=&#34;alignment&#34; mode=&#34;wrapmode&#34;/&gt;<br/><br/>或<br/><br/>&lt;p aligh=&#34;alignment&#34; mode=&#34;wrapmode&#34;/&gt;<br/>文本<br/>&lt;/p&gt;<br/><br/>1）align。该属性用于设置段落在浏览器中的对齐方式，有left、center和righ三种取值。这三种参数值分别表示p元素当前定义的文本段落及浏览器窗口的左侧、中间和右侧进行对齐。默认值为left，及段落与浏览器窗口的左侧对齐排列。<br/><br/>2）mode。该属性用于指定下一段落的换行方式。<br/><br/>3.7.4 td元素<br/><br/>td元素用于规定表格单元格的内容。其语法格式如下：<br/><br/>&lt;td&gt; 单元格内容 &lt;/td&gt;<br/><br/>3.7.5 tr元素<br/><br/>WML中的表格是按照行、列进行组织的。一个表格由若干行组成，每行由若干列组成。tr元素用于定义表格的行。其语法格式如下：<br/><br/>&lt;tr&gt; 单元格内容 &lt;/td&gt;<br/>&lt;/tr&gt;<br/><br/>3.7.6 table元素<br/><br/>table元素与tr元素、td元素一起，可用来创建能容纳文本和图像的表格，并可设置表格各列中文本和图像的对齐方式。其语法格式如下：<br/><br/>&lt;table align=&#34;alignment&#34; title=&#34;label&#34; columns=&#34;n&#34;&gt;<br/><br/>或<br/><br/>&lt;table align=&#34;alignment&#34; title=&#34;label&#34; columns=&#34;n&#34;&gt;<br/>内容<br/>&lt;/table&gt;<br/><br/>其中各个属性的功能和用法介绍如下：<br/><br/>1）align。该属性用于指定表各个列中文本和图像的对齐方式。<br/><br/>2）title。该属性用于指定table元素的标题。<br/><br/>3）columns.该属性用于指定表格的列数，该数不能为0。]]></description>
		</item>
		
</channel>
</rss>
