我的世界怎么tp别人我输入了/tp @p ~ 99999999999999999999999999999999999999999 ~ 然后卡崩了怎么办

那位大神知道我的世界联机怎么踢人_百度知道
那位大神知道我的世界联机怎么踢人
我有更好的答案
用/tp ID ~ ~99999 ~这个是利用玩家在地图边界会崩溃的原理踢人,是比较有效的在联机里踢人的方法。ZC
采纳率:92%
来自团队:
为您推荐:
其他类似问题
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。我的世界我输入了/tp @p ~ 99999 ~ 然后卡崩了怎么办_百度知道
我的世界我输入了/tp @p ~ 99999 ~ 然后卡崩了怎么办
我有更好的答案
可以用Minecraft滤器修改地图中的玩家位置
删了重下或者存档删了
这个可以,但是我在那个世界做了好多东西啊
。。。。。。那我就没有办法了实在不行创造先做回来再生存
没用啊,我是因为位置太高卡崩了呀
版本是多少?
抱歉,我对这个版本不太了解。
为您推荐:
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。  有许多技术可用于用 PHP 读取和编写 XML。本文提供了三种方法读取 XML:使用 DOM 库、使用 SAX 解析器和使用正则表达式。还介绍了使用 DOM 和 PHP 文本模板编写 XML。   用 PHP 读取和编写可扩展标记语言(XML)看起来可能有点恐怖。实际上,XML 和它的所有相关技术可能是恐怖的,但是用 PHP 读取和编写 XML 不一定是项恐怖的任务。首先,需要学习一点关于 XML 的知识 —— 它是什么,用它做什么。然后,需要学习如何用 PHP 读取和编写 XML,而有许多种方式可以做这件事。  本文提供了 XML 的简短入门,然后解释如何用 PHP 读取和编写 XML。  什么是 XML?  XML 是一种数据存储格式。它没有定义保存什么数据,也没有定义数据的格式。XML 只是定义了标记和这些标记的属性。格式良好的 XML 标记看起来像这样:<name>Jack Herrington</name>  这个 <name> 标记包含一些文本:Jack Herrington。  不包含文本的 XML 标记看起来像这样:<powerUp />  用 XML 对某件事进行编写的方式不止一种。例如,这个标记形成的输出与前一个标记相同:<powerUp></powerUp>  也可以向 XML 标记添加属性。例如,这个 <name> 标记包含 first 和 last 属性:<name first="Jack" last="Herrington" />  也可以用 XML 对特殊字符进行编码。例如,& 符号可以像这样编码:  &  包含标记和属性的 XML 文件如果像示例一样格式化,就是格式良好的,这意味着标记是对称的,字符的编码正确。清单 1 是一份格式良好的 XML 的示例。  清单 1. XML 图书列表示例
<author>Jack Herrington</author>
<title>PHP Hacks</title>
<publisher>O'Reilly</publisher>
<author>Jack Herrington</author>
<title>Podcasting Hacks</title>
<publisher>O'Reilly</publisher>
</books>   清单 1 中的 XML 包含一个图书列表。父标记 <books> 包含一组 <book> 标记,每个 <book> 标记又包含 <author>、<title> 和 <publisher> 标记。  当 XML 文档的标记结构和内容得到外部模式文件的验证后,XML 文档就是正确的。模式文件可以用不同的格式指定。对于本文来说,所需要的只是格式良好的 XML。  如果觉得 XML 看起来很像超文本标记语言(HTML),那么就对了。XML 和 HTML 都是基于标记的语言,它们有许多相似之处。但是,要着重指出的是:虽然 XML 文档可能是格式良好的 HTML,但不是所有的 HTML 文档都是格式良好的 XML。换行标记(br)是 XML 和 HTML 之间区别的一个好例子。这个换行标记是格式良好的 HTML,但不是格式良好的 XML:<p>This is a paragraph<br>With a line break</p>   这个换行标记是格式良好的 XML 和 HTML:<p>This is a paragraph<br />With a line break</p>   如果要把 HTML 编写成同样是格式良好的 XML,请遵循 W3C 委员会的可扩展超文本标记语言(XHTML)标准(参见 )。所有现代的浏览器都能呈现 XHTML。而且,还可以用 XML 工具读取 XHTML 并找出文档中的数据,这比解析 HTML 容易得多。  使用 DOM 库读取 XML  读取格式良好的 XML 文件最容易的方式是使用编译成某些 PHP 安装的文档对象模型 (DOM)库。DOM 库把整个 XML 文档读入内存,并用节点树表示它,如图 1 所示。  图 1. 图书 XML 的 XML DOM 树  树顶部的 books 节点有两个 book 子标记。在每本书中,有 author、publisher 和 title 几个节点。author、publisher 和 title 节点分别有包含文本的文本子节点。  读取图书 XML 文件并用 DOM 显示内容的代码如清单 2 所示。  清单 2. 用 DOM 读取图书 XML
$doc = new DOMDocument();
$doc->load( 'books.xml' );
$books = $doc->getElementsByTagName( "book" );
foreach( $books as $book )
$authors = $book->getElementsByTagName( "author" );
$author = $authors->item(0)->nodeV
$publishers = $book->getElementsByTagName( "publisher" );
$publisher = $publishers->item(0)->nodeV
$titles = $book->getElementsByTagName( "title" );
$title = $titles->item(0)->nodeV
echo "$title - $author - $publisher\n";
?>   脚本首先创建一个 new DOMdocument 对象,用 load 方法把图书 XML 装入这个对象。之后,脚本用 getElementsByName 方法得到指定名称下的所有元素的列表。  在 book 节点的循环中,脚本用 getElementsByName 方法获得 author、publisher 和 title 标记的 nodeValue。nodeValue 是节点中的文本。脚本然后显示这些值。  可以在命令行上像这样运行 PHP 脚本:% php e1.php PHP Hacks - Jack Herrington - O'ReillyPodcasting Hacks - Jack Herrington - O'Reilly%   可以看到,每个图书块输出一行。这是一个良好的开始。但是,如果不能访问 XML DOM 库该怎么办?  用 SAX 解析器读取 XML   读取 XML 的另一种方法是使用 XML Simple API(SAX)解析器。PHP 的大多数安装都包含 SAX 解析器。SAX 解析器运行在回调模型上。每次打开或关闭一个标记时,或者每次解析器看到文本时,就用节点或文本的信息回调用户定义的函数。  SAX 解析器的优点是,它是真正轻量级的。解析器不会在内存中长期保持内容,所以可以用于非常巨大的文件。缺点是编写 SAX 解析器回调是件非常麻烦的事。清单 3 显示了使用 SAX 读取图书 XML 文件并显示内容的代码。  清单 3. 用 SAX 解析器读取图书 XML
$g_books = array();
function startElement( $parser, $name, $attrs )
global $g_books, $g_
if ( $name == 'BOOK' ) $g_books []= array();
$g_elem = $
function endElement( $parser, $name )
global $g_
function textData( $parser, $text )
global $g_books, $g_
if ( $g_elem == 'AUTHOR'
$g_elem == 'PUBLISHER'
$g_elem == 'TITLE' )
$g_books[ count( $g_books ) - 1 ][ $g_elem ] = $
$parser = xml_parser_create();
xml_set_element_handler( $parser, "startElement", "endElement" );
xml_set_character_data_handler( $parser, "textData" );
$f = fopen( 'books.xml', 'r' );
while( $data = fread( $f, 4096 ) )
xml_parse( $parser, $data );
xml_parser_free( $parser );
foreach( $g_books as $book )
echo $book['TITLE']." - ".$book['AUTHOR']." - ";
echo $book['PUBLISHER']."\n";
?>   脚本首先设置 g_books 数组,它在内存中容纳所有图书和图书信息,g_elem 变量保存脚本目前正在处理的标记的名称。然后脚本定义回调函数。在这个示例中,回调函数是 startElement、endElement 和 textData。在打开和关闭标记的时候,分别调用 startElement 和 endElement 函数。在开始和结束标记之间的文本上面,调用 textData。  在这个示例中,startElement 标记查找 book 标记,在 book 数组中开始一个新元素。然后,textData 函数查看当前元素,看它是不是 publisher、title 或 author 标记。如果是,函数就把当前文本放入当前图书。  为了让解析继续,脚本用 xml_parser_create 函数创建解析器。然后,设置回调句柄。之后,脚本读取文件并把文件的大块内容发送到解析器。在文件读取之后,xml_parser_free 函数删除解析器。脚本的末尾输出 g_books 数组的内容。  可以看到,这比编写 DOM 的同样功能要困难得多。如果没有 DOM 库也没有 SAX 库该怎么办?还有替代方案么?  用正则表达式解析 XML  可以肯定,即使提到这个方法,有些工程师也会批评我,但是确实可以用正则表达式解析 XML。清单 4 显示了使用 preg_ 函数读取图书文件的示例。  清单 4. 用正则表达式读取 XML
$xml = "";
$f = fopen( 'books.xml', 'r' );
while( $data = fread( $f, 4096 ) ) { $xml .= $ }
fclose( $f );
preg_match_all( "/\<book\>(.*?)\<\/book\>/s",
$xml, $bookblocks );
foreach( $bookblocks[1] as $block )
preg_match_all( "/\<author\>(.*?)\<\/author\>/",
$block, $author );
preg_match_all( "/\<title\>(.*?)\<\/title\>/",
$block, $title );
preg_match_all( "/\<publisher\>(.*?)\<\/publisher\>/",
$block, $publisher );
echo( $title[1][0]." - ".$author[1][0]." - ".
$publisher[1][0]."\n" );
?>   请注意这个代码有多短。开始时,它把文件读进一个大的字符串。然后用一个 regex 函数读取每个图书项目。最后用 foreach 循环,在每个图书块间循环,并提取出 author、title 和 publisher。  那么,缺陷在哪呢?使用正则表达式代码读取 XML 的问题是,它并没先进行检查,确保 XML 的格式良好。这意味着在读取之前,无法知道 XML 是否格式良好。而且,有些格式正确的 XML 可能与正则表达式不匹配,所以日后必须修改它们。  我从不建议使用正则表达式读取 XML,但是有时它是兼容性最好的方式,因为正则表达式函数总是可用的。不要用正则表达式读取直接来自用户的 XML,因为无法控制这类 XML 的格式或结构。应当一直用 DOM 库或 SAX 解析器读取来自用户的 XML。  用 DOM 编写 XML  读取 XML 只是公式的一部分。该怎样编写 XML 呢?编写 XML 最好的方式就是用 DOM。清单 5 显示了 DOM 构建图书 XML 文件的方式。   清单 5. 用 DOM 编写图书 XML
$books = array();
$books [] = array(
'title' => 'PHP Hacks',
'author' => 'Jack Herrington',
'publisher' => "O'Reilly"
$books [] = array(
'title' => 'Podcasting Hacks',
'author' => 'Jack Herrington',
'publisher' => "O'Reilly"
$doc = new DOMDocument();
$doc->formatOutput =
$r = $doc->createElement( "books" );
$doc->appendChild( $r );
foreach( $books as $book )
$b = $doc->createElement( "book" );
$author = $doc->createElement( "author" );
$author->appendChild(
$doc->createTextNode( $book['author'] )
$b->appendChild( $author );
$title = $doc->createElement( "title" );
$title->appendChild(
$doc->createTextNode( $book['title'] )
$b->appendChild( $title );
$publisher = $doc->createElement( "publisher" );
$publisher->appendChild(
$doc->createTextNode( $book['publisher'] )
$b->appendChild( $publisher );
$r->appendChild( $b );
echo $doc->saveXML();
?>   在脚本的顶部,用一些示例图书装入了 books 数组。这个数据可以来自用户也可以来自数据库。  示例图书装入之后,脚本创建一个 new DOMDocument,并把根节点 books 添加到它。然后脚本为每本书的 author、title 和 publisher 创建节点,并为每个节点添加文本节点。每个 book 节点的最后一步是重新把它添加到根节点 books。  脚本的末尾用 saveXML 方法把 XML 输出到控制台。(也可以用 save 方法创建一个 XML 文件。)脚本的输出如清单 6 所示。清单 6. DOM 构建脚本的输出
% php e4.php
<?xml version="1.0"?>
<author>Jack Herrington</author>
<title>PHP Hacks</title>
<publisher>O'Reilly</publisher>
<author>Jack Herrington</author>
<title>Podcasting Hacks</title>
<publisher>O'Reilly</publisher>
</books>
%   使用 DOM 的真正价值在于它创建的 XML 总是格式正确的。但是如果不能用 DOM 创建 XML 时该怎么办?  用 PHP 编写 XML  如果 DOM 不可用,可以用 PHP 的文本模板编写 XML。清单 7 显示了 PHP 如何构建图书 XML 文件。清单 7. 用 PHP 编写图书 XML
$books = array();
$books [] = array(
'title' => 'PHP Hacks',
'author' => 'Jack Herrington',
'publisher' => "O'Reilly"
$books [] = array(
'title' => 'Podcasting Hacks',
'author' => 'Jack Herrington',
'publisher' => "O'Reilly"
foreach( $books as $book )
<title><?php echo( $book['title'] ); ?></title>
<author><?php echo( $book['author'] ); ?>
</author>
<publisher><?php echo( $book['publisher'] ); ?>
</publisher>
</books>   脚本的顶部与 DOM 脚本类似。脚本的底部打开 books 标记,然后在每个图书中迭代,创建 book 标记和所有的内部 title、author 和 publisher 标记。  这种方法的问题是对实体进行编码。为了确保实体编码正确,必须在每个项目上调用 htmlentities 函数,如清单 8 所示。清单 8. 使用 htmlentities 函数对实体编码
foreach( $books as $book )
$title = htmlentities( $book['title'], ENT_QUOTES );
$author = htmlentities( $book['author'], ENT_QUOTES );
$publisher = htmlentities( $book['publisher'], ENT_QUOTES );
<title><?php echo( $title ); ?></title>
<author><?php echo( $author ); ?> </author>
<publisher><?php echo( $publisher ); ?>
</publisher>
</books>   这就是用基本的 PHP 编写 XML 的烦人之处。您以为自己创建了完美的 XML,但是在试图使用数据的时候,马上就会发现某些元素的编码不正确。  结束语  XML 周围总有许多夸大之处和混淆之处。但是,并不像您想像的那么难 —— 特别是在 PHP 这样优秀的语言中。在理解并正确地实现了 XML 之后,就会发现有许多强大的工具可以使用。XPath 和 XSLT 就是这样两个值得研究的工具。
[转贴]DOM知识的翻译与整理
先来看一张简单的文档树很明显树的顶层节点是NodeA节点,接下来可以通过指定的合适节点移动到树中的任何点,结合以下的代码你可以更好的了解这棵树节点间的相互关系:NodeA.firstChild = NodeA1 NodeA.lastChild = NodeA3 NodeA.childNodes.length = 3 NodeA.childNodes[0 ] = NodeA1 NodeA.childNodes[1] = NodeA2 NodeA.childNodes[2] = NodeA3 NodeA1.parentNode = NodeA NodeA1.nextSibling = NodeA2 NodeA3.prevSibling = NodeA2 NodeA3.nextSibling = null NodeA.lastChild.firstChild = NodeA3a NodeA3b.parentNode.parentNode = NodeA
DOM定义对操作一个文档对象的节点结构提供了实用的方法,它提供了像执行对象插入,更新,删除,克隆等这些常用的方法insertBefore()--在参考子节点之前插入一个新的子节点.如果参考的子节点为null,则新的子节点将作为调用节点的最后一个子节点插入replaceChild()--在childNodes集合种使用指定的newChild来代替oldC如果代替成功,则返回oldC如果newChild是null,则只需删除oldChild即可 removeChild()--从节点的ChildNodes集合中删除removeChild指定的节点,如果删除成功,则返回删除的子节点 appendChild()--添加一个新节点到childNodes集合的末尾,如果成功,则返回新节点 cloneNode()--创建一个新的、复制的节点,并且如果传入的参数是true时,还将复制子节点,如果节点是一个元素,那么还将复制相应属性,返回新的节点 为了在一棵文档树中访问或者建立一个新的节点,可以用下面这些方法:getElementById()getElementsByTagName()createElement()createAttribute()createTextNode()注意:在一个页面中只有一个文档对象,除了getElementsByTagName()外,其它方法均只能通过document.methodName()调用. 再看一下下面这个例子:&html&&head&&title&&/title&&/head&&body&&p&This is a sample paragraph.&/p&&SCRIPT LANGUAGE="JavaScript"&&!--alert(document.documentElement.lastChild.firstChild.tagName);//--&&/SCRIPT&&/body&&/html&结果将会显示"P",下面是一些解释document.documentElement - gives the page's HTML tag. lastChild - gives the BODY tag. firstChild - gives the first element in the BODY. tagName - gives that element's tag name, "P" in this case.另一个:&html&&head&&title&&/title&&/head&&body& &p&This is a sample paragraph.&/p&&SCRIPT LANGUAGE="JavaScript"&&!--alert(document.documentElement.lastChild.firstChild.tagName);//--&&/SCRIPT&&/body&&/html&这个例子和上面并没有什么大的区别,仅仅是多了一个空行,但是在NS中,会自动为空行加上一个节点所以返回值是"undefined",而在IE中将跳过空行仍然指向P标签 更常用的方法:&p id="myParagraph"&This is a sample paragraph.&/p& ... alert(document.getElementById("myParagraph").tagName);这种方法你不用关心节点在文档树的哪一个地方,而只要保证在页面中它的ID号是唯一的就可以了 接下来一种访问元素节点的方法是document.getElementsByTagName(),它的返回值是一个数组,例如你可以通过下面的例子改变整个页面的连接var nodeList = document.getElementsByTagName("A");for (var i = 0; i & nodeList. i++)nodeList[i].style.color = "#ff0000"; attribute和attributesattribute对象和元素相关,但是却没有被认为是文档树的一部分,因此属性不能作为子节点集合的一部分来使用.有三种方法可以为元素建立新的属性1.var attr = document.createAttribute("myAttribute");attr.value = "myValue";var el = document.getElementById("myParagraph");el.setAttributeNode(attr);2.var el = document.getElementById("myParagraph");el.setAttribute("myAttribute", "myValue");3.var el = document.getElementById("myParagraph");el.myAttribute = "myValue";你可以在html标签种定义自己的属性:&p id="myParagraph" myAttribute="myValue"&This is a sample paragraph.&/p& ... alert(document.getElementById("myParagraph").getAttribute("myAttribute"));返回值将是"myValue".但是请注意这里必须使用getAttribute,而不是AttributeName,因为有一些浏览器并不支持自定义属性 attributes也可以被轻易的从一个元素中删除,你可以使用removeAttribute()或者将element.attributeName指向一个null值.通过attributes我们就可以产生一些动态效果:&p id="sample1" align="left"&Text in a paragraph element.&/p& ... code for the links ... document.getElementById('sample1').setAttribute('align', 'left');document.getElementById('sample1').setAttribute('align', 'right');另一种:&p id="sample2" style="text-align:"&Text in a paragraphelement.&/p& ... code for the links ... document.getElementById('sample2').style.textAlign = 'left';document.getElementById('sample2').style.textAlign = 'right';跟上面的例子一样,展示了可用通过元素修改style中的属性,甚至是class中的.唯一要提到的是textAlign是从style中的text- align中演变而来的,有一条基本规律,就是style中的属性如果出现-则在dom中将会被去掉并且随后的一个字母将改为大写,还有一点就是如果即使元素中没有style属性,上述例子同样可以使用 text nodes:先看一下例子&p id="sample1"&This is the initial text.&/p& ... code for the links ... document.getElementById('sample1').firstChild.nodeValue ='Once upon a time...';document.getElementById('sample1').firstChild.nodeValue ='...in a galaxy far, far away';首先text nodes并没有像elements那样具有id属性,所有它并不能直接通过document.getElementById()或者document.getElementsByTagName()访问看一下下面的结构也许会更明白一些可以看出通过document.getElementById('sample1').firstChild.nodeValue就可以读取或者设置text nodes的值了 另一个更加复杂一点的例子&p id="sample2"&This is the &b&initial&/b& text.&/p&它的文档结构在这里通过document.getElementById('sample1').firstChild.nodeValue讲仅仅改变"This is the"而initial text.将不会改变.在这里大家应该看到了它和innerHTML的不同了.当然你也可以这样用document.getElementById('sample3').firstChild.nodeValue ='&b&Once&/b& upon a time...';document.getElementById('sample3').firstChild.nodeValue ='...in a galaxy &i&far, far&/i& away';其中的html代码将不会被解释,浏览器将把他们当成普通的文本来显示 创建和删除text nodes:var myTextNode = document.createTextNode("my text");通过上面的代码你可以创建一个新的text node,但是它并不是文档树的一部分,要让它显示在页面上就必须让它成为文档树中某一个节点的child,因为text nodes不能有儿子,所以你不能将它加入到一个text nodes中,attribute也不属于文档树的一部分,这条路也不行,现在只剩下elements nodes了,以下的例子展示了如何添加和删除一个text node&p id="sample1"&Initial text within a paragraph element.&/p& ... code to add a text node ... var text = document.createTextNode(" new text " + (++counter1));var el = document.getElementById("sample1");el.appendChild(text); ... code to remove the last child node ... var el = document.getElementById("sample1");if (el.hasChildNodes())el.removeChild(el.lastChild);增加文本是很容易的,上面的代码建立了一个新的text node并且通过appendChild()方法将其加入到childNodes数组的末尾,并设置了一个counter1的全局变量,利于观察hasChildNodes()的返回值是用来判断当前节点是否还有child,以阻止当其没有child的时候调用removeChild()产生的错误 创建element nodes有了上面的基础,应该更容易理解了,先看一下下面的代码&div id="sample1"&This text is in a DIV element.&/div& ... code for the link ... var paraEl, boldEl; paraEl = document.createElement("p");boldEl = document.createElement("b");paraEl.appendChild(document.createTextNode("This is a new paragraph with "));boldEl.appendChild(document.createTextNode("bold"));paraEl.appendChild(boldEl);paraEl.appendChild(document.createTextNode(" text added to the DIV"));document.getElementById("sample1").appendChild(paraEl);你还可以直接为新加的element nodes设置attribute,以下两种都可以:boldEl.style.color = "#ffff00";paraEl.appendChild(boldEl);或者:paraEl.appendChild(boldEl);boldEl.style.color = "#ffff00"; 注:此文主要来自于一些英文资料和身边的一些参考书,如果有错误大家请指出,一起讨论,DOM我一点也不熟. 转自:http://www.blueidea.com/tech/program/.asp
[转贴]给希望做程序员的应届毕业生的一些建议
这几个月,不断的看到网站上关于计算机专业的应届毕业生的就业、未来和工作能力的讨论,有很多的感想,面试了不少的毕业生,简历看了几百份,了解、熟悉、精通等等的副词就不说了,实际编程能力都比较有限,上网聊天玩游戏水平比较高。这些都是事实,然而,如何快速的融入公司的开发工作中?不断的学习和实践。
最近不断的有应届毕业生到公司实习,对于问题的接受能力,有的快些,有的慢些,学习新知识的能力也不同,但是有时候给我的印象比较深刻,看书看的很卖力,实际编程却总是不理想。后来跟一个毕业生聊天,他说:看的东西老是记不住。还有的在看VC的书,一边看一遍记笔记,他说这样加深印象,可以记住,将来编程的时候不至于不知道怎么写代码,远远的看过去,给人的感觉好想要考研究生。
我不知到其人是如何学习新知识的,我个人觉得,上大学与工作之后学习的方式有很大的不同,上大学,为了考试,很多东西需要记住,毕业以后,知道到哪里查找资料就可以了,没有必要刻意记住一些细节。当然,能记住细节固然好,但是不要被细节搞成了苦行僧。
看程序的代码是一个很好的学习方式,对于同样的代码,初学者关注的可能是一些系统函数的使用方法,数据类型的使用,派生和继承的关系和作用,重载的效果。对于具备了一定的编程经验之后,不再特别关注代码中的函数,变量,类的定义和使用,更多关注的是代码的设计的思路,设计思想,模块之间的关系,模块之间的接口等等。关键是理解,理解之后,自然就会记住。
MFC中有很多的类和很多的函数,还有很多与标准C++不一样的数据类型,有必要全部记住吗?只需要记住一些基本的常用的就可以了如VC中的 CString,CDialog,CDocument,CView,AWinApp,CMDIFrameWnd,CButton,CEdit, CListBox,CComboBox,CTreeCtrl等等,这些类必须知道他们是干什么的,有什么用途,具体的使用可以看帮助, AfxMessageBox,try catch,TRACE,LPCTSTR,UINT,DWORD,WPARAM,LPARAM,SendMessage等等也是需要记住的,这些都是编写 VC程序经常用到的。没有必要记住太多,关键是学会使用MSDN,将主要的精力放在代码的设计上,不知道一个函数如何调用没有关系,知道如何使用F1键就够了。MSDN上没有可以到CSDN上搜搜,或者到Codeproject上看看。
不要一直埋头写代码,抽时间到一些技术网站上看看,知道哪里有什么样的资料,或许有一天,你知道到哪里查找有关的信息,学会利用互联网上的免费资源。
不要总是加班,不要抽太多的烟,程序员不是吃青春的,除非你自己选择吃青春饭。bill gates比我们的年龄大,单却是微软的首席软件设计师,从事Windows底层设计的人肯定不是20多岁的小伙子。中国软件的发展也不能靠吃青春饭。
学会与同事交流和协作,是一个优秀的团队成员最基本的素质。JAVA的流行,一个非常重要的原因是java语言可以平台,通过java写的程序,记可以在 windows下运行,还可以在Linux或UNIX下运行,java是一个非常优秀的语言。一个优秀的程序员没有必要掌握一种跨平台的语言,然而,他自身必须具备一种“跨平台”的能力,这就是团队精神和合作意识,这一种能力,到任何一个公司,任何一个项目组,任何一个团队,无论他们使用Windows、 Linux还是Unix,无论是开发CS结构的程序还是开发BS结构的程序,也无论开发硬件还是软件,都是最重要的最受欢迎的一种能力。我对我们公司的实习生讲,如果谁把自己封闭起来,相互之间不帮助,不团结,首先会出局。
经常在网上看到关于学习什么语言的讨论,什么样的语言最有前途,什么语言容易学,什么语言工资高等等。个人认为,对于应届毕业生,在公司的产品开发中不起主导作用,基本上没有权力选择语言,除非你离开公司,因为公司的已有的产品或项目决定了使用什么语言,或者是产品的主要的开发人员决定了使用什么语言,所以你只有接受。但是这有什么关系吗?应该使用什么语言,你参与的产品使用什么语言,那你就使用什么语言,具体学习什么语言不是特别重要,最重要的是在实践中学习一种好的设计思想,用计算机语言思考问题,学会对现实问题的抽象和概况,学会用一种计算机的模型来描述现实世界中的东西。经过一段时间之后,你对一门语言非常熟悉了,再看其他的语言,觉得都很相似,都有if else ,for,while,=,&.&,Stirng,class,try catch等等类似的东西,也有很多的差别,你再学习一个新的语言就非常容易了。当然,很多情况下我们会接触几种语言。我和同事一直使用VC,最近使用 C#写了个实现事务预约的程序,3个星期,程序测试通过,现蒸现卖,还不错。
上面文字仅是个人的理解,仅供参考。
关于函数的自定义属性
JavaScript中的函数有许多内置属性,比如说length(取得函数参数的个数),prototype(取得Function对象建立的事例的原形对象)。
而对于函数我们也可以自定义属性,函数声明在代码执行之前处理
// Create and initialize the "static" variable.
// Function declarations are processed before code is executed, so
// we really can do this assignment before the function declaration.
uniqueInteger.counter = 0;
// Here's the function. It returns a different value each time
// it is called and uses a "static" property of itself to keep track
// of the last value it returned.
function uniqueInteger(
// Increment and return our "static" variable
return uniqueInteger.counter++;
document.write(uniqueInteger());document.write(uniqueInteger());
输出结果为:
为什么不是两个0呢?因为函数的属性可以保存/修改值,所以可以看成是一个全局变量。
异常处理机制
JavaScript中使用try/catch/finally语句来进行异常的捕获及处理,这点和Java中的异常处理有点想象。
for example:
function exception(x){ if(x&0) throw new Error("您输入的数字是负数");/*调用错误对象,当然你也可以调用自己想用的任何对象,比如说new String("字符串")等等。*/ else alert(x);}
//异常处理开始
try { tp = prompt("输入一个正数",""); exception(tp);}catch(ex) {//将异常对象引用给变量ex alert(ex);//处理异常}finally { alert("处理完毕");//finally语句不管在什么情况下都会运行,它和catch属于可选语句。}
JavaScript学习(六)
JavaScript中存在两种数据类型,分别是基本类型和引用类型。数值、布尔值、NULL、未定义值(undefined)属于基本类型;数组、对象、函数则属于引用类型。对于基本类型,JavaScript分配8个字节的空间;而对于引用类型由于是动态的,没有固定大小,因此不能直接分配空间,而是使用引用来指向内存地址,虽然引用不是数据本身,但是指向了存储的位置,这点和C中的指针以及Java中的引用很相似。考虑以下代码:var a=1;//定义并初始化var b=a;//把变量a的值复制给ba=2;//改变了a的值,并没有改变b的值document.write(b);输出结果:1再看以下代码:var a=[1,2,3,4];var b=a;//将地址引用复制到新的变量bb[0]=100;//都是指向同一个 位置document.write(a);输出结果:100,2,3,4注意到字符串(String)不属于上面两种数据类型,这是因为一方面字符串具有可变的大小(因此不属于基本类型);另一方面又具有和基本数据类型很相似的表现。虽然是引用地址,但不能改变字符串的值。因此无论是将String看成是基本数据类型还是引用类型都是可以的。
JavaScript学习(五)
变量的作用域在JavaScript中,声明变量使用var,如果不使用var,那么这个变量将会是全局变量,在函数中也是一样function test(){
var b=20;}test();document.write(a);document.write(b);输出结果为:10undefined*在函数中声明的局部变量在整个函数中都有定义*还有一个值得注意的地方var var1 = 100;function test(){
alert(var1);
var var1 = 11;//initialized here,but define everywhere.这里初始化,但是在函数的内部到处都定义了。}test();输出结果为:undefined为什么会是undefined而不是我们所期望的100 呢?原因是由于在函数中声明或者初始化的局部变量在整个函数中都有定义,因而同名的全局变量被隐藏了,那么上面的代码等同于下面的:var var1 = 100;function test(){
alert(var1);
var1 = 11;//initialized here,but define everywhere.这里初始化,但是在函数的内部到处都定义了。}test();为了避免这样的问题,我们可以在函数中将所有要声明的变量集中放在开头再来看一下,循环,控制语句中的变量。在函数中它们的作用范围是整个函数,而不是单独的块级变量function test(o) {
var i = 0;
// i is defined throughout function
if (typeof o == "object") {
var j = 0;
// j is defined everywhere, not just block
for(var k = 0; k & 10; k++) {
// k is defined everywhere, not just loop
document.write(k);
document.write(k);
// k is still defined: prints 10
document.write(j);
// j is defined, but may not be initialized} test(new Object());输出结果为:0123456789100
JavaScript学习(四)
对象JavaScript中内置了很多对象,通过JavaScript与Html交互就是对DOM的操作,比如window就是一个对象,document也是一个对象等等。访问一个对象的属性和方法很简单,直接使用点(.)来访问,比如:document.write()方法,str.length属性等等。另外我们在访问对象的属性时候还可以通过数组的形式来访问。比如有个对象image,有两个属性width,height,那么我们除了可以使用image.width和image.height来访问image对象的width和height之外,还可以使用image["width"]和image["height"]来访问注意:仅仅用在对象的属性上面,不可用在对象方法上。建立对象的方法有:也可以套嵌var1={lst1:{x:1,y:2},lst2:{z:3,o:4}};//循环输出for(it in var1){for(rt in var1[it]){document.write(var1[it][rt]);}}输出结果为:1234最后还有一种创建对象的方法就是利用Object对象var1 = new Object() //建立一个对象var1.lft = "left"; //开始分配属性var1.rht = "right";document.write(var1.lft);document.write(var1.rht);for(it in var1)document.write(var1[it]);输出结果:leftrightleftright
JavaScript学习(三)
小议JavaScript中的函数var test1 = function(a)//定义函数的非常规方法{
return(a);}function test2(b)//定义函数的常规方法{
return(b);}var test3 = new Function("c","return(c);");//非常规定义函数的方法alert(test1("fuc1"));alert(test2("fuc2"));alert(test3("fuc3"));我们用的最频繁的函数定义方法就是第二种了。
JavaScript学习(二)
接着讨论数组,先看一个例子//arr = new Array("one","two","three");arr = ["one","two","three"];document.write(arr);输出结果为:one,two,three注意到数组直接输出是以逗号(,)连接起来的。好了,数组差不多就这些了,再看字符串arr = "four";for(it in arr)document.write(arr[it]);输出结果:four注意到字符串也可以利用索引来访问单个的字符字符串有很多方法和属性,这些方法和属性是继承了基类的,比如length属性就是取得字符串的长度length属性str="hello world";document.write(str.length);输出结果为:11我们再看str="你好";document.write(str.length);输出结果为:4为什么呢?这是因为汉字是有两个字节构成的,一个汉字当作两个字符来处理。charAt(num)方法描述:取得指定位置num的单个字符,注意索引从0开始,和利用字符串数组的性质一样。str="hello world";document.write(str.charAt(str.length - 3));输出结果为:rsubstring(start,end)方法描述:取得从start开始的end-start个子字符串。str="hello world";document.write(str.substring(1,4));输出结果为:ell再看个例子:str="你好";document.write(str.substring(0,2));输出结果为:你如果改一下的话str="你好";document.write(str.substring(0,3));输出结果为(想想都知道是乱码了):你??????矍獋矍???只要注意一下汉字的2个字节性质就清楚了。indexOf(string str)方法描述:取得字符串str第一次出现的位置str="hello world";document.write(str.indexOf("wo"));输出结果为: 6提示:我们注意到字符串采用了类似对象的格式来访问基类的属性和方法,但是这并不意味着字符串在JavaScript是对象。实际上字符串是一种特殊的数据类型,它使用对象的语法格式来访问相应的属性和方法,但它本身并不是对象。
JavaScript学习
//正常的定义数组的格式为arr = new Array("one","two","three","four");//define a new array objectdocument.write(arr[0]);//index from 0;document.write(arr[1]);document.write(arr[2]);document.write(arr[3]);//use for...in retrieving all array elementsfor(it in arr)document.write(arr[it]);//也可以定义复杂的数组,带有自定义索引的rarr = ["one","two","three","four"];//注意创建的方式for(it in rarr)document.write("rarr[\""+it+"\"] = "+rarr[it]);//JavaScript中,对象可以作为数组来被访问,其中数组索引从0开始,举个例子:function class_test()//定义一个类(在这里其实就是一个函数){
this.var1 = 1;//不需要声明,直接赋值即可
this.var2 = 2;
this.var3 = 3;
//必须使用this来指定对象属性(变量)。}ct1= new class_test();//创建一个对象document.write(ct1['var1']);//通过索引来访问,这里的索引就是对象中的属性(变量)for(it in ct1)//或者也可以通过for in的形式来遍历对象document.write("ct1[\""+it+"\"] = "+ct1[it]);/*结果为onetwothreefouronetwothreefourrarr["a"] = onerarr["b"] = tworarr["c"] = threerarr["d"] = four1ct1["var1"] = 1ct1["var2"] = 2ct1["var3"] = 3*///note the follow codearr = {"a":"one","b":"two","c":"three"};//初始化对象arr[0] = "four";//插入一个元素,注意必须指派一个索引
可以是数字或者字符串for(it in arr)document.write(arr[it]);arr["a"] = "a";//更改一个元素项for(it in arr)document.write(arr[it]);/*输出结果onetwothreefouratwothreefour*/arr = {"a":"one","b":"two","c":"three"};arr = "four";//此时重定义了arr,变成了字符串,注意字符串也可以通过索引来访问单个字符for(it in arr)document.write(arr[it]);/*输出结果four*/
WAP初级教程(六)
WAP初级教程(6)—事件EVENT
来源:破釜沉舟
[字体:大中小]
事件 (EVENT)
任务不能在真空中生存,它们必须绑定倒某个事件上才能做一些有用的事情。事件发生--〉任务执行,这才是完整的进程控制。
有4个元素可以帮助你完成事件对任务的绑定:&anchor&、&onevent&、&timer&和&do&。
象HTML一样,WML也可以定义到其他程序的链接。在HTML中,链接通常用下划线和特殊颜色的方式表示跟其他内容的区别。在WAP终端上则没有严格的规则说如何表示一个链接,一般采用反白的显示方式。
&anchor&的语法如下:&anchor   title="STRING"    xml:lang="STRING" &   &br&, &go&, &img&, &prev&, &refresh&, TEXT &/anchor&title:链接的标题;xml:lang:语言编码。在这种定义方式中,实际上链接一般是通过&anchor&中包括的&go&元素完成的。比如下面的例子定义了2个CARD,点击第一个CARD里的“click me”链接会跳转到第2个CARD: &?xml version="1.0"?& &!DOCTYPE wml PUBLIC "-//WAPFORUM//DTD WML 1.1//EN"   "http ://www.wapforum.com/DTD/wml_1.1.xml"& &wml& &card id="Hello" title="Hello"&   &p&Hello,   &anchor&click me    &go href="#bye"/&   &/anchor&   &/p& &/card& &card id="bye" title="Bye"&   &p&Bye, guys&/p& &/card& &/wml&点击前显示:点击后显示:------- Hello ------- Hello,-------- bye --------Bye, guys 链接还有一种短格式,语法如下: &a    href="STRING"    title="STRING"    xml:lang="STRING" &   &br&, &img&, TEXT &/a&除了跟原来一样的两个属性以外,多了href属性,可以对它直接指定URL。例如下面的例子定义了一个带有图像的链接: &a title="HotBars" href="wap.hucn.com/HotBars.wml"&   &img src="hot.wbmp" alt="Hot Bars" /& &/a&除了跟原来一样的两个属性以外,多了href属性,可以对它直接指定URL。&onevent& 固有事件WML定义了4种由用户终端触发的固有事件: oneventforward:当用户被&go&任务或其他机制(如一个SCRIPT过程)引导到一个CARD时触发;oneventbackward:当用回被&prev&或其他机制(如在设备上按BACK按钮)引导到一个CARD时触发;ontimer:当TIMER计时结束时触发。定义TIMER计时器可以使用&timer&元素,见下一节;onpick:当用户按下一个&option&选项时触发(可以是选中或取消选择)。把这些事件绑定到一个任务要使用&onevent&元素,它的语法如下: &onevent   type="oneventforward | oneventbackward | ontimer | onpick" &   &go&, &noop&, &prev&, &refresh& &/onevent&下面的例子演示了如何使用固有事件在CARD调入时清空变量。&?xml version="1.0"?& &!DOCTYPE wml PUBLIC "-//WAPFORUM//DTD WML 1.1//EN"  "http://www.wapforum.org/DTD/wml_1.1.xml"& &wml& &card id="card1"&   &onevent type="oneventforward"&   &refresh&    &setvar name="firstname" value=""/&    &setvar name="lastname" value=""/&   &/refresh&   &/onevent&   &p&    You have no name!   &/p& &/card& &/wml&&timer& 计时器看名字就知道,这是个计时器,它在经过规定的计时时间以后产生一个任务。&timer&计时器只在所属CARD里有效:当进入CARD时,计时器开始工作;时间一到,触发任务;如果离开CARD,计时器停止。语法如下:&timer  name="STRING"   value="NUMBER" /&name:可选。指定一个包含计时时间的变量,在计时器开始工作以后,变量的值会逐渐减少。如果这个变量在&timer&之前就已经存在并且赋值为一个非负整数,那后面value属性的值会被忽略,直接使用变量里的值作为计时时限。value:必选。指定计时时间,以1/10秒为单位。 下面的例子每隔1秒显示不同的文字(当然,你有兴趣改成图像也可以)。&?xml version="1.0"?& &!DOCTYPE wml PUBLIC "-//WAPFORUM//DTD WML 1.1//EN"   "http://www.wapforum.org/DTD/wml_1.1.xml"& &wml& &card id="Hello" title="Hello"&   &onevent type="ontimer"&    &go href="#card2"&   &/onevnet&   &timer value="10"/&   &p&Hello!&/p& &/card& &card id="Take care"&   &onevent type="ontimer" title="Take care"&    &go href="#card3"&   &/onevnet&   &timer value="10"/&   &p&R U tired?&/p&   &/card& &card id="Rest"&   &onevent type="ontimer" title="Rest"&    &go href="#card1"&   &/onevnet&   &timer value="10"/&   &p&Take a rest!&/p& &/card& &/wml&显示结果如下,注意会不断循环。 Sport选择:第1秒第2秒第3秒------ Hello ------ Hello! ----- Take care ---- R U tired? ------- Rest ------- Take a rest! 还有一个例子,通常用来做网站封面,显示一段欢迎词以后进入正式内容。这里没有使用图片,各位可以自己加上试试看。&?xml version="1.0"?& &!DOCTYPE wml PUBLIC "-//WAPFORUM//DTD WML 1.1//EN"   "http://www.wapforum.org/DTD/wml_1.1.xml"&&wml& &card id="Welcome to WAP86" ontimer="wap86.wml"&   &timer value="30"/&  &p&    Hello!    Welcome to WAP86 - the paradise of WML developers.   &/p& &/card& &/wml&部件功能accept 确认,接受输入 prev 退回历史页面访问堆栈里上一个CARD help 上下文关联的帮助信息 reset 重设设备状态 options 上下文关联的选项或附加操作 delete 删除当前内容或选择 unknown 由开发者自己定义&do& 用户触发事件每个WAP终端都预定义了一系列用户界面部件,如手机上的按钮、触摸屏上的图表、声音指令或者其他一些很容易是别的部件。WML1.1定义了右面那些WAP 兼容终端必须支持的部件。但是要说明的是,只有prev有预先定义的功能,其他的只是概念上的定义,需要根据开发者激活并赋予一定的动作。当用户激活这些部件的时候会产生相应的事件。你可以使用&do&元素捕获这些事件并对其做出反应。下面是&do&的语法:&do  type="accept | prev | help | reset | options | delete | unknown"   lebel="STRING"   name="STRING"   optional="true | false"   xml:lang="STRING" & &go& | &noop& | &prev& | &refresh& &/do&type:必选属性,内容只能是那7种;label:用户接口部件的显示标签。如果终端不能显示则被忽略。WML1.1建议此属性长度限制在6个英文字符以内;name:标志“事件/任务”绑定关系的唯一名称(在CARD范围内)。CARD级的&do&事件替换同名的DECK级&do&事件(见下一节)。如果不指定name属性或name为空字符串,则name默认为type的类型;optional:告诉终端此软按钮在屏幕中是否显示。如果此值设为true,则忽略本&do&元素。默认值为false;xml:lang任务:语言代码。跟其他“事件/任务”绑定关系一样,&do&里的任务定义必须是&go&、&noop&、&prev&或&refresh&中的一个。 下面例子演示了&do&的使用方法。用户按了不同的按钮会被导向不同的CARD。&?xml version="1.0"?& &!DOCTYPE wml PUBLIC "-//WAPFORUM//DTD WML 1.1//EN"   "http://www.wapforum.org/DTD/wml_1.1.xml"& &wml& &card id="Card1" title="WAP86 Links"&   &do type="accept" label="Links" optional="false"&     &go href="#Links"/&   &/do&   &do type="help" label="Help" optional="false"&     &go href="#Help"/&  &/do&  &p& WAP86’s perfect links&/p& &/card& &card id="Links" title="WAP86 Links"&   &p& Select one:&br&&br&    &a href="wap.hucn.com"&hucn&/a&&br&    &a href="wap.hucn.com"&hucn&/a&   &/p& &/card& &card id="help" title="Help"&   &do type="accept" label="Links" optional="false"&    &go href="#Links"/&   &/do&   &p&     Select "Links" button to view the links.   &/p& &/card& &/wml&显示结果主画面:按下“Links”按钮以后:按下“Help”按钮以后:---- WAP86 Links --- WAP86’s perfect links Links      Help ---- WAP86 Links --- Select one: &[ WAP86 ] [ AT86 ] ------- Help ------- Select "Links" button to view the links. Links DECK级事件前面(一节,关于&template&)已经讲过可以用&template&元素定义DECK级事件,做法跟CARD级事件一样,只要在 &template&元素里包含&do&或&onevent&事件就可以。这种做法可以定义一些在每个CARD里都需要定义的事件,而不需要重复说明。比如下面的例子给所有的CARD定义了BACK按钮以便返回上一页: &?xml version="1.0"?& &!DOCTYPE wml PUBLIC "-//WAPFORUM//DTD WML 1.1//EN"   "http://www.wapforum.org/DTD/wml_1.1.xml"&&wml& &template&   &do type="prev" label="BACK" optional="false"&    &prev/&   &/do& &/template& &card id="Links" title="WAP86 Links"&   &do type="help" label="Help" optional="false"&    &go href="#Help"/&   &/do&   &p& Select one:&br&&br&    &a href="wap.hucn.com"&hucn&/a&&br&    &a href="wap.hucn.com"&hucn&/a&   &/p& &/card& &card id="help" title="Help"&   &do type="accept" label="Links" optional="false"&    &go href="#Links"/&   &/do&   &p&   Select "Links" button to view the links.  &/p& &/card& &/wml&
WAP初级教程(五)
WAP初级教程(5)—任务TASK
来源:破釜沉舟
[字体:大中小]
任务(TASK)
前面我们已经讲过如何在WML中显示内容。不过任何程序员都知道,没有结构和进程就没有程序。在WML中定义进程有很多方法,最简单的就是任务。WAP1.1定义了几种类型的任务,任务通过对事件(有关事件的详细解释见下一章)的响应改变程序的运行顺序。有四种WML任务:·
。 &noop&这个任务不做任何事情,一般用于屏蔽DECK级事件(参见和),语法非常简单: &noop/&&prev&当用户激活该任务时,终端就转回上次用户访问过的URL。语法如下:&prev&    &setvar&    ...... &/prev&如果&prev&中包含了&setvar&元素,就会优先处理。下面例子定义了一个只有Back按钮的的DECK,按下以后会返回前面看过页面。&?xml version="1.0"?& &!DOCTYPE wml PUBLIC "-//WAPFORUM//DTD WML 1.1//EN" "http://www.wapforum.org/DTD/wml_1.1.xml"& &wml& &card&   &p&   &anchor&     Back     &prev/&    &/anchor&   &/p& &/card& &/wml&&refresh&当用户激活该任务时,就执行一个刷新过程。如果这个任务里使用&setvar&定义了变量,变量值将被重新设置。语法如下:&prev&    &setvar&    ...... &/prev&如果当前CARD含有&timer&元素,那么在刷新时&timer&优先启动。下面的例子定义在屏幕刷新时重设firstname、lastname和age变量。&do type="refresh"&   &refresh&    &setvar name="firstname" value="david"&    &setvar name="lastname" value="smith"&    &setvar name="age" value="29"&   &/refresh& &/do&&go&当用户激活该任务时,就引导用户去WML中指定URL,可以是服务器上其他的DECK,也可以是本DECK中其他的CARD。语法如下:&go    accept-charset="STRING"    href="URL"    method="post|get" sendreferer="true|false" &    &postfield&, &setvar&...... &/go&href:必选属性,指向一个合法URL。如果是其他的DECK,则该DECK的第一个CARD会显示出来。如果是本DECK中的其他CARD,而历史堆栈里保存的是最新数据的话,则堆栈保持不变,直接调入该CARD。sendreferer:如果为true,用户主体信息(USER AGENT)必须传送给WAP网关。传送时使用HTTP的提交头信息,即尽可能简短的相对URL。这个属性可以用来给服务器控制存取URL的权力。默认值为false。Method:值必须为get或post。分别用来产生HTTP的GET和POST请求。若为get,则在URL中列出参数,例如:“http: //www.wap86.net/bob.cgi?argone=one”;若为post,则数据在请求内部传送,不需要在URL中列出。Accept-charset:指定字符集名称列表,服务器在接受&go&的时候必须接受这个编码规则。默认值为unknown。具体内容这里不作解释,在以后的高级教程中描述。下面是一个简单的例子:&go href="../topic.wml" sendreferer="true"&&postfield&&postfield&并不是一个任务,但是跟&go&任务有关,所以在这里介绍。它用来定义“名称/值”对以便通过&go&向服务器发送HTTP请求。语法如下: 当用户激活该任务时,就引导用户去WML中指定URL,可以是服务器上其他的DECK,也可以是本DECK中其他的CARD。语法如下: 下面是一个简单的例子:&postfield name="STRING" value="STRING" /&当一个含有&postfield&的任务被执行的时候,终端要完成这样一个过程:1、识别“名称/值”对并准备参数变量;2、参数变量转换成正确的字符集;3、根据URL的ESCAPE规则对参数进行ESCAPE转码,编译成application/x-www-form-urlencoded的MIME类型;4、根据method指定的请求模式提交任务。下面的例子演示get模式的用法:&go href="../news.asp" sendreferer="true" method="get"&   &postfield name="newstype" value="technology"/&   &postfield name="newstext" value="wml"/& &/go&服务器将收到这样的get请求:GET ../news.asp?newstype=technology&newstext=wml HTTP/1.1 . . 其他HTTP头信息.如果把前面的请求模式改成post,则同样的&go&任务产生的这样的post请求:POST../news.asp HTTP/1.1 content-type="xxx-urlencoded" .. 其他HTTP头信息 . newstype=technology&newstext=wml
WAP初级教程(四)
WAP初级教程(4)—桌面DECK
来源:破釜沉舟
[字体:大中小]
桌面 (DECK)
由于网络带宽以及某些WAP服务器DECK传输的限制,所以DECK越小越好,最好不要超过1.2K。如果你的需求很复杂,最好分成几个DECK来完成。
完整的WML文档结构如下:
&?xml version="1.0"?& &!DOCTYPE wml PUBLIC "-//WAPFORUM//DTD WML 1.1//EN"   "http://www.wapforum.org/DTD/wml_1.1.xml"& &wml&   &head&    .    . 头信息......   .   &/head&   &template&   .   . 模板定义......    .   &/template&   &card&   .    . 内容......   .    &/card&   .   . 其他card(可有可无)......   . &/wml&
XML说明 DECK开头必须指明以下的XML类型声明: &?xml version="1.0"?& &!DOCTYPE wml PUBLIC "-//WAPFORUM//DTD WML 1.1//EN"   "http://www.wapforum.org/DTD/wml_1.1.xml"&第一行指出XML版本,紧跟的文档类型(DOCTYPE)声明指出所引用的语言标准定义(wml_1.1.xml的内容可以察看本教程附录中的说明)。这两句的位置和顺序不可更改,而且中间不能有空行。&wml& 语法:
&wml&标签和HTML中的&html&标签一样,用来表明这是一个WML的DECK。xml:lang属性来指定文档的语言,比如&wml xml:lang="zh"&表示文档语言为中文。&head& &head&标签包含了该DECK的相关信息。&head&标签之间可以包含一个&access&标签和多个&meta&标签。&access&语法:&access    domain="STRING"    path="STRING" /&&access&相当于HTML中的&BASE&标签,指定该DECK的访问控制信息,它的两个属性是可选的。domain:指定域,默认值为当前域。path:指定路径,默认值为"/",即根目录。&meta&语法: &meta    http-equiv="STRING" | name="STRING"    forua="true|false"    content="STRING"    scheme="STRING" /&和HTML中&META&的类似,&meta&提供了该DECK的meta信息。包括一下三种情况name="name" UP.Link Server忽略meta数据  http-equiv="name" UP.Link Server将meta数据转为HTTP响应头(同HTML)   user-agent="agent" UP.Link Server直接将meta数据传给手机设备content属性也是必选的,其内容根据属性而定。scheme属性目前尚不支持。forua为可选属性,指定在该wml文件传到客户端之前,&meta&标签是不是被中间代理删除(因为传输的协议可能改变),默认值为false。目前支持的meta数据:   &meta http-equiv="Cache-Control" content="max-age=3600"/&指定DECK在手机内存缓存中的存储时间段,默认的为30天(除非内存耗尽),在该期间,手机对于访问过的DECK直接从缓存里调用。如果信息是对时间敏感的,可以用max-age指定DECK在缓存里的生存期,最小单位是秒,如果指定为0,则每次都需通过连接服务器来调用该DECK。  &meta user-agent="vnd.up.markable" content="false"/&和&meta user-agent="vnd.up.bookmark" content="指定的URL"/&类似于普通浏览器的书签功能。当用户将一个CARD做了书签后,手机浏览器首先用一个标记记录该CARD,这个标记默认的是&card&标签中的title属性(以后会讲到),然后当用户选择了该书签以后,浏览器就会打开被记录的URL。但是因为在默认的情况下,手机会记录所有的DECK,所以,一般&meta&被用来使手机不要记录当前的URL,即&meta user-agent="vnd.up.markable" content="false"/&。此外,如果要为书签指定不同于当前DRECk的URL,用&meta user-agent="vnd.up.bookmark" content="指定的URL"/&。&template& &template&元素声明一个DECK级的事件/请求,对DECK页面中所有CARD有效,当然某个CARD可以通过定义同名的事件来替代&template&声明中的事件处理。 语法: &template    onenterforward="STRING"    onenterbackward="STRING"    ontimer="STRING" /&onenterforward:当用户通过&go&进入CARD时调入的链接。onenterbackward:当用户通过&prev&退回CARD时调入的链接。ontimer:&timer&事件激活时调入的链接。例子(其中涉及的其他命令参考其他章节): &wml& &template&   &do type="options" name="do1" label="default"&   &prev/&   &/do& &/template& &card id="first"&   &!-该卡片将自动套用模块中定义的事件处理过程--&   …   &/card& &card id="second"&   &!-使用空操作(noop)来屏蔽模块中定义的事件处理过程-&   &do type="options" name="do1"&    &noop/&   &/do&    … &/card& &card id="third"&   &!-该卡片使用同名的事件处理替代模块中提供的事件处理-&   &do type="options" name="do1" label="options&    &go href="/options"/&   &/do& &/card& &/wml&另外可以参看。&card& 一个DECK可以包含多个CARD,每个CARD的内容可能不止一屏显示,注意DECK、CARD和屏幕显示范围的关系。一个CARD用&card&和&/card&包含。 语法: &card  id="STRING"   title="STRING"   newcontext="true|false"   ordered="true|false"   onenterforward="STRING"   onenterbackward="STRING"   ontimer="STRING"   xml:lang="STRING"& 每个CARD元素可以有一个标号(ID)和标题(TITLE)。当然,这都不是必须的。id:CARD的名字,在DECK中唯一,可用作URL已进行跳转。title:CARD的标题,用户BOOKMARK一个CARD时的名字。该属性在某些用户终端上会显示出来。newcontext:用来指示当跳转到本CARD时,用户终端(手机、模拟器等)是不是要清除以前保留的信息如变量、堆栈历史记录、终端状态等。默认值为FALSE。ordered:表明该CARD里的内容是按固定的顺序显示,还是按用户的选择来显示。默认值是TRE。这点和HTML不同,CARD页面里的内容可以按一定的顺序显示,默认的是按线性顺序显示,即按代码的顺序,但是,要注意的是,以下三个标签必须按以下顺序来写&onevent&  &timer& &do&,(这和以后要讲的“事件”有关)。这样做是为了方便填表单,当ordered设置为true时,如果一个表单的内容不能在一屏里显示完,就分成多屏显示;当ordered设置为false时,手机可以显示一个概要CARD来总结有效的选项,用户可以从中选取表单选项来填写。onenterforward:当用户通过&go&进入CARD时调入的链接。onenterbackward:当用户通过&prev&退回CARD时调入的链接。ontimer:&timer&事件激活时调入的链接。不同浏览器指标 &Nokia 7110&Ericsson R320&Ericsson R380&UP.Browser&CARD最大字节数&1397 字节&3000 字节&3800 字节&1492 字节&图象最大字节数&1397 字节&3000 字节?&3800 字节?&1492 字节?&显示行数&4 (含标题行)&5&7&视终端不同&S3568i:6&显示列数&19&14&不知道&视终端不同&显示宽度(象素)&95&101&304&视终端不同&显示高度(象素)&45&52&98&视终端不同&象素比例&1:1.25&不知道&1:1.23&视终端不同&字体&无&Small, Bold, Emphasis, Strong&Small, Big, Bold, Italic, Emphasis, Strong&Small, Big, Bold&文字位置&没有,强制居左&居左、居中、居右&居左、居中、居右、段落缩进&不知道&图象位置&强制居左&不知道&不知道&不知道&表格支持&不支持&最多5x5格&不知道&不知道&触摸屏&无&无&有&无&图标键&无&无&有&不知道&在WML页面内拨号&"提取号码" 功能&通过WTAI支持&通过WTAI支持&3.1以上版本的浏览器支持&输入&在行内输入&在设置位置输入&在设置位置输入&不知道&输入格式&只有大小写&不知道&不知道&不知道&图形链接&无&有&有&不知道&链接格式&在行内&在设置位置&在设置位置&不知道&DECK下载顺序&文字,然后图形,再开始选择性计时&文字,开始选择性计时,然后是图(结果有可能是CARD还未下载完毕就已过时)&不知道& &HTTP Redirect&支持&支持&支持&支持&
WAP初级教程(三)
WAP初级教程(3)—显示内容
来源:破釜沉舟
[字体:大中小]
CARD里可以显示象文本、图像这样的内容。象HTML一样,WML也提供一些标记对内容进行排版。段落与换行标记 &p&:段落标记,用来对段落进行分段。语法:&p  aligh="left|right|center"  mode="wrap|nowrap";  xml:lang="STRING" &aligh:文字对齐方式,左(left)、右(right)、居中(center)。mode:文字超出屏幕时是否折行,各种终端处理方式不同。xml:lang:显示语言编码。&br&:行分隔标记,产生回车效果。语法:&br  xml:lang="STRING" /&xml:lang:显示语言编码。段落和换行的例子:&?xml version="1.0"?&&!DOCTYPE wml PUBLIC "-//WAPFORUM//DTD WML 1.1//EN" "http://www.wapforum.org/DTD/wml_1.1.xml"&&wml&&card title="Paragraphs"&&p&This is a paragraph&/p&&p&This is a another&br/&with a line break&/p&&/card&&/wml&显示结果如下:------ Paragraphs ------This is a paragraphThis is anotherwith a line break标记字体样式&b&粗体 &big&大字体&em&强调字体&i&斜体&small&小字体&strong&加重强调字体&u&下划线字体文字样式标记WML提供了一系列文字样式的标记,如右表所示。不过WML鼓励大家尽量使用&strong&和&em&标记,因为某些WAP终端会忽略其他标记。每个文字样式标记语法都一样,都有一个标志语言代码的xml:lang属性。下面是一个例子:
&?xml version="1.0"?&&!DOCTYPE wml PUBLIC "-//WAPFORUM//DTD WML 1.1//EN"  "http://www.wapforum.org/DTD/wml_1.1.xml"&&wml&&card title="Formatting"&  &p&   normal&br/&   &em&emphasized&/em&&br/&   &strong&strong&/strong&   &br/& &b&bold&/b& &br/&   &i&italic&/i&&br/&   &u&underline&/u&&br/&   &big&big&/big&&br/&   &small&small&/small&  &/p&&/card&&/wml&在你的终端上可能会有这样的显示 (不过别太当真,前面说了有的终端会忽略文本样式标记):list.asp%3fid=3所以变量有可能需要标志为是否对其内容进行ESCAPE转换,变量定义就有如下几种特殊方式:----- Formatting -----normalemphasizedstrongbolditalicunderlinebigsmall表格WML支持简单的表格标记&table&、&tr&和&td&。语法如下: &table  align="L|R|C"  columns="NUMBER"  TITLE="STRING" &tr&  &td& 内容... &/td&  其他列... &/tr&  其他行...&/table&在WML里定义一个表格必须先指定列数,即columns属性。而在表格里就必须有相应数量的&td&&/td&标记对。因该注意的是,align(对齐)属性的内容只能是L(左对齐)、R(右对齐)和C(居中),跟其他标记不同(是不是有点怪?)。下面的例子演示了表格的基本功能:&?xml version="1.0"?&&!DOCTYPE wml PUBLIC "-//WAPFORUM//DTD WML 1.1//EN"  "http://www.wapforum.org/DTD/wml_1.1.xml"&&wml&&card title="SALARY"&&p&&table columns="2"&&tr&&td&NAME&/td&&td&PAYED&/td&&/tr&&tr&&td&Johnson&/td&&td&$7810.11&/td&&/tr&&tr&&td&Faye&/td&&td&$8912.00&/td&&/tr&&/table&&/p&&/card&&/wml&显示结果(注意WML里没有表格线):------ SALARY ------NAME     PAYEDJohnson    $7810.11Faye     $8912.00图像相对于多媒体泛滥的HTML网站,在资源紧张的WAP设备上显示图像就有点奇怪了。但是WML还是提供了图像显示的支持,毕竟一个设计精巧的图像会比一段话表达意思更清楚,或许占用空间更小。
WML支持WBMP(Wireless Bitmap)格式的图像,需要用特殊工具制作。显示图像使用&img&标记,语法如下:&img alt="STRING" src="STRING" align="top|middle|bottom" height="NUMBER" width="STRING" hspace="NUMBER" vspace="STRING" localsrc="STRING" /&alt: 图像无法显示时的替换文字。src: 图像的url。localsrc: 储存于ROM(或RAM)中图像的名字,各种终端支持不同。align: 上下对齐方式。height: 图像显示高度。width: 图像显示宽度。hspace: 图像左右的空白,以pixel数或百分比表示。vspace: 图像上下的空白,以pixel数或百分比表示。上面的属性只有alt和src是必须的。其他附加属性基本上仅仅用来指示用户终端,大多数情况下会被忽略。下面是个例子:&?xml version="1.0"?&&!DOCTYPE wml PUBLIC "-//WAPFORUM//DTD WML 1.1//EN" "http://www.wapforum.org/DTD/wml_1.1.xml"&&wml&&card title="Congratulation"&&p&WAP86, &img src="wonderful.wbmp" alt="wonderful"/&!&/p&&/card&&/wml&下面分别是在支持和不支持图像的终端上的显示结果:--- Congratulation ---WAP86,!--- Congratulation ---
WAP86, wonderful!
WAP初级教程(二)
WAP初级教程(2)—WML变量
来源:破釜沉舟
[字体:大中小]
象HTML一样WML可以定义变量,可以让你的页面设计更简单和富有逻辑性。变量格式如下显示: $identifier $(identifier) $(identifier:conversion)圆括号在变量带有空格时使用,第3种格式本节后面说明。变量的优先权最高,所以当出现与变量符号相同的字符时,它将被认为是变量的标志。因此如果想在WML页面中显示$符号时必须在其后面再跟一个$符号。如下例:You account has $$1650.00 in it.变量名是由US-ASCII码、下划线和数字组成,并且只能以US-ASCII码开头。变量名大小写敏感。WML变量没有类型,均表示为字符串。变量没有被赋值的时候,内容为空,即空字符串。可以在运行过程中改变它的值。创建变量 创建变量最简单的方法是使用&setvar&元素,语法如下: &setvar  name="string"    value="string" /&&setvar&只能在&go&、&prev&和&refresh&中使用(具体操作见本教程)。下例定义了一个叫vNAME的变量并赋值为“Jeff”:&setvar name="vNAME" value="Jeff" /&另外,还可以在&input&、&select&和&postfield&中定义变量,参考本教程(和)替换文本变量可以用作替换用途,但只能在文本类型(如显示字符、URL等)中使用。任何元素和属性都不能使用变量来替代。例如:Hello, $vNAME.将显示: Hello, Jeff. ESCAPE转换前面说过变量可以用作替换用途,但是在URL中使用时,变量的内容必须遵守[RFC2396]标准。这个标准规定某些特殊字符在URL里使用的时候必须用特殊表示方法,即ESCAPE八进制表示。例如:list.asp?id=3在URL中要表示为:list.asp%3fid=3所以变量有可能需要标志为是否对其内容进行ESCAPE转换,变量定义就有如下几种特殊方式:效果表达方式1表达方式2表达方式3对变量中ESCAPE字符进行转换 $(var:e) $(var:E) $(var:escape) 不进行ESCAPE转换 $(var:u) $(var:U) $(var:unesc) 变量中没有ESCAPE字符 $(var:n) $(var:N) $(noesc)给变量进行ESCAPE转换是WML的默认方式,特殊字符ESCAPE码请参考本教程。
WAP初级教程(一)
WAP初级教程(1)—WML基础
来源:破釜沉舟
[字体:大中小]
的基本情况
用于WAP的标记语言就是WML(Wireless Markup Language)。WML的语法跟XML一样,WML是XML的子集。HTML、XML和WML的文件有很多相似之处,这样网页开发者在过去10年中所学的东西今天依然适用。WML页面文件的后缀是 *.WML,就象HTML的 *.HTML后缀。XML规定定义了一个规范的XML文件的规格。任何违反这个规定的WML文件会出错。WML文件通常使用XML解释器起来解释。建立网页制作环境WML文件本身就是文本文件,所以编辑不成问题,顺手的编辑器都可以用。 当然,由于目前的浏览器还都不能显示WML页面,而我们又不能总在手机上进行测试(速度太慢),所以需要模拟器。现在象NOKIA、ERICSSON、 MOTOROLA等手机制造商都生产了相应的产品,你只要下载就行了。当然除了模拟器以外,还需要图形制作转换器(用来制作WAP格式的图形文件)、字符转码器(汉字〈-〉UNICODE)等等。WML文件结构WML 的页面通常叫做桌面(DECK),由一组互相链接的卡片(CARD)组成。当移动电话访问一个WML页面的时候,页面的所有CARD都会从WAP服务器下载到设备里。CARD之间的切换由电话内置的计算机处理,不需要再到服务器上取信息了。CARD里可以包含文本、标记、链接、输入控制、任务(TASK)、图像等等。CARD之间可以互相链接。
文档的实体包含在&wml&...&/wml&标记中,文档里每个CARD又包含在&card&...&/card&标记中,然后实际的文字段落则包含在&p&...&/p&标记中。简单例子:&?xml version="1.0"?& &!DOCTYPE wml PUBLIC "-//WAPFORUM//DTD WML 1.1//EN"   "http://www.wapforum.org/DTD/wml_1.1.xml"& &wml& &card id="HELLO" title="HELLO"&  &p&  Hello world!  &/p& &/card& &/wml&显示结果如下:------ HELLO ------ Hello World! DECK里面各个组成部分的具体解释在本教程的其他部分有说明。WML字符集WML是XML的子集,继承了XML的字符集设置。WML文档缺省的字符集是UTF-8。 要显示中文,有两种办法。最简单的办法就是在文档头使用encoding,即把第一行改为: &?xml version="1.0" encoding="gb2312"?&然而令人丧气的是,这种方法有些手机和模拟器并不支持(将来会的),所以目前第2种方法更普遍:不改变字符集设置,但是在写中文的时候采用UNICODE代表中文字符,如:&b&通讯录&/b&代表: 通讯录WML元素:标记(Tag)和属性WML的主要内容是文本,由于标记会降低与手持设备的通讯速度,所以WML标准里仅仅使用了很少一部分。用于表格和图像的的标记几乎都被排除了。
与XML一样,在WML语言中,所有元素都放在符号"&" 和 "&"中,并且包含一个开始标志、一个结束标志和一个内容标志,或者使用自身结束的控制标记。就象这样:&tag&内容&/tag& 例如:&p&Hello world!&/p& 或 &tag/& 例如:&br/& 和 &go href="#done"/&WML同样支持在标志中标出属性。属性是标志的附加信息,与元素的内容不一样,它并不在屏幕上显示出来。属性通常在元素的开始标志后指定。如上面最后一个例子。由于WML是XML的一种应用,因此所有的WML标记和属性都是大小写敏感的(&wml&跟&WML&完全不同),而且所有的标记都必须正确地结束。WML要求属性的值必须放在双引号或单引号内。单引号可放在属性标志内或双引号内。字符亦可作为属性的值。WML注释XML支持这样的注释格式: &!这句话你在手机上看不到--&这些注释在浏览器中并不显示出来。WML不支持嵌套元素注释。链接(URL)WML外部引用方式跟HTML相同 http://www.wap86.net/great.wml 或 http://www.wap86.net/great.wml#login 内部引用,如果next是当前DECK中的一个CARD时,可以用这种方式:#next提供链接功能的WML元素有2个:&go&(参见)和&anchor&(参见)。CDATAXML支持CDATA的概念,以显示不需要解释的文本。下面的例子使用CDATA元素在WML页面中显示WML命令文本。&! [CDATA [ &card name="bogus"&&p&gtthis is data&/p&&/card& ] ]&浏览器窗口将显示如下内容: &card name="bogus"&&p&this is data&/p&&/card&
WAP教程(六)
第六章 WML Script标准函数库(上)
(Penny 日 16:17)
这节会讨论标准的WML Script函数库。6.1 WML Script规则这些标准函数库提供一个扩展WML Script语言的机制,这些特定的函数库必须遵循WML Script的规则。支持的数据格式下面的WML Script格式使用于程序的定义之中,这样能记录程序参数与回转值的格式。BooleanIntegerFloatStringInvalid除此之外,如果整数与浮点数参数值格式都能接受的话,则能使用number来记录参数格式,如果使用的格式是所支持的格式,则能用any来记录。数据格式转换函数库程序发生错误的处理方式和WML Script语言一样。invalid程序参数会产生invalid的回传值。程序的参数无法转成所需要使用参数格式,则会产生invalid的回传值。与程序相关的错误得出回传一个适当的错误码,至于这个值就要看每个程序如何定义。6.2 Lang函数库名称:Lang说明:这个函数库所含的程序同WML Script语言的核心有很密切的关系。abs程序:abs(value)说明:回传给予数的绝对值。如果给予的数是整数,则回传整数。如果给予的数是浮点数,则回传浮点数。参数:value=数字。回传值:数字或invalid。例外状况:var a =-3;var b =Lang.abs(a);//b=3min 范例:var a = -3var b = Lang.abs(a); var c = Lang.min(a.b);var d = Lang.min(45、76.3);//d=45(ingteger)var e = Lang.min(45、76.3);//e=45(ingteger)max程序:max(value1,value2)说明:回传值给予的两个数之间的较大值,回传的值于格式同所选数值的值与格式相同,其选取的方式如下:WML Script运算符数据格式的整数与浮点数转换法则可用来确认数据格式,以便执行比较的动作。参数:value1 =数字value2 =数字回传值:数字或invalid例外状况:无范例:var a =-3;var b =Lang.abs(a);//b=3var c = Lang.min(a.b);var d = Lang.min(45、76.3);//d=45(ingteger)var e = Lang.min(45、76.3);//e=45(float)parseInt程序:parseInt(value)说明:回传由字符串value所定义的整数值,合法的整数语法由WML Script数值字符串文法或是近值整数是字所界定,下列为额外的解析法则:第一个字符不是由+、-或十进制数字当开头的话,解译结束。结果:解析过的字符串回转换整数值。范例:var i =Lang.parseInt("1234"); // i=1234var j =Lang.parseInt("100 m/s"); // j=100parseFloat程序:parseFloat(value)说明:回传由字符串value所定义的浮点数值,合法的浮点数语法由WML Script数值字符串文法或是近值整数实字所界定,下列为额外的解析法则:第一个字符无法解析成浮点数表达式,解析结束。结束:解析过的字符串回转换成浮点数。参数:value=字符串回传值:浮点数或invalid例外状况:解析错误则传回invalid范例:var a =Lang.parseFloat("123.7 Hz"); // a=123.7var b =Lang.parseFloat("7.34e2 Hz"); // b=7.34e2var c =Lang.parseFloat("70.0e-2 F"); // c=70.0e-2var d =Lang.parseFloat("-1.c"); // d=0.1var e =Lang.parseFloat("100"); // e=100.0var f =Lang.parseFloat("Number:5.5"); // f=invalidvar g =Lang.parseFloat("7.3e meters"); // g=invalidvar h =Lang.parseFloat("7.3e- m/s"); // h=invalidisInt程序:isInt(value)说明:如果各预的值value能使用parseInt(value)转成整数则回传布尔值ture,否则传回false。参数:value=任意值回传值:布尔值或invalid例外状况:无范例:var a=Lang.inInt("-123"); //turevar a =Lang.minInt("123.33"); //turevar a =Lang.minInt("string"); //falsevar a =Lang.minInt("#123"); //falsevar a =Lang.minInt("invalid"); //invalidisFloat程序:isFloat(value)说明:如果各预的值value能使用parseInt(value)转成整数则回传布尔值ture,否则传回false。参数:value=任意值回传值:布尔值或invalid例外状况:无范例:var a=Lang.inInt("-123"); //turevar a =Lang.minInt("123.33"); //turevar a =Lang.minInt("string"); //falsevar a =Lang.minInt("#123"); //falsevar a =Lang.minInt("invalid"); //invalidmaxInt程序:maxInt()说明:传回最大的整数值。参数:无回传值:整数例外状况:无范例:var a =Lang.minInt();minInt程序:minInt()说明:传回最小的整数值参数:无回传值:整数-例外状况:无范例:var a =Lang.minInt();float程序:float()说明:如果有支持浮点数的话传回ture,没有的话传回false。参数:无回传值:布尔值例外状况:无范例:var floatsSupported = Lang.float();exit程序:exit(value)说明:结束WML Script位码的解译然后回到调用WML Script解译器者的控制,并回传指定值value,你可以使用这个程序来执行由一般程序的结束,而且WML Script位码的执行必须停止。参数:valre=任意值回传值:无,这个程序结束解译例外状况:无范例:Lang.exit("Value:" + myVal);//Returns a stringLang,exit(invalid);// Returns invalidabort程序:abort(errorDescription)说明:中止WML Script位码的解译然后回到调用WML Script解译器者的控制,并回传 errorDescription,你能使用这个程序执行不正常的中止,调用程序者检测到有严重错误,WML Script的执行并须中断。如果errorDescription的格式为invalid,字符串invalid用代替errorDescription的使用。参数:errorDescription =字符串回传值:无,这个程序结束解译例外状况:无范例:Lang.abort("Error:" + errVal); // Error value stringradndom程序:random(value)说明:回传一个正数的整数值,也就是说要大于或等于零,但必须要小于给定值value,回传值是由近是正常分布所随机选取的值。参数:value=整数回传值:整数或invalid例外状况:如果value等于0,则程序回传0如果value小于0,则程序回传invalid范例:var a =10;var b =Lang.random(5.1)*a;//b=0..50var c = Lang.random("string"); // c=invalidreed程序:seed(alue)说明:初始化需随机数字顺序并回传一个空字符串如果value为0或正整数,给予的value则用来初始化,反之则使用随机初始化的值。如果value为浮点数,则会先使用Float.int()来计算确切的整数值。参数:value=整数回传值:字符串或invalid]例外状况:无范例:var a =Lang.reed(123);// a=""var b =Lang.random(20); // b=0..20var c = Lang.seed("seed"); // c=invalid (random seed //left unchanged)characterSet程序:characterSet()说明:回传WML Script解译器所支持的字集,回传只是个整数用来记录由IANA所设定的MIB Enum值,这个只能表示所有的字集。参数:无回传值:整数例外状况:无范例:Var charset = Lang.characterSet(); //charset = 4 for latinl6.3 Float函数库名称:Float说明:这个函数库包含了典型与常用的浮点数算术程序。int程序:int(value)说明:回传给予值的整数部分。参数:value=数字回传值:整数或invalid例外状况:无范例:var a =3.14;var b =Float.in(a); //b=3var c =Float.in(-2.8); //c=-2floor程序:floor(value)说明:回传整数值,这个只要最接近给予值但不能大于它。如果value已经是个整数,其结果就是这个值本身。参数:value=数字回传值:整数或invalid例外状况:无范例:var a =3.14;var b =Float.in(a); //b=3var c =Float.in(-2.8); //c=-3ceil程序:ceil(value)说明:回传一个只要最接近给予值但不能小于它的整数值。如果value已经是个整数,其结果就是这个值本身。参数:value=数字回传值:整数或invalid例外状况:无范例:var a =3.14;var b =Float.in(a); //b=4var c =Float.in(-2.8); //c=-2pow程序:pow(x,y)说明:回传x的y次方值。如果x是负数,则y必须为正数。参数:x=数字   y=数字回传值:浮点数或invlid例外状况:如果x= =0而且 y&0,则回传invalid如果x&0而且y不是个整数,则回传invalid范例:var a =3var b =Float.pow(a,2); //b=9round程序:round(value)说明:传回最接近给予值的整数若两个整数值跟value接近的程序相等,则选择比较大的数。若value已经是个正数,其结果就是value本身。参数:value=数字回传值:整数或invalid例外状况:无范例:var a=Float.round(3.5); // a=4var b=Float.round(-3.5); //b=-3var c=Float.round(0.5); // c=1var d=Float.round(-0.5); //d=0squt程序:sqrt(value)说明:传回给予值value的平方根近似值。参数:value=浮点数回传值:浮点数或invalid例外状况:如果value负数,则回传invlid范例:var a=4;var b=Float.squt(a); //b=2.0var c=Float.squt(5); //c=2.maxFloat程序:maxFloat()说明:传回IEEE 754所支持的但准浮点数格式中最大的浮点数值。参数:无回传值:浮点数3.例外状况:无范例:var a=Float.maxFloat();minFloat程序:minFloat()说明:传回IEEE 754所支持的但准浮点数格式中最小的浮点数值。参数:无回传值:浮点数1.例外状况:无范例:var a=Float.minFloat();6.4 string函数库名称:字符串说明:这个函数库包含了字符串程序的集合,一个字符串可以是字符数组,每个字符都有个索引,字符串的第一个字浮的索引为0,字符串的长度是字符在数组中的数目。你能使用一些特殊的分隔符号来界定不同的字符串,这样你就能存取这些有分隔符号予元素索引所界定出的元素,字符串中第一个元素的索引值为0,每个字符串分隔符号回分隔出两个元素,但字符是不能用来做分隔符号。一个空格的字符可能是下列字符其中之一:TAB:水平跳格定位(horizontal tabulation)VT:垂直跳格定位(ertival tabulation)FF:跳页(from feed)SP:空格(space)LF:跳行(line feed)CR:归位(carriage return)length程序:length(string)说明:传回给予字符串的长度(字符的数目)。参数:string=字符串回传值:整数或invalid例外状况:无范例:var a="ABC";var b=string.length(a); //b=3var c=string.length(""); //c=0var d=string.length(342); //d=3is Empty程序:is Empty(string)说明:如果字符串长度为零则传回布尔值true,反之传回false。参数:string=字符串回传值:布尔值或invalid例外状况:无范例:var a="Hvar b="";var c=sting.isEmpty(a); //c=falsevar c=sting.isEmpty(b); //d=ture var c=sting.isEmpty(ture); //e=false charAt程序:charAt(sting.index)说明:回传string中index值所指定的字符。参数:string=字符数index=数字(回传回index所指定的字符)回传值:字符串或invalid例外状况:如果index的值超过字符串的范围,则回传空字符串("")范例:var 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=invalidsubString程序:subString(string,startIndex,length)说明:传回一个新的字符串来代替所给予的字符串, 这个新字符串给定的索引值开始,它的长度有所给予的length决定。如果startIndex小于0,则会0来当作索引值。如果length大于剩余字符的数目,则lenght会由剩余的字符数来代替。如果startIndex予lenght是浮点数,则会先使用Float.int()来计算正确的整数值。参数:string=字符数startIndex=数字lenght=数字回传值:字符串或invalid例外状况:如果startIndex大于最后的索引值,则回传会空字符串("")如果lenght&=0,传会空字符串("")范例:var a="ABCD";var b=String.subString(a,1,2); //b="BC"var c=String.subString(a,2,5); //c="CD"var d=String.subString(); //d="12"find程序:find(string,substring)说明:传会所要寻找的字符串substring和原始字符串string相符的第一个字符的索引值。如果没有相符,则传会整数值-1。两个字符传如果是相等的话,是定义为不符合。参数:string=字符串 substring=字符串回传值:整数

我要回帖

更多关于 我的世界怎么tp坐标 的文章

 

随机推荐