﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-为了生活而生活-文章分类-ajax</title><link>http://www.blogjava.net/terry711/category/20955.html</link><description /><language>zh-cn</language><lastBuildDate>Mon, 26 Mar 2007 04:14:05 GMT</lastBuildDate><pubDate>Mon, 26 Mar 2007 04:14:05 GMT</pubDate><ttl>60</ttl><item><title>prototype.js　1.4版开发者手册(强烈推荐) </title><link>http://www.blogjava.net/terry711/articles/105976.html</link><dc:creator>terryliu</dc:creator><author>terryliu</author><pubDate>Fri, 23 Mar 2007 14:01:00 GMT</pubDate><guid>http://www.blogjava.net/terry711/articles/105976.html</guid><description><![CDATA[
		<div class="post">
				<div class="postcontent">
						<style><![CDATA[reference table{border:1px dashed darkblue;} .reference th{border:1px dashed darkblue;color:white;background-color:darkblue;}  .reference td{border:1px dashed darkblue;corlor:black;background-color:white;} ]]&gt;</style>
						<script><![CDATA[  function sp(link)
   {
    var em =  'serg' + 'io_p' + 'ereira@';
    em += 'ms' + 'n.c' + 'om';
    document.write('<a href="mai' + 'lto:' + em + '">' + link + '</a>);
   }
   function navigateToVersion(list)
   {
    var url = list.options[list.selectedIndex].value;
    if(url != '')
     document.location = url;
   }
  ]]&gt;</script>
						<div id="mainContent">
								<p>
								</p>
								<p>
								</p>
								<p>prototype.js是什么?</p>
								<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://thinhunan.cnblogs.com/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="prototype-1.3.1.js"&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="myDiv"&gt;
&lt;p&gt;This is a paragraph&lt;/p&gt;
&lt;/div&gt;
&lt;div id="myOtherDiv"&gt;
&lt;p&gt;This is another paragraph&lt;/p&gt;
&lt;/div&gt;
&lt;input type="button" value=Test1 onclick="test1();"&gt;&lt;br&gt;
&lt;input type="button" value=Test2 onclick="test2();"&gt;&lt;br&gt;
&lt;/BODY&gt;
&lt;/HTML&gt;</pre>
								<p>另外一个好处是，这个函数能传入用string表示的对象ID，也可以传入对象本身，这样，在建立其它能传两种类型的参数的函数时非常有用。</p>
								<!--- -->
								<h4>使用$F()函数</h4>
								<p>$F()函数是另一个大收欢迎的“快捷键”，它能用于返回任何表单输入控件的值，比如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="text" id="userName" value="Joe Doe"&gt;&lt;br&gt;
&lt;input type="button" value=Test3 onclick="test3();"&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="lstEmployees" size="10" &gt;
&lt;option value="5"&gt;Buchanan, Steven&lt;/option&gt;
&lt;option value="8"&gt;Callahan, Laura&lt;/option&gt;
&lt;option value="1"&gt;Davolio, Nancy&lt;/option&gt;
&lt;/select&gt;
&lt;input type="button" value="Show the options" onclick="showOptions();" &gt;
</pre>
								<p>
										<!--- -->
								</p>
								<h4>使用 <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://thinhunan.cnblogs.com/archive/2006/04/01/DeveloperNotesForPrototype.html#Reference.ObjectRange">ObjectRange</a> 类文档可以看到一个关于此类的完整描述. 此时，我们还是先来看一个例子以展示这个缩写能代替哪些方法吧。其它相关的一些知识可以在<a href="http://thinhunan.cnblogs.com/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="button" value="Sample Count" onclick="demoDollar_R();" &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 />    return Try.these(<br />        function() {return xmlNode.text;},<br />        function() {return xmlNode.textContent;)<br />        );<br />}<br />&lt;/script&gt;<br />   </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="1.0" encoding="utf-8" ?&gt;
&lt;ajax-response&gt;
&lt;response type="object" id="productDetails"&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="lstEmployees" size="10" onchange="searchSales()"&gt;
&lt;option value="5"&gt;Buchanan, Steven&lt;/option&gt;
&lt;option value="8"&gt;Callahan, Laura&lt;/option&gt;
&lt;option value="1"&gt;Davolio, Nancy&lt;/option&gt;
&lt;/select&gt;
&lt;select id="lstYears" size="3" onchange="searchSales()"&gt;
&lt;option selected="selected" value="1996"&gt;1996&lt;/option&gt;
&lt;option value="1997"&gt;1997&lt;/option&gt;
&lt;option value="1998"&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> 在1.4.0版本中，一种新的事件回传外理被引入。如果你有一段代码总是要为一个特殊的事件执行，而不管是哪个AJAX调用引发它，那么你可以使用新的<a href="http://thinhunan.cnblogs.com/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 title="4.14. Ajax.Request 类" href="http://thinhunan.cnblogs.com/archive/2006/04/01/DeveloperNotesForPrototype.html#ajax_request_reference">Ajax.Request 参考</a> 和 <a title="4.15. options 参数对象" href="http://thinhunan.cnblogs.com/archive/2006/04/01/DeveloperNotesForPrototype.html#options_reference">Ajax选项参考</a>。</p>
								<p>
										<!--- -->
								</p>
								<h4>使用<span class="objectClass">Ajax.Updater</span>类</h4>
								<p>如果你的服务器的另一端返回的信息已经是HTML了，那么使用这个程序包中 <tt class="literal">Ajax.Updater</tt> 类将使你的生活变得更加得容易。用它你只需提供哪一个元素需要被AJAX请求返回的HTML填充就可以了，例子比我写说明的更清楚。 </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="getHTML()"&gt;
&lt;div id="placeholder"&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="getHTML()"&gt;
&lt;div id="placeholder"&gt;&lt;/div&gt;
</pre>
								<p>如果你的服务器逻辑是连同HTML 标记返回JavaScript 代码， <tt class="literal">Ajax.Updater</tt>对象可以执行那段JavaScript代码。为了使这个对象对待响应为JavaScript，你只需在最后参数的对象构造方法中简单加入<tt class="literal">evalScripts: true</tt>属性。但是值得提醒的是，像这个选项名evalScripts暗示的，这些脚本会被执行，但是它们不会被加入到Page的脚本中。“有什么区别？”，可能你会这样问。我们假定请求地址返回的东东像这样：</p>
								<pre class="code">&lt;script language="javascript" type="text/javascript"&gt;
function sayHi(){
alert('Hi');
}
&lt;/script&gt;
&lt;input type=button value="Click Me" onclick="sayHi()"&gt;
</pre>
								<p>如果你以前这样尝试过，你知道这些脚本不会如你所期望的那样工作，原因是这段脚本会被执行，但像上面这样的脚本执行并不会创建一个名叫sayHi的函数，它什么也不做。如果要创建一个函数，我们应当把代码改成下面这个样子：</p>
								<pre class="code">&lt;script language="javascript" type="text/javascript"&gt;
<div class="highlite">sayHi = function(){
alert('Hi');
};</div>
&lt;/script&gt;
&lt;input type=button value="Click Me" onclick="sayHi()"&gt;
</pre>
								<p>为什么我们在上面的代码中不使用var关键字来声明这个变量呢（指sayHi ），因为那样做创建出来的函数将只是当前脚本块的一个局部变量（至少在IE中是这样）。不写var关键字，创建出来的对象的作用域就是我们所期望的window。</p>
								<p>更多相关知识，请参看  <a href="http://thinhunan.cnblogs.com/archive/2006/04/01/DeveloperNotesForPrototype.html#Ajax.Updater">Ajax.Updater reference</a> 和<a href="http://thinhunan.cnblogs.com/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 class="code" href="http://thinhunan.cnblogs.com/archive/2006/04/01/DeveloperNotesForPrototype.html#Reference.Enumerable">Enumerable</a>对象，它实现了很多和可迭代数据进行交互的窍门。和原有的JS对象相比prototype.js更上一层楼，它对<a href="http://thinhunan.cnblogs.com/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="button" value="Show List" onclick="showList();" &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>你可能会想“非常奇怪的方式...相对旧的，这种语法太怪异了”。哦，在上面的例子，确实什么也没有，在这个简单得要死例子中，也没有改变太多啊，尽管如此，请继续读下去。 </p>
								<p>在继续下面内容之前，你注意到那个被做为一个参数传递给each函数的函数？我们把它理解成迭代器函数。 </p>
								<h4>Your arrays on steroids</h4>
								<p>就如我们上面提到的，把你的Array中的elements当成相同的类型使用相同的属性和函数是很通用(Common,不知该翻译成通用还是庸俗)的。让我们看看怎么样利用我们新的马力强劲的Arrays的迭代功能吧。 </p>
								<p>依照标准找到一个element。 </p>
								<p>
								</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="lstEmployees" size="10" &gt;
&lt;option value="5"&gt;Buchanan, Steven&lt;/option&gt;
&lt;option value="8"&gt;Callahan, Laura&lt;/option&gt;
&lt;option value="1"&gt;Davolio, Nancy&lt;/option&gt;
&lt;/select&gt;
&lt;input type="button" value="Find Laura" onclick="findEmployeeById(8);" &gt;
</pre>
								<p>现在我们再下一城，看看如何过滤一个Array中的元素，从每个元素中得到我们想要的成员。 </p>
								<p>
								</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="someText"&gt;
This &lt;a href="http://othersite.com/page.html"&gt;text&lt;/a&gt; has
a &lt;a href="#localAnchor"&gt;lot&lt;/a&gt; of
&lt;a href="#otherAnchor"&gt;links&lt;/a&gt;. Some are
&lt;a href="http://wherever.com/page.html"&gt;external&lt;/a&gt;
and some are &lt;a href="#someAnchor"&gt;local&lt;/a&gt;
&lt;/p&gt;
&lt;input type=button value="Find Local Links" onclick="showLocalLinks('someText')"&gt;
</pre>
								<p>上面的代码仅仅是一点小小的实践让人爱上这种语法。请参看 <a class="code" href="http://thinhunan.cnblogs.com/archive/2006/04/01/DeveloperNotesForPrototype.html#Reference.Enumerable">Enumerable</a>和<a class="code" href="http://thinhunan.cnblogs.com/archive/2006/04/01/DeveloperNotesForPrototype.html#Reference.Array">Array</a>的所有函数 </p>
								<p>
										<!-- ************************************************************************************************************************************* -->
								</p>
								<hr />
								<p>
										<a name="Reference">
										</a> </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>
								</p>
								<table class="reference" id="Table1" cellspacing="0" border="1">
										<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>
								<h4>
										<span class="code">对Number的扩展</span>
								</h4>
								<p>
								</p>
								<table class="reference" id="Table2" cellspacing="0" border="1">
										<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"> 返回下一个数字，这个方法可用于迭代调用场景中。 </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>下面的例子用提示框显示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="Test Number.times()" onclick="demoTimes()"&gt;
</pre>
								<p>
										<!--- -->
								</p>
								<h4>对 <span class="code">Function扩展</span></h4>
								<p>
								</p>
								<table class="reference" id="Table3" cellspacing="0" border="1">
										<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>
								<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>
								</p>
								<table class="reference" id="Table4" cellspacing="0" border="1">
										<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>
										<!--- -->
										<a name="Reference.Array">
										</a>
								</p>
								<h4>对  <span class="code">Array</span>的扩展</h4>
								<p>因为array扩展于enumerable，所以所有enumberable对象的函数，array都是可以使用的，除此之外，下面的这些也是已经实现了的。 </p>
								<p>
								</p>
								<table class="reference" id="Table5" cellspacing="0" border="1">
										<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)来返回一个“扁平的”一维的array。</td>
												</tr>
												<tr>
														<td>indexOf(value)</td>
														<td>instance</td>
														<td>value: what you are looking for.</td>
												</tr>
										</tbody>
								</table>
						</div>
				</div>
		</div>
<img src ="http://www.blogjava.net/terry711/aggbug/105976.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/terry711/" target="_blank">terryliu</a> 2007-03-23 22:01 <a href="http://www.blogjava.net/terry711/articles/105976.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>