<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
  <channel>
    <title>狼不吃羊</title>
    <description></description>
    <link>http://langbuchiyang.javaeye.com</link>
    <language>UTF-8</language>
    <copyright>Copyright 2003-2008, JavaEye.com</copyright>
    <docs>http://blogs.law.harvard.edu/tech/rss</docs>
    <generator>JavaEye - 做最棒的软件开发交流社区</generator>
      <item>
        <title>tomcat安装配置</title>
        <author>狼不吃羊</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://langbuchiyang.javaeye.com">狼不吃羊</a>&nbsp;
          链接：<a href="http://langbuchiyang.javaeye.com/blog/125534" style="color:red;">http://langbuchiyang.javaeye.com/blog/125534</a>&nbsp;
          发表时间: 2007年09月20日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          首先要安装JDK，下载后假定装到c:\jdk<br />
　　<br />
　　然后安装tomcat5.0假设安装到c:\tomcat<br />
　　<br />
　　下面设置环境变量:<br />
　　点击&ldquo;我的电脑&rdquo;-&ldquo;属性&rdquo;-&ldquo;高级&rdquo;-&ldquo;环境变量&rdquo;-&ldquo;新建&rdquo;<br />
　　<br />
　　名称输入：path 值输入：C:\jdk\bin;.;<br />
　　<br />
　　依次添加其它变量，其名称和值分别为：<br />
　　<br />
　　CLASSPATH=c:\jdk\lib\dt.jar;c:\jdk\lib\tools.jar;<br />
　　JAVA_HOME=c:\jdk;<br />
　　TOMCAT_HOME=c:\tomcat;<br />
　　<br />
　　到c:\tomcat\bin下，双击startup.bat启动tomcat,<br />
　　<br />
　　打开IE，输入http://localhost:8080<br />
　　<br />
　　怎么样，期待以久的小猫出现了吧，这说明你的tomcat已经配置成功了。<br />
　　<br />
　　不过目前我们只能通过IP在外网访问，很不方便，下面说说怎样绑定域名：<br />
　　<br />
　　进入c:\tomcat\conf下<br />
　　<br />
　　打开server.xml<br />
　　<br />
　　将&lt;Connector port=&quot;8080&quot;改为&lt;Connector port=&quot;80&quot;因为WEB中默认打开的是80端口<br />
　　<br />
　　找到&lt;Host name=&quot;localhost&quot; 一项，将其改为&lt;Host name=&quot;www.***.com&quot;<br />
　　<br />
　　然后再进入C:\tomcat\conf\catalina\下<br />
　　<br />
　　将目录localhost改名为www.***.com<br />
　　<br />
　　OK，然后重启tomcat<br />
　　<br />
　　输入你的域名：www.***.com怎么样&gt;？OK了吧。<br />
　　<br />
　　下面给你介绍个小技巧，就是tomcat的WEB后台管理，相信不少人都用过它，确实要比手写server.xml方便多了。<br />
　　<br />
　　打开C:\tomcat\conf\tomcat-users.xml<br />
　　<br />
　　在&lt;/tomcat-users&gt;前加入这么一段：<br />
　　&lt;user username=&quot;123&quot; password=&quot;123&quot; roles=&quot;admin,manager,tomcat&quot;/&gt;<br />
　　<br />
　　这样我们增加了123这个用户，它的密码也是123，并且它同时具有了admin,manager,tomcat的角色权限。
          <br/>
          <span style="color:red;">
            <a href="http://langbuchiyang.javaeye.com/blog/125534#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 20 Sep 2007 02:13:19 +0800</pubDate>
        <link>http://langbuchiyang.javaeye.com/blog/125534</link>
        <guid>http://langbuchiyang.javaeye.com/blog/125534</guid>
      </item>
      <item>
        <title>prototype</title>
        <author>狼不吃羊</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://langbuchiyang.javaeye.com">狼不吃羊</a>&nbsp;
          链接：<a href="http://langbuchiyang.javaeye.com/blog/125526" style="color:red;">http://langbuchiyang.javaeye.com/blog/125526</a>&nbsp;
          发表时间: 2007年09月20日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <h3>转载，收藏，学习参考</h3>
<h3>&nbsp;</h3>
<h3>prototype.js是什么?</h3>
<p>万一你没有使用过大名鼎鼎的prototype.js，那么让我来告诉你，<a href="http://prototype.conio.net/">prototype.js</a>是由<a href="http://www.conio.net/">Sam Stephenson</a>写的一个javascript类库。这个构思奇妙，而且兼容标准的类库，能帮助你轻松建立有高度互动的web2.0特性的富客户端页面。</p>
<p>如果你最近尝试使用它，你大概了解到文档并不是作者的一个强项。和在我以前使用这个类库的不少开发者一样，一开始，我不得不一头扎进阅读prototype.js的源代码和实验它的功能中。我想，在我学习完它之后，把我学到的东西分享给大家是件不错的事。 </p>
<p>同时，在本文中，我也将提供一个关于这个类库提供的objects,classes,functions,extensions这对东东的<a href="http://www.cnblogs.com/thinhunan/archive/2006/04/01/developernotesforprototype.html#Reference">非官方参考</a></p>
<p>在阅读这个文档时，熟悉Ruby的开发者将会注意到Ruby的一些内建类和本类库扩展实现之间非常相似。 </p>
<h3>相关文章</h3>
<p>Advanced <a href="http://www.sergiopereira.com/articles/advjs.html">JavaScript guide</a>. </p>
<!-- ************************************************************************************************************************************* -->
<h3>一些实用的函数</h3>
<p>这个类库带有很多预定义的对象和实用函数，这些东东的目的显然是把你从一些重复的打字中解放出来 。 </p>
<!-- ------------------------------------------------------------------------------------------- -->
<h4>使用$()方法</h4>
<p>$() 方法是在DOM中使用过于频繁的 document.getElementById() 方法的一个便利的简写，就像这个DOM方法一样，这个方法返回参数传入的id的那个元素。</p>
<p>比起DOM中的方法，这个更胜一筹。你可以传入多个id作为参数然后 $() 返回一个带有所有要求的元素的一个 Array 对象。</p>
<pre class="programlisting">&lt;HTML&gt;
&lt;HEAD&gt;
&lt;TITLE&gt; Test Page &lt;/TITLE&gt;
&lt;script src=&quot;prototype-1.3.1.js&quot;&gt;&lt;/script&gt;
&lt;script&gt;
function test1()
{
var d = $('myDiv');
alert(d.innerHTML);
}
function test2()
{
var divs = $('myDiv','myOtherDiv');
for(i=0; i&lt;divs.length; i++)
{
alert(divs[i].innerHTML);
}
}
&lt;/script&gt;
&lt;/HEAD&gt;
&lt;BODY&gt;
&lt;div id=&quot;myDiv&quot;&gt;
&lt;p&gt;This is a paragraph&lt;/p&gt;
&lt;/div&gt;
&lt;div id=&quot;myOtherDiv&quot;&gt;
&lt;p&gt;This is another paragraph&lt;/p&gt;
&lt;/div&gt;
&lt;input type=&quot;button&quot; value=Test1 onclick=&quot;test1();&quot;&gt;&lt;br&gt;
&lt;input type=&quot;button&quot; value=Test2 onclick=&quot;test2();&quot;&gt;&lt;br&gt;
&lt;/BODY&gt;
&lt;/HTML&gt;</pre>
<p>另外一个好处是，这个函数能传入用string表示的对象ID，也可以传入对象本身，这样，在建立其它能传两种类型的参数的函数时非常有用。</p>
<!-- ------------------------------------------------------------------------------------------- -->
<h4>使用$F()函数</h4>
<p>$F()函数是另一个大收欢迎的&ldquo;快捷键&rdquo;，它能用于返回任何表单输入控件的值，比如text box,drop-down list。这个方法也能用元素id或元素本身做为参数。 </p>
<pre class="code">&lt;script&gt;
function test3()
{
alert(  <span class="highlite">$F('userName')</span>  );
}
&lt;/script&gt;
&lt;input type=&quot;text&quot; id=&quot;userName&quot; value=&quot;Joe Doe&quot;&gt;&lt;br&gt;
&lt;input type=&quot;button&quot; value=Test3 onclick=&quot;test3();&quot;&gt;&lt;br&gt;
<!-- ------------------------------------------------------------------------------------------- --></pre>
<h4>使用<span class="functionName">$A()</span>函数</h4>
<p>$A()函数能把它接收到的单个的参数转换成一个Array对象。</p>
<p>这个方法，结合被本类库扩展了的Array类，能方便的把任何的可枚举列表转换成或拷贝到一个Array对象。一个推荐的用法就是把DOM Node Lists转换成一个普通的Array对象，从而更有效率的进行遍历，请看下面的例子。</p>
<pre class="code">&lt;script&gt;
function showOptions(){
var someNodeList = $('lstEmployees').getElementsByTagName('option');
var nodes = $A(someNodeList);
nodes.each(function(node){
alert(node.nodeName + ': ' + node.innerHTML);
});
}
&lt;/script&gt;
&lt;select id=&quot;lstEmployees&quot; size=&quot;10&quot; &gt;
&lt;option value=&quot;5&quot;&gt;Buchanan, Steven&lt;/option&gt;
&lt;option value=&quot;8&quot;&gt;Callahan, Laura&lt;/option&gt;
&lt;option value=&quot;1&quot;&gt;Davolio, Nancy&lt;/option&gt;
&lt;/select&gt;
&lt;input type=&quot;button&quot; value=&quot;Show the options&quot; onclick=&quot;showOptions();&quot; &gt;
</pre>
<p><!-- ------------------------------------------------------------------------------------------- --></p>
<h4>使用&nbsp;<span class="functionName">$H()</span> 函数</h4>
<p>$H()函数把一些对象转换成一个可枚举的和联合数组类似的Hash对象。</p>
<pre class="code">&lt;script&gt;
function testHash()
{
//let's create the object
var a = {
first: 10,
second: 20,
third: 30
};
//now transform it into a hash
var h = <span class="highlite">$H(a)</span>;
alert(h.toQueryString()); //displays: first=10&amp;second=20&amp;third=30
}
&lt;/script&gt;
</pre>
<p><!-- ------------------------------------------------------------------------------------------- --></p>
<h4>使用<span class="functionName">$R()</span>函数</h4>
<p>$R()是new ObjectRange(lowBound,upperBound,excludeBounds)的缩写。</p>
<p>跳到<a href="http://www.cnblogs.com/thinhunan/archive/2006/04/01/developernotesforprototype.html#Reference.ObjectRange">ObjectRange</a> 类文档可以看到一个关于此类的完整描述. 此时，我们还是先来看一个例子以展示这个缩写能代替哪些方法吧。其它相关的一些知识可以在<a href="http://www.cnblogs.com/thinhunan/archive/2006/04/01/developernotesforprototype.html#Reference.Enumerable">Enumerable</a> 对象文档中找到。</p>
<pre class="code">&lt;script&gt;
function demoDollar_R(){
var range = <span class="highlite">$R(10, 20, false)</span>;
range.each(function(value, index){
alert(value);
});
}
&lt;/script&gt;
&lt;input type=&quot;button&quot; value=&quot;Sample Count&quot; onclick=&quot;demoDollar_R();&quot; &gt;
</pre>
<p><!-- ------------------------------------------------------------------------------------------- --></p>
<h4>使用<span class="functionName">Try.these()</span>函数</h4>
<p><tt class="literal">Try.these()</tt> 方法使得实现当你想调用不同的方法直到其中的一个成功正常的这种需求变得非常容易， 他把一系列的方法作为参数并且按顺序的一个一个的执行这些方法直到其中的一个成功执行，返回成功执行的那个方法的返回值。</p>
<p>在下面的例子中， <tt class="literal">xmlNode.text</tt>在一些浏览器中好用，但是<tt class="literal">xmlNode.textContent</tt>在另一些浏览器中正常工作。 使用<tt class="literal">Try.these()</tt>方法我们可以得到正常工作的那个方法的返回值。</p>
<p>&lt;script&gt;<br />
function getXmlNodeValue(xmlNode){<br />
&nbsp;&nbsp;&nbsp; return Try.these(<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; function() {return xmlNode.text;},<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; function() {return xmlNode.textContent;)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; );<br />
}<br />
&lt;/script&gt;<br />
&nbsp;&nbsp; </p>
<p><!-- ************************************************************************************************************************************* --></p>
<h3><span class="objectClass">Ajax</span>对象</h3>
<p>上面提到的共通方法非常好，但是面对它吧，它们不是最高级的那类东西。它们是吗？你很可能自己编写了这些甚至在你的脚本里面有类似功能的方法。但是这些方法只是冰山一角。</p>
<p>我很肯定你对prototype.js感兴趣的原因很可能是由于它的AJAX能力。所以让我们解释当你需要完成AJAX逻辑的时候，这个包如何让它更容易。</p>
<p><tt class="literal">Ajax</tt> 对象是一个预定义对象，由这个包创建，为了封装和简化编写<a href="http://en.wikipedia.org/wiki/Ajax_%28programming%29" target="_top">AJAX</a> 功能涉及的狡猾的代码。 这个对象包含一系列的封装AJAX逻辑的类。我们来看看其中几个类。<!-- ------------------------------------------------------------------------------------------- --> </p>
<h4>使用<span class="objectClass">Ajax.Request</span>类</h4>
<p>如果你不使用任何的帮助程序包，你很可能编写了整个大量的代码来创建<tt class="literal">XMLHttpRequest</tt>对象并且异步的跟踪它的进程， 然后解析出响应 然后处理它。当你不需要支持多于一种类型的浏览器时你会感到非常的幸运。</p>
<p>为了支持 AJAX 功能。这个包定义了 <tt class="literal">Ajax.Request </tt>类。</p>
<p>假如你有一个应用程序可以通过url <span class="emphasis"><em>http://yoursever/app/get_sales?empID=1234&amp;year=1998</em></span>与服务器通信。它返回下面这样的XML 响应。</p>
<pre class="code">&lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot; ?&gt;
&lt;ajax-response&gt;
&lt;response type=&quot;object&quot; id=&quot;productDetails&quot;&gt;
&lt;monthly-sales&gt;
&lt;employee-sales&gt;
&lt;employee-id&gt;1234&lt;/employee-id&gt;
&lt;year-month&gt;1998-01&lt;/year-month&gt;
&lt;sales&gt;$8,115.36&lt;/sales&gt;
&lt;/employee-sales&gt;
&lt;employee-sales&gt;
&lt;employee-id&gt;1234&lt;/employee-id&gt;
&lt;year-month&gt;1998-02&lt;/year-month&gt;
&lt;sales&gt;$11,147.51&lt;/sales&gt;
&lt;/employee-sales&gt;
&lt;/monthly-sales&gt;
&lt;/response&gt;
&lt;/ajax-response&gt;
</pre>
<p>用 <tt class="literal">Ajax.Request</tt>对象和服务器通信并且得到这段XML是非常简单的。下面的例子演示了它是如何完成的。</p>
<pre class="code">&lt;script&gt;
function searchSales()
{
var empID = $F('lstEmployees');
var y = $F('lstYears');
var url = 'http://yoursever/app/get_sales';
var pars = 'empID=' + empID + '&amp;year=' + y;
<div class="highlite">
var myAjax = new Ajax.Request(
url,
{
method: 'get',
parameters: pars,
onComplete: showResponse
});
</div>
}
function showResponse(originalRequest)
{
//put returned XML in the textarea
$('result').value = originalRequest.responseText;
}
&lt;/script&gt;
&lt;select id=&quot;lstEmployees&quot; size=&quot;10&quot; onchange=&quot;searchSales()&quot;&gt;
&lt;option value=&quot;5&quot;&gt;Buchanan, Steven&lt;/option&gt;
&lt;option value=&quot;8&quot;&gt;Callahan, Laura&lt;/option&gt;
&lt;option value=&quot;1&quot;&gt;Davolio, Nancy&lt;/option&gt;
&lt;/select&gt;
&lt;select id=&quot;lstYears&quot; size=&quot;3&quot; onchange=&quot;searchSales()&quot;&gt;
&lt;option selected=&quot;selected&quot; value=&quot;1996&quot;&gt;1996&lt;/option&gt;
&lt;option value=&quot;1997&quot;&gt;1997&lt;/option&gt;
&lt;option value=&quot;1998&quot;&gt;1998&lt;/option&gt;
&lt;/select&gt;
&lt;br&gt;&lt;textarea id=result cols=60 rows=10 &gt;&lt;/textarea&gt;
</pre>
<p>你注意到传入 <tt class="literal">Ajax.Request</tt>构造方法的第二个对象了吗？ 参数<tt class="literal">{method: 'get', parameters: pars, onComplete: showResponse}</tt> 表示一个匿名对象的真实写法。他表示你传入的这个对象有一个名为 <tt class="literal">method</tt> 值为 <tt class="literal">'get'的属性，</tt>另一个属性名为 <tt class="literal">parameters</tt> 包含HTTP请求的查询字符串，和一个<tt class="literal">onComplete</tt> 属性/方法包含函数<tt class="literal">showResponse</tt>。 </p>
<p>还有一些其它的属性可以在这个对象里面定义和设置，如 <tt class="literal">asynchronous</tt>，可以为<tt class="literal">true</tt> 或 <tt class="literal">false</tt> 来决定AJAX对服务器的调用是否是异步的（默认值是 <tt class="literal">true</tt>）。</p>
<p>这个参数定义AJAX调用的选项。在我们的例子中，在第一个参数通过HTTP GET命令请求那个url，传入了变量 <tt class="literal">pars</tt>包含的查询字符串， <tt class="literal">Ajax.Request </tt>对象在它完成接收响应的时候将调用<tt class="literal">showResponse</tt> 方法。</p>
<p>也许你知道， <tt class="literal">XMLHttpRequest</tt>在HTTP请求期间将报告进度情况。这个进度被描述为四个不同阶段：<span class="emphasis"><em>Loading</em></span>, <span class="emphasis"><em>Loaded</em></span>, <span class="emphasis"><em>Interactive</em></span>, 或 <span class="emphasis"><em>Complete</em></span>。你可以使 <tt class="literal">Ajax.Request</tt> 对象在任何阶段调用自定义方法 ，<span class="emphasis"><em>Complete</em></span> 是最常用的一个。想调用自定义的方法只需要简单的在请求的选项参数中的名为 <tt class="literal">onXXXXX</tt> 属性/方法中提供自定义的方法对象。 就像我们例子中的 <tt class="literal">onComplete</tt> 。你传入的方法将会被用一个参数调用，这个参数是 <tt class="literal">XMLHttpRequest</tt> 对象自己。你将会用这个对象去得到返回的数据并且或许检查包含有在这次调用中的HTTP结果代码的 <tt class="literal">status</tt> 属性。</p>
<p>还有另外两个有用的选项用来处理结果。我们可以在<tt class="literal">onSuccess</tt> 选项处传入一个方法，当AJAX无误的执行完后调用， 相反的，也可以在<tt class="literal">onFailure</tt>选项处传入一个方法，当服务器端出现错误时调用。正如<tt class="literal">onXXXXX</tt> 选项传入的方法一样，这两个在被调用的时候也传入一个带有AJAX请求的<tt class="literal">XMLHttpRequest对象。</tt></p>
<p>我们的例子没有用任何有趣的方式处理这个 XML响应， 我们只是把这段XML放进了一个文本域里面。对这个响应的一个典型的应用很可能就是找到其中的想要的信息，然后更新页面中的某些元素， 或者甚至可能做某些XSLT转换而在页面中产生一些HTML。</p>
<p>&nbsp;在1.4.0版本中，一种新的事件回传外理被引入。如果你有一段代码总是要为一个特殊的事件执行，而不管是哪个AJAX调用引发它，那么你可以使用新的<a href="http://www.cnblogs.com/thinhunan/archive/2006/04/01/developernotesforprototype.html#Ajax.Responders">Ajax.Responders</a>对象。</p>
<p>假设你想要在一个AJAX调用正在运行时，显示一些提示效果，像一个不断转动的图标之类的，你可以使用两个全局事件Handler来做到，其中一个在第一个调用开始时显示图标，另一个在最后一个调用完成时隐藏图标。看下面的例子。</p>
<pre class="code">&lt;script&gt;
var myGlobalHandlers = {
onCreate: function(){
Element.show('systemWorking');
},
onComplete: function() {
if(Ajax.activeRequestCount == 0){
Element.hide('systemWorking');
}
}
};
<span class="highlite">Ajax.Responders.register(myGlobalHandlers);</span>
&lt;/script&gt;
&lt;div id='systemWorking'&gt;&lt;img src='spinner.gif'&gt;Loading...&lt;/div&gt;
</pre>
<p>更完全的解释，请参照 <a href="http://www.cnblogs.com/thinhunan/archive/2006/04/01/developernotesforprototype.html#ajax_request_reference" title="4.14. Ajax.Request 类">Ajax.Request 参考</a> 和 <a href="http://www.cnblogs.com/thinhunan/archive/2006/04/01/developernotesforprototype.html#options_reference" title="4.15. options 参数对象">Ajax选项参考</a>。</p>
<p><!-- ------------------------------------------------------------------------------------------- --></p>
<h4>使用<span class="objectClass">Ajax.Updater</span>类</h4>
<p>如果你的服务器的另一端返回的信息已经是HTML了，那么使用这个程序包中 <tt class="literal">Ajax.Updater</tt> 类将使你的生活变得更加得容易。用它你只需提供哪一个元素需要被AJAX请求返回的HTML填充就可以了，例子比我写说明的更清楚。&nbsp;</p>
<pre class="code">&lt;script&gt;
function getHTML()
{
var url = 'http://yourserver/app/getSomeHTML';
var pars = 'someParameter=ABC';
<div class="highlite">
var myAjax = new Ajax.Updater(
'placeholder',
url,
{
method: 'get',
parameters: pars
});
</div>
}
&lt;/script&gt;
&lt;input type=button value=GetHtml onclick=&quot;getHTML()&quot;&gt;
&lt;div id=&quot;placeholder&quot;&gt;&lt;/div&gt;
</pre>
<p>你可以看到，这段代码比前面的例子更加简洁，不包括 <tt class="literal">onComplete</tt> 方法，但是在构造方法中传入了一个元素id。 我们来稍稍修改一下代码来描述如何在客户端处理服务器段错误成为可能。</p>
<p>我们将加入更多的选项， 指定处理错误的一个方法。这个是用 <tt class="literal">onFailure</tt> 选项来完成的。我们也指定了一个 <tt class="literal">placeholder</tt> 只有在成功请求之后才会被填充。为了完成这个目的我们修改了第一个参数从一个简单的元素id到一个带有两个属性的对象， <tt class="literal">success</tt> (一切OK的时候被用到) 和 <tt class="literal">failure</tt> (有地方出问题的时候被用到) 在下面的例子中没有用到<tt class="literal">failure</tt>属性，而仅仅在 <tt class="literal">onFailure</tt> 处使用了 <tt class="literal">reportError</tt> 方法。</p>
<p>&lt;script&gt;<br />
function getHTML()<br />
{<br />
var url = 'http://yourserver/app/getSomeHTML';<br />
var pars = 'someParameter=ABC';<br />
</p>
<pre class="code"><div class="highlite">
var myAjax = new Ajax.Updater(
{success: 'placeholder'},
url,
{
method: 'get',
parameters: pars,
onFailure: reportError
});
</div>
}
function reportError(request)
{
alert('Sorry. There was an error.');
}
&lt;/script&gt;
&lt;input type=button value=GetHtml onclick=&quot;getHTML()&quot;&gt;
&lt;div id=&quot;placeholder&quot;&gt;&lt;/div&gt;
</pre>
<p>如果你的服务器逻辑是连同HTML 标记返回JavaScript 代码， <tt class="literal">Ajax.Updater</tt>对象可以执行那段JavaScript代码。为了使这个对象对待响应为JavaScript，你只需在最后参数的对象构造方法中简单加入<tt class="literal">evalScripts: true</tt>属性。但是值得提醒的是，像这个选项名evalScripts暗示的，这些脚本会被执行，但是它们不会被加入到Page的脚本中。&ldquo;有什么区别？&rdquo;，可能你会这样问。我们假定请求地址返回的东东像这样：</p>
<pre class="code">&lt;script language=&quot;javascript&quot; type=&quot;text/javascript&quot;&gt;
function sayHi(){
alert('Hi');
}
&lt;/script&gt;
&lt;input type=button value=&quot;Click Me&quot; onclick=&quot;sayHi()&quot;&gt;
</pre>
<p>如果你以前这样尝试过，你知道这些脚本不会如你所期望的那样工作，原因是这段脚本会被执行，但像上面这样的脚本执行并不会创建一个名叫sayHi的函数，它什么也不做。如果要创建一个函数，我们应当把代码改成下面这个样子：</p>
<pre class="code">&lt;script language=&quot;javascript&quot; type=&quot;text/javascript&quot;&gt;
<div class="highlite">sayHi = function(){
alert('Hi');
};</div>
&lt;/script&gt;
&lt;input type=button value=&quot;Click Me&quot; onclick=&quot;sayHi()&quot;&gt;
</pre>
<p>为什么我们在上面的代码中不使用var关键字来声明这个变量呢（指sayHi&nbsp;），因为那样做创建出来的函数将只是当前脚本块的一个局部变量（至少在IE中是这样）。不写var关键字，创建出来的对象的作用域就是我们所期望的window。</p>
<p>更多相关知识，请参看&nbsp; <a href="http://www.cnblogs.com/thinhunan/archive/2006/04/01/developernotesforprototype.html#Ajax.Updater">Ajax.Updater reference</a> 和<a href="http://www.cnblogs.com/thinhunan/archive/2006/04/01/developernotesforprototype.html#Ajax.options">options reference</a>. </p>
<h3>枚举... 噢!噢!</h3>
<p>你知道，我们都是这样来做循环的，建一个Array，用elements组织它们，再建一个循环结构（例如for,foreach,while)通过index数字来访问每一个element，再用这个element做一些动作。 </p>
<p>当你想到这时，你会发现几乎每次写循环代码你都会迟早用到一个Array。那么，如果Array对象能够提供更多的功能给它们的迭代器使用不是很爽吗？确实是这样，事实上很多的编程语言都在它们的Array或其它类似的结构中（如Collections,Lists）提供一些这样的功能。 </p>
<p>现在好了，prototype.js了给我们一个 <a href="http://www.cnblogs.com/thinhunan/archive/2006/04/01/developernotesforprototype.html#Reference.Enumerable" class="code">Enumerable</a>对象，它实现了很多和可迭代数据进行交互的窍门。和原有的JS对象相比prototype.js更上一层楼，它对<a href="http://www.cnblogs.com/thinhunan/archive/2006/04/01/developernotesforprototype.html#Reference.Array"><span class="code">Array</span> 类s</a>扩展了所有枚举要用的函数。 </p>
<h4>循环, Ruby样式的</h4>
<p>在标准的javascript中，如果你想把一个array中的所有elements显示出来，你可以像下面代码这样写得很好： </p>
<pre class="code">&lt;script&gt;
function showList(){
var simpsons = ['Homer', 'Marge', 'Lisa', 'Bart', 'Meg'];
<div class="highlite">            for(i=0;i&lt;simpsons.length;i++){
alert(simpsons[i]);
}</div>
}
&lt;/script&gt;
&lt;input type=&quot;button&quot; value=&quot;Show List&quot; onclick=&quot;showList();&quot; &gt;
</pre>
<p>使用我们新的最好的朋友，prototype.js，我们可以把它生写成这样 </p>
<pre class="code">      function showList(){
var simpsons = ['Homer', 'Marge', 'Lisa', 'Bart', 'Meg'];
<div class="highlite">            simpsons.each( function(familyMember){
alert(familyMember);
});</div>
}
</pre>
<p>你可能会想&ldquo;非常奇怪的方式...相对旧的，这种语法太怪异了&rdquo;。哦，在上面的例子，确实什么也没有，在这个简单得要死例子中，也没有改变太多啊，尽管如此，请继续读下去。 </p>
<p>在继续下面内容之前，你注意到那个被做为一个参数传递给each函数的函数？我们把它理解成迭代器函数。 </p>
<h4>Your arrays on steroids</h4>
<p>就如我们上面提到的，把你的Array中的elements当成相同的类型使用相同的属性和函数是很通用(Common,不知该翻译成通用还是庸俗)的。让我们看看怎么样利用我们新的马力强劲的Arrays的迭代功能吧。 </p>
<p>依照标准找到一个element。 </p>
<p>&nbsp;</p>
<pre class="code">&lt;script&gt;
function findEmployeeById(emp_id){
var listBox = $('lstEmployees')
var options = listBox.getElementsByTagName('option');
options = $A(options);
var opt = options.<span class="highlite">find</span>( <strong>function(employee){
return <span class="highlite">(employee.value == emp_id)</span>;
}</strong>);
alert(opt.innerHTML); //displays the employee name
}
&lt;/script&gt;
&lt;select id=&quot;lstEmployees&quot; size=&quot;10&quot; &gt;
&lt;option value=&quot;5&quot;&gt;Buchanan, Steven&lt;/option&gt;
&lt;option value=&quot;8&quot;&gt;Callahan, Laura&lt;/option&gt;
&lt;option value=&quot;1&quot;&gt;Davolio, Nancy&lt;/option&gt;
&lt;/select&gt;
&lt;input type=&quot;button&quot; value=&quot;Find Laura&quot; onclick=&quot;findEmployeeById(8);&quot; &gt;
</pre>
<p>现在我们再下一城，看看如何过滤一个Array中的元素，从每个元素中得到我们想要的成员。 </p>
<p>&nbsp;</p>
<pre class="code">&lt;script&gt;
function showLocalLinks(paragraph){
paragraph = $(paragraph);
var links = $A(paragraph.getElementsByTagName('a'));
//find links that do not start with 'http'
var localLinks = links.<span class="highlite">findAll</span>( function(link){
var start = link.href.substring(0,4);
return start !='http';
});
//now the link texts
var texts = localLinks.<span class="highlite">pluck('innerHTML')</span>;
//get them in a single string
var result = texts.<span class="highlite">inspect()</span>;
alert(result);
}
&lt;/script&gt;
&lt;p id=&quot;someText&quot;&gt;
This &lt;a href=&quot;http://othersite.com/page.html&quot;&gt;text&lt;/a&gt; has
a &lt;a href=&quot;#localAnchor&quot;&gt;lot&lt;/a&gt; of
&lt;a href=&quot;#otherAnchor&quot;&gt;links&lt;/a&gt;. Some are
&lt;a href=&quot;http://wherever.com/page.html&quot;&gt;external&lt;/a&gt;
and some are &lt;a href=&quot;#someAnchor&quot;&gt;local&lt;/a&gt;
&lt;/p&gt;
&lt;input type=button value=&quot;Find Local Links&quot; onclick=&quot;showLocalLinks('someText')&quot;&gt;
</pre>
<p>上面的代码仅仅是一点小小的实践让人爱上这种语法。请参看 <a href="http://www.cnblogs.com/thinhunan/archive/2006/04/01/developernotesforprototype.html#Reference.Enumerable" class="code">Enumerable</a>和<a href="http://www.cnblogs.com/thinhunan/archive/2006/04/01/developernotesforprototype.html#Reference.Array" class="code">Array</a>的所有函数 </p>
<p><!-- ************************************************************************************************************************************* --></p>
<hr />
<p><a name="Reference"></a>&nbsp;</p>
<h3>prototype.js参考</h3>
<p><!-- ------------------------------------------------------------------------------------------- --></p>
<h4>JavaScript类扩展</h4>
<p>prototype.js 类库实现强大功能的一种途径是扩展已有的JavaScript 类。 </p>
<p><!-- ------------------------------------------------------------------------------------------- --></p>
<h4>对 <span class="code">Object的扩展</span></h4>
<p>
<table class="reference" cellspacing="0" border="1" id="Table1">
    <tbody>
        <tr>
            <th>Method</th>
            <th>Kind</th>
            <th>Arguments</th>
            <th>Description</th>
        </tr>
        <tr>
            <td>extend(destination, source)</td>
            <td><nobr>static</nobr></td>
            <td>destination: any object, source: any object</td>
            <td class="refDescription">提供一种通过拷贝所有源以象属性和函数到目标函数实现继承的方法</td>
        </tr>
        <tr>
            <td>inspect(targetObj)</td>
            <td>static</td>
            <td>targetObj: any object</td>
            <td class="refDescription">返回可读性好关于目标对象的文字描述，如果对象实例没有定义一个inspect函数，默认返回toString函数的值。</td>
        </tr>
    </tbody>
</table>
</p>
<p><!-- ------------------------------------------------------------------------------------------- --></p>
<h4><span class="code">对Number的扩展</span></h4>
<p>
<table class="reference" cellspacing="0" border="1" id="Table2">
    <tbody>
        <tr>
            <th>Method</th>
            <th><nobr>Kind</nobr></th>
            <th>Arguments</th>
            <th>Description</th>
        </tr>
        <tr>
            <td>toColorPart()</td>
            <td><nobr>instance</nobr></td>
            <td>(none)</td>
            <td class="refDescription">返回数字的十六进制表示形式。在把一个RGB数字转换成HTML表现形式时很有用。</td>
        </tr>
        <tr>
            <td>succ()</td>
            <td>instance</td>
            <td>(none)</td>
            <td class="refDescription">&nbsp;返回下一个数字，这个方法可用于迭代调用场景中。 </td>
        </tr>
        <tr>
            <td>times(iterator)</td>
            <td>instance</td>
            <td>iterator: a function object conforming to Function(index)</td>
            <td class="refDescription">Calls the <span class="code">iterator</span> function repeatedly passing the current index in the <span class="code">index</span> argument. 反复调用iterator函数并传递当前index到iterator的index参数。 </td>
        </tr>
    </tbody>
</table>
</p>
<p>下面的例子用提示框显示0-9。 </p>
<pre class="code">&lt;script&gt;
function demoTimes(){
var n = 10;
n.times(function(index){
alert(index);
});
/***************************
* you could have also used:
*           (10).times( .... );
***************************/
}
&lt;/script&gt;
&lt;input type=button value=&quot;Test Number.times()&quot; onclick=&quot;demoTimes()&quot;&gt;
</pre>
<p><!-- ------------------------------------------------------------------------------------------- --></p>
<h4>对 <span class="code">Function扩展</span></h4>
<p>
<table class="reference" cellspacing="0" border="1" id="Table3">
    <tbody>
        <tr>
            <th>Method</th>
            <th>Kind</th>
            <th>Arguments</th>
            <th>Description</th>
        </tr>
        <tr>
            <td>bind(object)</td>
            <td><nobr>instance</nobr></td>
            <td>object: the object that owns the method</td>
            <td class="refDescription">返回function的实例，这个实例和源function的结构一样，但是它已被绑定给了参数中提供的object，就是说，function中的this指针指向参数object。</td>
        </tr>
        <tr>
            <td>bindAsEventListener(object)</td>
            <td>instance</td>
            <td>object: the object that owns the method</td>
            <td class="refDescription">用法和上面的bind一样，区别在于用来绑定事件。</td>
        </tr>
    </tbody>
</table>
</p>
<p>让我们看看如何运用这些扩展。 </p>
<pre class="code">&lt;input type=checkbox id=myChk value=1&gt; Test?
&lt;script&gt;
//declaring the class
var CheckboxWatcher = Class.create();
//defining the rest of the class implementation
CheckboxWatcher.prototype = {
initialize: function(chkBox, message) {
this.chkBox = $(chkBox);
this.message = message;
//assigning our method to the event
<div class="highlite">
this.chkBox.onclick =
this.showMessage.bindAsEventListener(this);
</div>
},
showMessage: function(evt) {
alert(this.message + ' (' + evt.type + ')');
}
};
var watcher = new CheckboxWatcher('myChk', 'Changed');
&lt;/script&gt;
</pre>
<p><!-- ------------------------------------------------------------------------------------------- --></p>
<h4><span class="code">对String的扩展</span></h4>
<p>
<table class="reference" cellspacing="0" border="1" id="Table4">
    <tbody>
        <tr>
            <th>Method</th>
            <th>Kind</th>
            <th>Arguments</th>
            <th>Description</th>
        </tr>
        <tr>
            <td>stripTags()</td>
            <td>instance</td>
            <td>(none)</td>
            <td class="refDescription">返回一个把所有的HTML或XML标记都移除的字符串。</td>
        </tr>
        <tr>
            <td>stripScripts()</td>
            <td><nobr>instance</nobr></td>
            <td>(none)</td>
            <td class="refDescription">返回一个把所有的script都移除的字符串。</td>
        </tr>
        <tr>
            <td>escapeHTML()</td>
            <td>instance</td>
            <td>(none)</td>
            <td class="refDescription">返回一个把所有的HTML标记合适的转义掉的字符串。</td>
        </tr>
        <tr>
            <td>unescapeHTML()</td>
            <td>instance</td>
            <td>(none)</td>
            <td class="refDescription"><span class="code">escapeHTML()的反转。</span></td>
        </tr>
        <tr>
            <td>extractScripts()</td>
            <td>instance</td>
            <td>(none)</td>
            <td class="refDescription">返回一个包含在string中找到的所有&lt;script&gt;的数组。</td>
        </tr>
        <tr>
            <td>evalScripts()</td>
            <td>instance</td>
            <td>(none)</td>
            <td class="refDescription">执行在string中找到的所有&lt;script&gt;。</td>
        </tr>
        <tr>
            <td>toQueryParams()</td>
            <td>instance</td>
            <td>(none)</td>
            <td class="refDescription">把querystring分割才一个用parameter name做index的联合Array，更像一个hash。</td>
        </tr>
        <tr>
            <td>parseQuery()</td>
            <td>instance</td>
            <td>(none)</td>
            <td class="refDescription"><span class="code">和toQueryParams()一样</span>.</td>
        </tr>
        <tr>
            <td>toArray()</td>
            <td>instance</td>
            <td>(none)</td>
            <td class="refDescription">把字符串转换成字符数组.</td>
        </tr>
        <tr>
            <td>camelize()</td>
            <td>instance</td>
            <td>(none)</td>
            <td class="refDescription">转换一个以连字符连接的字符串成一个骆驼法样式的字符串。比如，这个函数在写代码时，把它做为一个样式工具使用是很有用的。</td>
        </tr>
    </tbody>
</table>
</p>
<p><!-- ------------------------------------------------------------------------------------------- --><a name="Reference.Array"></a></p>
<h4>对&nbsp; <span class="code">Array</span>的扩展</h4>
<p>因为array扩展于enumerable，所以所有enumberable对象的函数，array都是可以使用的，除此之外，下面的这些也是已经实现了的。 </p>
<p>
<table class="reference" cellspacing="0" border="1" id="Table5">
    <tbody>
        <tr>
            <th>Method</th>
            <th>Kind</th>
            <th>Arguments</th>
            <th>Description</th>
        </tr>
        <tr>
            <td>clear()</td>
            <td><nobr>instance</nobr></td>
            <td>(none)</td>
            <td class="refDescription">清空。</td>
        </tr>
        <tr>
            <td>compact()</td>
            <td>instance</td>
            <td>(none)</td>
            <td class="refDescription">返回一个不包括源array中null或undefined元素的array,此方法不改变源array。</td>
        </tr>
        <tr>
            <td>first()</td>
            <td>instance</td>
            <td>(none)</td>
            <td class="refDescription">返回array的第一个对象。</td>
        </tr>
        <tr>
            <td>flatten()</td>
            <td>instance</td>
            <td>(none)</td>
            <td class="refDescription">通过递归组合array每个元素的子元素（如果该元素也是array)来返回一个&ldquo;扁平的&rdquo;一维的array。</td>
        </tr>
        <tr>
            <td>indexOf(value)</td>
            <td>instance</td>
            <td>value: what you are looking for.</td>
            <td class="refDescription">返回给出数字位置（从０算起）的元素，如果在该位置没有找到对象，返回-1。 </td>
        </tr>
        <tr>
            <td>inspect()</td>
            <td>instance</td>
            <td>(none)</td>
            <td class="refDescription">重载inspect(),返回更好格式的反映Array每个元素的字符描述。</td>
        </tr>
        <tr>
            <td>last()</td>
            <td>instance</td>
            <td>(none)</td>
            <td class="refDescription">返回最后一个元素。</td>
        </tr>
        <tr>
            <td>reverse([applyToSelf])</td>
            <td>instance</td>
            <td>applyToSelf: indicates if the array itself should also be reversed.</td>
            <td class="refDescription">&nbsp;反转Array中元素的顺序，如果没有给出参数，或参数为true，则源Array中元素的顺序也反转，否则源Array保持不变。 </td>
        </tr>
        <tr>
            <td>shift()</td>
            <td>instance</td>
            <td>(none)</td>
            <td class="refDescription">返回Array的第一个元素并从Array中移除它，Array的Length-1。</td>
        </tr>
        <tr>
            <td>without(value1 [, value2 [, .. valueN]])</td>
            <td>instance</td>
            <td>value1 ... valueN: values to be excluded if present in the array.</td>
            <td class="refDescription">&nbsp;返回一个把参数列表中包含的元素从源Array中排除的Array。 </td>
        </tr>
    </tbody>
</table>
</p>
<p><!-- ------------------------------------------------------------------------------------------- --></p>
<h4><span class="code">document</span> DOM扩展</h4>
<p>
<table class="reference" cellspacing="0" border="1" id="Table6">
    <tbody>
        <tr>
            <th>Method</th>
            <th>Kind</th>
            <th>Arguments</th>
            <th>Description</th>
        </tr>
        <tr>
            <td>getElementsByClassName(className [, parentElement])</td>
            <td><nobr>instance</nobr></td>
            <td>className: name of a CSS class associated with the elements, parentElement: object or id of the element that contains the elements being retrieved.</td>
            <td class="refDescription">返回所有CSS className属性等于className参数的元素，如果没有给出parentElement,那么将搜索document body。(此处使用document.body我觉得不如使用document,因为有时有的页面没有body)&nbsp; </td>
        </tr>
    </tbody>
</table>
</p>
<p><!-- ------------------------------------------------------------------------------------------- --></p>
<h4><span class="code">Event</span>扩展</h4>
<p>
<table class="reference" cellspacing="0" border="1" id="Table7">
    <tbody>
        <tr>
            <th>Property</th>
            <th>Type</th>
            <th>Description</th>
        </tr>
        <tr>
            <td>KEY_BACKSPACE</td>
            <td><nobr>Number</nobr>Number</td>
            <td class="refDescription">8: Constant. Code for the Backspace key.</td>
        </tr>
        <tr>
            <td>KEY_TAB</td>
            <td>Number</td>
            <td class="refDescription">9: Constant. Code for the Tab key.</td>
        </tr>
        <tr>
            <td>KEY_RETURN</td>
            <td>Number</td>
            <td class="refDescription">13: Constant. Code for the Return key.</td>
        </tr>
        <tr>
            <td>KEY_ESC</td>
            <td>Number</td>
            <td class="refDescription">27: Constant. Code for the Esc key.</td>
        </tr>
        <tr>
            <td>KEY_LEFT</td>
            <td>Number</td>
            <td class="refDescription">37: Constant. Code for the Left arrow key.</td>
        </tr>
        <tr>
            <td>KEY_UP</td>
            <td>Number</td>
            <td class="refDescription">38: Constant. Code for the Up arrow key.</td>
        </tr>
        <tr>
            <td>KEY_RIGHT</td>
            <td>Number</td>
            <td class="refDescription">39: Constant. Code for the Right arrow key.</td>
        </tr>
        <tr>
            <td>KEY_DOWN</td>
            <td>Number</td>
            <td class="refDescription">40: Constant. Code for the Down arrow key.</td>
        </tr>
        <tr>
            <td>KEY_DELETE</td>
            <td>Number</td>
            <td class="refDescription">46: Constant. Code for the Delete key.</td>
        </tr>
        <tr class="privateMember">
            <td>observers:</td>
            <td>Array</td>
            <td class="refDescription">List of cached observers. Part of the internal implementation details of the object.</td>
        </tr>
    </tbody>
</table>
</p>
<p>
<table class="reference" cellspacing="0" border="1" id="Table8">
    <tbody>
        <tr>
            <th>Method</th>
            <th>Kind</th>
            <th>Arguments</th>
            <th>Description</th>
        </tr>
        <tr>
            <td>element(event)</td>
            <td>static</td>
            <td>event: an Event object</td>
            <td class="refDescription">返回事件源对象。</td>
        </tr>
        <tr>
            <td>isLeftClick(event)</td>
            <td>static</td>
            <td>event: an Event object</td>
            <td class="refDescription">如果点击了鼠标左键，返回true.</td>
        </tr>
        <tr>
            <td>pointerX(event)</td>
            <td>static</td>
            <td>event: an Event object</td>
            <td class="refDescription">返回鼠标的X座标。 </td>
        </tr>
        <tr>
            <td>pointerY(event)</td>
            <td>static</td>
            <td>event: an Event object</td>
            <td class="refDescription">返回鼠标的Y座标。</td>
        </tr>
        <tr>
            <td>stop(event)</td>
            <td>static</td>
            <td>event: an Event object</td>
            <td class="refDescription">使用此函数来中断事件的默认行为并阻止传递（冒泡)。</td>
        </tr>
        <tr>
            <td>findElement(event, tagName)</td>
            <td>static</td>
            <td>event: an Event object, tagName: name of the desired tag.</td>
            <td class="refDescription">从事件源对象开始向上搜索DOM树，直到找到第一个符合tagName的元素</td>
        </tr>
        <tr>
            <td>observe(element, name, observer, useCapture)</td>
            <td>static</td>
            <td>element: object or id, name: event name (like 'click', 'load', etc), observer: function to handle the event, useCapture: if <span class="code">true</span>, handles the event in the <em>capture</em> phase and if <span class="code">false</span> in the <em>bubbling</em> phase.</td>
            <td class="refDescription">为对象的某个事件增加一个处理函数。</td>
        </tr>
        <tr>
            <td>stopObserving(element, name, observer, useCapture)</td>
            <td>static</td>
            <td>element: object or id, name: event name (like 'click'), observer: function that is handling the event, useCapture: if true handles the event in the <em>capture</em> phase and if false in the <em>bubbling</em> phase.</td>
            <td class="refDescription">和上面的函数相反。</td>
        </tr>
        <tr class="privateMember">
            <td>_observeAndCache(element, name, observer, useCapture)</td>
            <td>static</td>
            <td>&nbsp;</td>
            <td class="refDescription">私有函数，别管它。</td>
        </tr>
        <tr class="privateMember">
            <td>unloadCache()</td>
            <td><nobr>static</nobr></td>
            <td>(none)</td>
            <td class="refDescription">私有函数，别管它。从内存中清除所有的observers缓存。</td>
        </tr>
    </tbody>
</table>
</p>
<p>下面代码演示如何给window添加一个load事件处理函数。 </p>
<pre class="code">&lt;script&gt;
<span class="highlite">Event.observe(window, 'load', showMessage, false);</span>
function showMessage() {
alert('Page loaded.');
}
&lt;/script&gt;
</pre>
<p><!-- ------------------------------------------------------------------------------------------- --></p>
<h4>在prototype.js中定义新的对象和类</h4>
<p>另一个这个程序包帮助你的地方就是提供许多既支持面向对象设计理念又有共通功能的许多对象。 </p>
<p><!-- ------------------------------------------------------------------------------------------- --></p>
<h4>The <span class="objectClass">PeriodicalExecuter</span> object</h4>
<p>这个对象提供一定间隔时间上重复调用一个方法的逻辑。 </p>
<p>
<table class="reference" cellspacing="0" border="1" id="Table9">
    <tbody>
        <tr>
            <th>Method</th>
            <th>Kind</th>
            <th>Arguments</th>
            <th>Description</th>
        </tr>
        <tr>
            <td>[ctor](callback, interval)</td>
            <td><nobr>constructor</nobr></td>
            <td>callback: a parameterless function, interval: number of seconds</td>
            <td class="refDescription">创建这个对象的实例将会重复调用给定的方法。</td>
        </tr>
    </tbody>
</table>
</p>
<p>
<table class="reference" cellspacing="0" border="1" id="Table10">
    <tbody>
        <tr>
            <th>Property</th>
            <th>Type</th>
            <th>Description</th>
        </tr>
        <tr>
            <td>callback</td>
            <td><nobr>Function()</nobr></td>
            <td class="refDescription">被调用的方法，该方法不能传入参数。</td>
        </tr>
        <tr>
            <td>frequency</td>
            <td>Number</td>
            <td class="refDescription">以秒为单位的间隔。</td>
        </tr>
        <tr class="privateMember">
            <td>currentlyExecuting</td>
            <td>Boolean</td>
            <td class="refDescription">表示这个方法是否正在执行。</td>
        </tr>
    </tbody>
</table>
</p>
<p><!-- ------------------------------------------------------------------------------------------- --></p>
<h4>The <span class="objectClass">Prototype</span> object</h4>
<p><tt class="literal">Prototype</tt> 没有太重要的作用，只是声明了该程序包的版本 。 </p>
<p>
<table class="reference" cellspacing="0" border="1" id="Table11">
    <tbody>
        <tr>
            <th>Property</th>
            <th>Type</th>
            <th>Description</th>
        </tr>
        <tr>
            <td>Version</td>
            <td>String</td>
            <td class="refDescription"><font face="宋体">版本。</font></td>
        </tr>
        <tr>
            <td>emptyFunction</td>
            <td><nobr>Function()</nobr></td>
            <td class="refDescription">空函数。</td>
        </tr>
        <tr>
            <td>K</td>
            <td>Function(obj)</td>
            <td class="refDescription">一个仅仅回传参数的函数。</td>
        </tr>
        <tr class="privateMember">
            <td>ScriptFragment</td>
            <td>String</td>
            <td class="refDescription">识别script的正则式。</td>
        </tr>
    </tbody>
</table>
</p>
<p><!-- ------------------------------------------------------------------------------------------- --><a name="Reference.Enumerable"></a></p>
<h4>The <span class="objectClass">Enumerable</span> object</h4>
<p>Enumberable对象能够已更优雅的方式实现对列表样式的结构进行枚举。 </p>
<p>很多其它的对象通过扩展自Enumberable对象来得到这些有用的接口。</p>
<p>
<table class="reference" cellspacing="0" border="1" id="Table12">
    <tbody>
        <tr>
            <th>Method</th>
            <th>Kind</th>
            <th>Arguments</th>
            <th>Description</th>
        </tr>
        <tr>
            <td>each(iterator)</td>
            <td><nobr>instance</nobr></td>
            <td>iterator: a function object conforming to Function(value, index)</td>
            <td class="refDescription">把每个element做为第一个参数，element的index作为第一个参数调用iterator函数。</td>
        </tr>
        <tr>
            <td>all([iterator])</td>
            <td>instance</td>
            <td>iterator: a function object conforming to Function(value, index)</td>
            <td class="refDescription">这个函数会用给出的iterator测试整个集合，如果集合中任一元素在iterator函数测试中返回false或null，那么这个函数返回false,否则返回true。如果没有给出iterator，那么就会测试所有的元素是不是不等于false和null。你可以简单的把它看成是&ldquo;检测每个元素都为非空非负&rdquo;。 </td>
        </tr>
        <tr>
            <td>any(iterator)</td>
            <td>instance</td>
            <td>iterator: a function object conforming to Function(value, index), optional.</td>
            <td class="refDescription">这个函数会用给出的iterator测试整个集合，如果集合中任一元素在iterator函数测试中返回true，那么这个函数返回true,否则返回false。如果没有给出iterator，那么就会测试所有的元素是不是有一个不等于false和null。你可以简单的把它看成是&ldquo;检测元素中是不是有非空非负的&rdquo;。 </td>
        </tr>
        <tr>
            <td>collect(iterator)</td>
            <td>instance</td>
            <td>iterator: a function object conforming to Function(value, index)</td>
            <td class="refDescription">&nbsp;调用iterator函数根据集合中每个元素返回一个结果，然后按照原来集合中的顺序，返回一个Array。 </td>
        </tr>
        <tr>
            <td>detect(iterator)</td>
            <td>instance</td>
            <td>iterator: a function object conforming to Function(value, index)</td>
            <td class="refDescription">集合中每个元素调用一次Iterator，返回第一个使Iterator返回True的元素，如果最终都没有为true的调用，那么返回null。 </td>
        </tr>
        <tr>
            <td>entries()</td>
            <td>instance</td>
            <td>(none)</td>
            <td class="refDescription"><span class="code">等于toArray()</span>. </td>
        </tr>
        <tr>
            <td>find(iterator)</td>
            <td>instance</td>
            <td>iterator: a function object conforming to Function(value, index)</td>
            <td class="refDescription">等于 <span class="code">detect()</span>. </td>
        </tr>
        <tr>
            <td>findAll(iterator)</td>
            <td>instance</td>
            <td>iterator: a function object conforming to Function(value, index)</td>
            <td class="refDescription">集合中每个元素调用Iterator，返回一个由所有调用Iterator返回结果等于true的元素组成的数组。和reject()相反。 </td>
        </tr>
        <tr>
            <td>grep(pattern [, iterator])</td>
            <td>instance</td>
            <td>pattern: a RegExp object used to match the elements, iterator: a function object conforming to Function(value, index)</td>
            <td class="refDescription">&nbsp;用pattern参数正则表达式测试集合中的每个元素，返回一个包含所有匹配正则式的元素的Array，如果给出了Iterator，那个每个结果还要经过一下Iterator处理。 </td>
        </tr>
        <tr>
            <td>include(obj)</td>
            <td>instance</td>
            <td>obj: any object</td>
            <td class="refDescription">&nbsp;判断集合中包不包含指定对象。 </td>
        </tr>
        <tr>
            <td>inject(initialValue, iterator)</td>
            <td>instance</td>
            <td>initialValue: any object to be used as the initial value, iterator: a function object conforming to Function(accumulator, value, index)</td>
            <td class="refDescription">&nbsp;用Iterator联接所有集合中的元素。Iterator在被调用时把上一次迭代的结果做为第一个参数传给accumulator。第一次迭代时，accurmelator等于initialValue,最后返回accumulator的值。 </td>
        </tr>
        <tr>
            <td>invoke(methodName [, arg1 [, arg2 [...]]])</td>
            <td>instance</td>
            <td>methodName: name of the method that will be called in each element, arg1..argN: arguments that will be passed in the method invocation.</td>
            <td class="refDescription">集合中的每个元素调用指定的函数（查看源代码可以发现指定函数被调用时，this指针被传成当前元素），并传入给出的参数，返回调用结果组成的Array。 </td>
        </tr>
        <tr>
            <td>map(iterator)</td>
            <td>instance</td>
            <td>iterator: a function object conforming to Function(value, index)</td>
            <td class="refDescription"><span class="code">同collect()</span>. </td>
        </tr>
        <tr>
            <td>max([iterator])</td>
            <td>instance</td>
            <td>iterator: a function object conforming to Function(value, index)</td>
            <td class="refDescription">返回集合中元素的最大值，或调用Iterator后返回值的最大值(如果给出了Iterator的话)。 </td>
        </tr>
        <tr>
            <td>member(obj)</td>
            <td>instance</td>
            <td>obj: any object</td>
            <td class="refDescription">同 <span class="code">include()</span>. </td>
        </tr>
        <tr>
            <td>min([iterator])</td>
            <td>instance</td>
            <td>iterator: a function object conforming to Function(value, index)</td>
            <td class="refDescription">返回最小值，参见max()。 </td>
        </tr>
        <tr>
            <td>partition([iterator])</td>
            <td>instance</td>
            <td>iterator: a function object conforming to Function(value, index)</td>
            <td class="refDescription">返回一个包含两个Array的Array，第一个Array包含所有调用Iterator返回True的元素，第二个Array包含剩下的元素。如果Iterator没有给出，那么就根据元素本身判断。 </td>
        </tr>
        <tr>
            <td>pluck(propertyName)</td>
            <td>instance</td>
            <td>propertyName name of the property that will be read from each element. This can also contain the index of the element</td>
            <td class="refDescription">返回每个元素的指定属性名的属性的值组成的Array。 </td>
        </tr>
        <tr>
            <td>reject(iterator)</td>
            <td>instance</td>
            <td>iterator: a function object conforming to Function(value, index)</td>
            <td class="refDescription">和&nbsp; <span class="code">findAll()相反（返回所有等于false的元素）</span>. </td>
        </tr>
        <tr>
            <td>select(iterator)</td>
            <td>instance</td>
            <td>iterator: a function object conforming to Function(value, index)</td>
            <td class="refDescription">同 <span class="code">findAll()</span>. </td>
        </tr>
        <tr>
            <td>sortBy(iterator)</td>
            <td>instance</td>
            <td>iterator: a function object conforming to Function(value, index)</td>
            <td class="refDescription">根据每个元素调用Iterator返回的值进行排序返回一个Array。 </td>
        </tr>
        <tr>
            <td>toArray()</td>
            <td>instance</td>
            <td>(none)</td>
            <td class="refDescription">返回由集合所有元素组成的一个Array。 </td>
        </tr>
        <tr>
            <td>zip(collection1[, collection2 [, ... collectionN [,transform]]])</td>
            <td>instance</td>
            <td>collection1 .. collectionN: enumerations that will be merged, transform: a function object conforming to Function(value, index)</td>
            <td class="refDescription">合并每个给出的集合到当前集合。合并操作返回一个新的array，这个array的元素个数和原集合的元素个数一样，这个array的每个元素又是一个子array,它合并了所有集合中相同index的元素。如果transform函数被指定，那么array的每个元素还会调用transform函数先做处理。举个例子: [1,2,3].zip([4,5,6], [7,8,9]).inspect()&nbsp;返回 &quot;[ [1,4,7],[2,5,8],[3,6,9] ]&quot; </td>
        </tr>
    </tbody>
</table>
</p>
<p><!-- ------------------------------------------------------------------------------------------- --><a name="Reference.Hash"></a></p>
<h4>The <span class="objectClass">Hash</span> object</h4>
<p>&nbsp;Hash对象实现一种Hash结构，也就是一个Key:Value对的集合。 </p>
<p>Hash中的每个Item是一个有两个元素的array，前一个是Key，后一个是Value，每个Item也有两个不需加以说明的属性,key和value。 </p>
<p>
<table class="reference" cellspacing="0" border="1" id="Table13">
    <tbody>
        <tr>
            <th>Method</th>
            <th>Kind</th>
            <th>Arguments</th>
            <th>Description</th>
        </tr>
        <tr>
            <td>keys()</td>
            <td>instance</td>
            <td>(none)</td>
            <td class="refDescription">返回所有Item的key的集合的一个array。 </td>
        </tr>
        <tr>
            <td>values()</td>
            <td><nobr>instance</nobr></td>
            <td>(none)</td>
            <td class="refDescription">返回所有Item的value的集合的一个array。 </td>
        </tr>
        <tr>
            <td>merge(otherHash)</td>
            <td>instance</td>
            <td>otherHash: Hash object</td>
            <td class="refDescription">合并给出的Hash，返回一个新Hash。 </td>
        </tr>
        <tr>
            <td>toQueryString()</td>
            <td>instance</td>
            <td>(none)</td>
            <td class="refDescription">以QueryString那样的样式返回hash中所有的item，例如： <span class="code">'key1=value1&amp;key2=value2&amp;key3=value3'</span> </td>
        </tr>
        <tr>
            <td>inspect()</td>
            <td>instance</td>
            <td>(none)</td>
            <td class="refDescription">用一种合适的方法显示hash中的key:value对。</td>
        </tr>
    </tbody>
</table>
</p>
<p><!-- ------------------------------------------------------------------------------------------- --><a name="Reference.ObjectRange"></a></p>
<h4>The <span class="objectClass">ObjectRange</span> class</h4>
<p><em>继承自&nbsp; <a href="http://www.cnblogs.com/thinhunan/archive/2006/04/01/developernotesforprototype.html#Reference.Enumerable" class="code">Enumerable</a></em></p>
<p>用上、下边界描述一个对象区域。 </p>
<p>
<table class="reference" cellspacing="0" border="1" id="Table14">
    <tbody>
        <tr>
            <th>Property</th>
            <th>Type</th>
            <th>Kind</th>
            <th>Description</th>
        </tr>
        <tr>
            <td>start</td>
            <td>(any)</td>
            <td><nobr>instance</nobr></td>
            <td class="refDescription">
            <p>range的下边界</p>
            </td>
        </tr>
        <tr>
            <td>end</td>
            <td>(any)</td>
            <td>instance</td>
            <td class="refDescription">range的上边界</td>
        </tr>
        <tr>
            <td>exclusive</td>
            <td>Boolean</td>
            <td>instance</td>
            <td class="refDescription">决定边界自身是不是range的一部分。</td>
        </tr>
    </tbody>
</table>
</p>
<p>
<table class="reference" cellspacing="0" border="1" id="Table15">
    <tbody>
        <tr>
            <th>Method</th>
            <th>Kind</th>
            <th>Arguments</th>
            <th>Description</th>
        </tr>
        <tr>
            <td>[ctor](start, end, exclusive)</td>
            <td>constructor</td>
            <td>start: the lower bound, end: the upper bound, exclusive: include the bounds in the range?</td>
            <td class="refDescription">创建一个range对象，从start生成到end,这里要注意的是，start和end必段类型一致，而且该类型要有succ()方法。 </td>
        </tr>
        <tr>
            <td>include(searchedValue)</td>
            <td><nobr>instance</nobr></td>
            <td>searchedValue: value that we are looking for</td>
            <td class="refDescription">检查一个value是不是在range中。 </td>
        </tr>
    </tbody>
</table>
</p>
<p><!-- ------------------------------------------------------------------------------------------- --></p>
<h4>The <span class="objectClass">Class</span> object</h4>
<p>在这个程序包中 <tt class="literal">Class</tt> 对象在声明其他的类时候被用到 。用这个对象声明类使得新类支持 <tt class="literal">initialize()</tt> 方法，他起构造方法的作用。</p>
<p>看下面的例子</p>
<p>//declaring the class<br />
<span class="highlite">var MySampleClass = Class.create();</span><br />
<br />
//defining the rest of the class implmentation<br />
MySampleClass.prototype = {<br />
<br />
&nbsp;&nbsp; initialize: function(message) {<br />
this.message = message;<br />
&nbsp;&nbsp; },<br />
<br />
&nbsp;&nbsp; showMessage: function(ajaxResponse) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; alert(this.message);<br />
&nbsp;&nbsp; }<br />
}; <br />
<br />
//now, let's instantiate and use one object<br />
var myTalker = new MySampleClass('hi there.');<br />
myTalker.showMessage(); //displays alert<br />
<br />
</p>
<p>
<table class="reference" cellspacing="0" border="1" id="Table16">
    <tbody>
        <tr>
            <th>Method</th>
            <th>Kind</th>
            <th>Arguments</th>
            <th>Description</th>
        </tr>
        <tr>
            <td>create(*)</td>
            <td><nobr>instance</nobr></td>
            <td>(any)</td>
            <td class="refDescription">定义新类的构造方法。</td>
        </tr>
    </tbody>
</table>
</p>
<p><!-- ------------------------------------------------------------------------------------------- --></p>
<h4>The <span class="objectClass">Ajax</span> object</h4>
<p>这个对象被用作其他提供AJAX功能的类的根对象。&nbsp;</p>
<p>
<table class="reference" cellspacing="0" border="1" id="Table17">
    <tbody>
        <tr>
            <th>Property</th>
            <th>Type</th>
            <th>Kind</th>
            <th>Description</th>
        </tr>
        <tr>
            <td>activeRequestCount</td>
            <td>Number</td>
            <td>instance</td>
            <td class="refDescription">正在处理中的Ajax请求的个数。</td>
        </tr>
    </tbody>
</table>
</p>
<p>
<table class="reference" cellspacing="0" border="1" id="Table18">
    <tbody>
        <tr>
            <th>Method</th>
            <th>Kind</th>
            <th>Arguments</th>
            <th>Description</th>
        </tr>
        <tr>
            <td>getTransport()</td>
            <td><nobr>instance</nobr></td>
            <td>(none)</td>
            <td class="refDescription">返回新的<tt class="literal">XMLHttpRequest</tt> 对象。</td>
        </tr>
    </tbody>
</table>
</p>
<p><!-- ------------------------------------------------------------------------------------------- --><a name="Ajax.Responders"></a></p>
<h4>The <span class="objectClass">Ajax.Responders</span> object</h4>
<p><em>继承自 <a href="http://www.cnblogs.com/thinhunan/archive/2006/04/01/developernotesforprototype.html#Reference.Enumerable" class="code">Enumerable</a></em></p>
<p>这个对象维持一个在Ajax相关事件发生时将被调用的对象的列表。比如，你要设置一个全局钩子来处理Ajax操作异常，那么你就可以使用这个对象。 </p>
<p>
<table class="reference" cellspacing="0" border="1" id="Table19">
    <tbody>
        <tr>
            <th>Property</th>
            <th>Type</th>
            <th>Kind</th>
            <th>Description</th>
        </tr>
        <tr>
            <td>responders</td>
            <td>Array</td>
            <td><nobr>instance</nobr></td>
            <td class="refDescription">被注册到Ajax事件通知的对象列表。</td>
        </tr>
    </tbody>
</table>
</p>
<p>
<table class="reference" cellspacing="0" border="1" id="Table20">
    <tbody>
        <tr>
            <th>Method</th>
            <th>Kind</th>
            <th>Arguments</th>
            <th>Description</th>
        </tr>
        <tr>
            <td>register(responderToAdd)</td>
            <td>instance</td>
            <td>responderToAdd: object with methods that will be called.</td>
            <td class="refDescription">被传入参数的对象应包含名如Ajax事件的系列方法（如onCreate,onComplete,onException）。通讯事件引发所有被注册的对象的合适名称的函数被调用。 </td>
        </tr>
        <tr>
            <td>unregister(responderToRemove)</td>
            <td>instance</td>
            <td>responderToRemove: object to be removed from the list.</td>
            <td class="refDescription">&nbsp;从列表中移除。 </td>
        </tr>
        <tr>
            <td>dispatch(callback, request, transport, json)</td>
            <td>instance</td>
            <td>callback: name of the AJAX e</td></tr></tbody></table></p>
          <br/>
          <span style="color:red;">
            <a href="http://langbuchiyang.javaeye.com/blog/125526#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 20 Sep 2007 01:06:43 +0800</pubDate>
        <link>http://langbuchiyang.javaeye.com/blog/125526</link>
        <guid>http://langbuchiyang.javaeye.com/blog/125526</guid>
      </item>
      <item>
        <title>不眠之夜</title>
        <author>狼不吃羊</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://langbuchiyang.javaeye.com">狼不吃羊</a>&nbsp;
          链接：<a href="http://langbuchiyang.javaeye.com/blog/81257" style="color:red;">http://langbuchiyang.javaeye.com/blog/81257</a>&nbsp;
          发表时间: 2007年05月20日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>&nbsp;&nbsp;&nbsp;&nbsp; 又是一夜未睡，已经记不清这是第几次了，高中的时候学习压力大，一睡不着觉久害怕，害怕影响第二天的学习，大学后渐渐忘了这些，睡不着了大家就聊天，现在已经记不得大学为什么晚上会睡不着。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 终于工作了，我满怀憧憬，满怀期待来到上海，也满怀幻想，但得到的确实无尽的失落和迷茫。我开始严重的失眠，有时我想像我这样熬夜到深夜，每天考虑问题有那么复杂，外加抽烟不经常运动，应该不会活太久吧。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; 第一次再网上写东西，总感觉有点语无伦次，现在已经早上5点了，我抽了一夜的烟，喝了3瓶啤酒，一直湾着腰到现在，我知道我困，我累，我感到头在发晕，腰在发酸，但我不想睡，不是网络有什么在吸引我，而是我想折磨我自己，这样我可以暂时把一些事情放在脑后，累了，真的累了！</p>
          <br/>
          <span style="color:red;">
            <a href="http://langbuchiyang.javaeye.com/blog/81257#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sun, 20 May 2007 05:03:18 +0800</pubDate>
        <link>http://langbuchiyang.javaeye.com/blog/81257</link>
        <guid>http://langbuchiyang.javaeye.com/blog/81257</guid>
      </item>
  </channel>
</rss>