﻿<?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-咖啡Java-随笔分类-主流Ajax</title><link>http://www.blogjava.net/jaunt/category/17634.html</link><description>站在巨人的肩上&lt;br&gt;
Flying in the world of Java</description><language>zh-cn</language><lastBuildDate>Thu, 11 Oct 2007 23:10:17 GMT</lastBuildDate><pubDate>Thu, 11 Oct 2007 23:10:17 GMT</pubDate><ttl>60</ttl><item><title>AJAX概况</title><link>http://www.blogjava.net/jaunt/archive/2007/10/10/151846.html</link><dc:creator>Jaunt</dc:creator><author>Jaunt</author><pubDate>Wed, 10 Oct 2007 10:04:00 GMT</pubDate><guid>http://www.blogjava.net/jaunt/archive/2007/10/10/151846.html</guid><wfw:comment>http://www.blogjava.net/jaunt/comments/151846.html</wfw:comment><comments>http://www.blogjava.net/jaunt/archive/2007/10/10/151846.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jaunt/comments/commentRss/151846.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jaunt/services/trackbacks/151846.html</trackback:ping><description><![CDATA[一、使用Ajax的主要原因
<div f14=""><strong>1、通过适当的Ajax应用达到更好的用户体验；</strong><br />
<strong>2、把以前的一些服务器负担的工作转嫁到客户端，利于客户端闲置的处理能力来处理，减轻服务器和带宽的负担，从而达到节约ISP的空间及带宽租用成本的目的。</strong><br />
</div>
<div>二、引用</div>
<div><strong>Ajax这个概念的最早提出者<a href="http://www.adaptivepath.com/publications/essays/archives/000385.php" target="_blank">Jesse James Garrett</a>认为：</strong><br />
Ajax是Asynchronous JavaScript and XML的缩写。<br />
Ajax并不是一门新的语言或技术,它实际上是几项技术按一定的方式组合在一在同共的协作中发挥各自的作用,它包括<br />
使用XHTML和CSS标准化呈现;<br />
使用DOM实现动态显示和交互;<br />
使用XML和XSLT进行数据交换与处理;<br />
使用XMLHttpRequest进行异步数据读取;<br />
最后用JavaScript绑定和处理所有数据;<br />
Ajax的工作原理相当于在用户和服务器之间加了—个中间层,使用户操作与服务器响应异步化。并不是所有的用户请求都提交给服务器,像—些数据验证和数据处理等都交给Ajax引擎自己来做,只有确定需要从服务器读取新数据时再由Ajax引擎代为向服务器提交请求。<br />
<div align="center"><img src="http://www.dragonson.com/doc/images/ajax-fig1.png" alt="图2－1" height="566" width="521" /><br />
图2－1 <br />
<br />
<img src="http://www.dragonson.com/doc/images/ajax-fig2_small.png" alt="图2－2" height="598" width="521" /><br />
图2－2 </div>
</div>
<div>三、概述</div>
<div>
虽然Garrent列出了7条Ajax的构成技术，但个人认为，所谓的Ajax其核心只有JavaScript、XMLHTTPRequest和
DOM，如果所用数据格式为XML的话，还可以再加上XML这一项(Ajax从服务器端返回的数据可以是XML格式，也可以是文本等其他格式)。<br />
在旧的交互方式中,由用户触发一个HTTP请求到服务器,服务器对其进行处理后再返回一个新的HTHL页到客户端,每当服务器处理客户端提交的请求时,
客户都只能空闲等待,并且哪怕只是一次很小的交互、只需从服务器端得到很简单的一个数据,都要返回一个完整的HTML页,而用户每次都要浪费时间和带宽去
重新读取整个页面。<br />
而使用Ajax后用户从感觉上几乎所有的操作都会很快响应没有页面重载（白屏）的等待。<br />
<strong>1、XMLHTTPRequest</strong><br />
Ajax的一个最大的特点是无需刷新页面便可向服务器传输或读写数据(又称无刷新更新页面),这一特点主要得益于XMLHTTP组件
XMLHTTPRequest对象。这样就可以向再发桌面应用程序只同服务器进行数据层面的交换,而不用每次都刷新界面也不用每次将数据处理的工作提交给
服务器来做,这样即减轻了服务器的负担又加快了响应速度、缩短了用户等候时间。<br />
最早应用XMLHTTP的是微软,IE（IE5以上）通过允许
开发人员在Web页面内部使用XMLHTTP
ActiveX组件扩展自身的功能,开发人员可以不用从当前的Web页面导航而直接传输数据到服务器上或者从服务器取数据。这个功能是很重要的,因为它帮
助减少了无状态连接的痛苦,它还可以排除下载冗余HTML的需要,从而提高进程的速度。Mozilla（Mozilla1.0以上及NetScape7以
上）做出的回应是创建它自己的继承XML代理类：XMLHttpRequest类。Konqueror (和Safari
v1.2,同样也是基于KHTML的浏览器)也支持XMLHttpRequest对象,而Opera也将在其v7.6x+以后的版本中支持
XMLHttpRequest对象。对于大多数情况，XMLHttpRequest对象和XMLHTTP组件很相似,方法和属性也类似,只是有一小部分属
性不支持。<br />
XMLHttpRequest的应用：<br />
<div>XMLHttpRequest对象在JS中的应用<br />
var xmlhttp = new XMLHttpRequest();<br />
微软的XMLHTTP组件在JS中的应用<br />
var xmlhttp = new ActiveXObject(Microsoft.XMLHTTP);<br />
var xmlhttp = new ActiveXObject(Msxml2.XMLHTTP);<br />
</div>
XMLHttpRequest 对象方法<br />
<div>/**<br />
* Cross-browser XMLHttpRequest instantiation.<br />
*/<br />
<br />
if (typeof XMLHttpRequest == 'undefined') {<br />
XMLHttpRequest = function () {<br />
var msxmls = ['MSXML3', 'MSXML2', 'Microsoft']<br />
for (var i=0; i &lt; msxmls.length; i++) {<br />
try {<br />
return new ActiveXObject(msxmls[i]+'.XMLHTTP')<br />
} catch (e) { }<br />
}<br />
throw new Error("No XML component installed!")<br />
}<br />
}<br />
function createXMLHttpRequest() {<br />
try {<br />
// Attempt to create it "the Mozilla way" <br />
if (window.XMLHttpRequest) {<br />
return new XMLHttpRequest();<br />
}<br />
// Guess not - now the IE way<br />
if (window.ActiveXObject) {<br />
return new ActiveXObject(getXMLPrefix() + ".XmlHttp");<br />
}<br />
}<br />
catch (ex) {}<br />
return false;<br />
};<br />
</div>
<br />
XMLHttpRequest 对象方法
<table bgcolor="#cccccc" border="0" cellspacing="1" height="266" width="540">
    <tbody>
        <tr>
            <td><strong>方法</strong></td>
            <td><strong>描述</strong></td>
        </tr>
        <tr>
            <td>abort()</td>
            <td>停止当前请求</td>
        </tr>
        <tr>
            <td>getAllResponseHeaders()</td>
            <td>作为字符串返问完整的headers</td>
        </tr>
        <tr>
            <td>getResponseHeader("headerLabel")</td>
            <td>作为字符串返问单个的header标签</td>
        </tr>
        <tr>
            <td>open("method","URL"[,asyncFlag[,"userName"[, "password"]]])</td>
            <td>设置未决的请求的目标 URL, 方法, 和其他参数</td>
        </tr>
        <tr>
            <td>send(content)</td>
            <td>发送请求</td>
        </tr>
        <tr>
            <td>setRequestHeader("label", "value")</td>
            <td>设置header并和请求一起发送</td>
        </tr>
    </tbody>
</table>
<br />
XMLHttpRequest 对象属性
<table bgcolor="#cccccc" border="0" cellspacing="1" height="285" width="540">
    <tbody>
        <tr>
            <td><strong>属性</strong></td>
            <td><strong>描述</strong></td>
        </tr>
        <tr>
            <td>onreadystatechange</td>
            <td>状态改变的事件触发器</td>
        </tr>
        <tr>
            <td>readyState</td>
            <td>对象状态(integer):<br />
            0 = 未初始化<br />
            1 = 读取中<br />
            2 = 已读取<br />
            3 = 交互中<br />
            4 = 完成</td>
        </tr>
        <tr>
            <td>responseText</td>
            <td>服务器进程返回数据的文本版本</td>
        </tr>
        <tr>
            <td>responseXML</td>
            <td>服务器进程返回数据的兼容DOM的XML文档对象</td>
        </tr>
        <tr>
            <td>status</td>
            <td>服务器返回的状态码, 如：404 = "文件末找到" 、200 ="成功"</td>
        </tr>
        <tr>
            <td>statusText</td>
            <td>服务器返回的状态文本信息</td>
        </tr>
    </tbody>
</table>
<br />
<strong>2、JavaScript</strong><br />
JavaScript是一在浏览器中大量使用的编程语言，，他以前一直被贬低为一门糟糕的语言（他确实在使用上比较枯燥），以在常被用来作一些用来炫耀
的小玩意和恶作剧或是单调琐碎的表单验证。但事实是，他是一门真正的编程语言，有着自已的标准并在各种浏览器中被广泛支持。<br />
<strong>3、DOM</strong><br />
Document Object Model。<br />
DOM是给 HTML 和 XML 文件使用的一组 API。它提供了文件的结构表述，让你可以改变其中的內容及可见物。其本质是建立网页与 Script 或程序语言沟通的桥梁。<br />
所有WEB开发人员可操作及建立文件的属性、方法及事件都以对象来展现（例如，document 就代表&#8220;文件本身&#8220;这个对像，table 对象则代表 HTML 的表格对象等等）。这些对象可以由当今大多数的浏览器以 Script 来取用。<br />
一个用HTML或XHTML构建的网页也可以看作是一组结构化的数据，这些数据被封在DOM（Document Object Model）中，DOM提供了网页中各个对象的读写的支持。<br />
<strong>4、XML</strong><br />
可扩展的标记语言（Extensible Markup
Language）具有一种开放的、可扩展的、可自描述的语言结构，它已经成为网上数据和文档传输的标准。它是用来描述数据结构的一种语言，就正如他的名
字一样。他使对某些结构化数据的定义更加容易，并且可以通过他和其他应用程序交换数据。<br />
<strong>5、综合</strong><br />
Jesse James Garrett提到的Ajax引擎，实际上是一个比较复杂的JavaScript应用程序，用来处理用户请求，读写服务器和更改DOM内容。<br />
JavaScript的Ajax引擎读取信息，并且互动地重写DOM，这使网页能无缝化重构，也就是在页面已经下载完毕后改变页面内容，这是我们一直在
通过JavaScript和DOM在广泛使用的方法，但要使网页真正动态起来，不仅要内部的互动，还需要从外部获取数据，在以前，我们是让用户来输入数据
并通过DOM来改变网页内容的，但现在，XMLHTTPRequest，可以让我们在不重载页面的情况下读写服务器上的数据，使用户的输入达到最少。<br />
基于XML的网络通讯也并不是新事物，实际上FLASH和JAVA Applet都有不错的表现，现在这种富交互在网页上也可用了，基于标准化的并被广泛支持和技术，并且不需要插件或下载小程序。<br />
Ajax是传统WEB应用程序的一个转变。以前是服务器每次生成HTML页面并返回给客户端（浏览器）。在大多数网站中，很多页面中至少90%都是一样
的，比如：结构、格式、页头、页尾、广告等，所不同的只是一小部分的内容，但每次服务器都会生成所有的页面再返回给客户端，这无形之中是一种浪费，不管是
对于用户的时间、带宽、CPU耗用，还是对于ISP的高价租用的带宽和空间来说。如果按一页来算，只能几K或是几十K可能并不起眼，但像SINA每天要生
成几百万个页面的大ISP来说，可以说是损失巨大的。而<a href="javascript:void(0);" class="lore_glossary_term_link" onmouseover="return overlib('Ajax，是一种无刷新技术+异步交互，给用户的感觉是响应速度快、连续不断、体验丰富WEB应用。Ajax是Asynchronous JavaScript and XML的缩写。', CAPTION, 'AJAX', OFFSETX, 16, OFFSETY, 16, BGCLASS, 'lore_glossary_term_popup', FGCLASS, 'lore_glossary_term_popup_definition', TEXTFONTCLASS, 'lore_glossary_term_popup_definition', CAPTIONFONTCLASS, 'lore_glossary_term_popup_caption');" onmouseout="nd();">AJAX</a>可
以所为客户端和服务器的中间层，来处理客户端的请求，并根据需要向服务器端发送请求，用什么就取什么、用多少就取多少，就不会有数据的冗余和浪费，减少了
数据下载总量，而且更新页面时不用重载全部内容，只更新需要更新的那部分即可，相对于纯后台处理并重载的方式缩短了用户等待时间，也把对资源的浪费降到最
低，基于标准化的并被广泛支持和技术，并且不需要插件或下载小程序，所以Ajax对于用户和ISP来说是双盈的。<br />
Ajax使WEB中的界面与
应用分离（也可以说是数据与呈现分离），而在以前两者是没有清晰的界限的，数据与呈现分离的分离，有利于分工合作、减少非技术人员对页面的修改造成的
WEB应用程序错误、提高效率、也更加适用于现在的发布系统。也可以把以前的一些服务器负担的工作转嫁到客户端，利于客户端闲置的处理能力来处理。<br />
</div>
<div>四、应用</div>
<div>　　Ajax理念的出现，揭开了无刷新更新页面时代的序幕，并有代替传统web开发中采用form(表单)递交方式更新web页面的趋势，可以算是一个里程碑。但Ajax都不是适用于所有地方的，它的适用范围是由它的特性所决定的。<br />
举个应用的例子，是关于级联菜单方面的Ajax应用。<br />
我们以前的对级联菜单的处理是这样的：<br />
为了避免每次对菜单的操作引起的重载页面，不采用每次调用后台的方式，而是一次性将级联菜单的所有数据全部读取出来并写入数组，然后根据用户的操作用
JavaScript来控制它的子集项目的呈现，这样虽然解决了操作响应速度、不重载页面以及避免向服务器频繁发送请求的问题，但是如果用户不对菜单进行
操作或只对菜单中的一部分进行操作的话，那读取的数据中的一部分就会成为冗余数据而浪费用户的资源，特别是在菜单结构复杂、数据量大的情况下（比如菜单有
很多级、每一级菜又有上百个项目），这种弊端就更为突出。<br />
如果在此案中应用Ajax后，结果就会有所改观：<br />
在初始化页面时我们只
读出它的第一级的所有数据并显示，在用户操作一级菜单其中一项时，会通过Ajax向后台请求当前一级项目所属的二级子菜单的所有数据，如果再继续请求已经
呈现的二级菜单中的一项时，再向后面请求所操作二级菜单项对应的所有三级菜单的所有数据，以此类推&#8230;&#8230;这样，用什么就取什么、用多少就取多少，就不会有数
据的冗余和浪费，减少了数据下载总量，而且更新页面时不用重载全部内容，只更新需要更新的那部分即可，相对于后台处理并重载的方式缩短了用户等待时间，也
把对资源的浪费降到最低。<br />
此外，Ajax由于可以调用外部数据，也可以实现数据聚合的功能（当然要有相应授权），比如微软刚刚在3月15日发布的在线RSS阅读器BETA版；还可以利于一些开放的数据，开发自已的一些应用程序，比如用Amazon的数据作的一些新颖的图书搜索应用。<br />
总之，Ajax适用于交互较多，频繁读数据，数据分类良好的WEB应用。<br />
</div>
<div>五、Ajax的优势</div>
<div>　　<strong>1、减轻服务器的负担。因为Ajax的根本理念是&#8220;按需取数据&#8221;，所以最大可能在减少了冗余请求和响影对服务器造成的负担；</strong><br />
<strong>2、无刷新更新页面，减少用户实际和心理等待时间；</strong><br />
首先，&#8220;按需取数据&#8221;的模式减少了数据的实际读取量，打个很形象的比方，如果说重载的方式是从一个终点回到原点再到另一个终点的话，那么Ajax就是以一个终点为基点到达另一个终点；<br />
<div align="center"><img src="http://www.dragonson.com/doc/images/ajax_00.gif" alt="重载方式" height="117" width="244" /><br />
图5－1 <br />
<br />
<img src="http://www.dragonson.com/doc/images/ajax_01.gif" alt="Ajax方式" height="59" width="244" /> <br />
图5－2 </div>
其次，即使要读取比较大的数据，也不用像RELOAD一样出现白屏的情况，由于Ajax是用XMLHTTP发送请求得到服务端应答数据，在不重新载入整
个页面的情况下用Javascript操作DOM最终更新页面的，所以在读取数据的过程中，用户所面对的也不是白屏，而是原来的页面状态（或者可以加一个
LOADING的提示框让用户了解数据读取的状态），只有当接收到全部数据后才更新相应部分的内容，而这种更新也是瞬间的，用户几乎感觉不到。总之用户是
很敏感的，他们能感觉到你对他们的体贴，虽然不太可能立竿见影的效果，但会在用户的心中一点一滴的积累他们对网站的依赖。<br />
<strong>3、更好的用户体验；</strong><br />
<strong>4、也可以把以前的一些服务器负担的工作转嫁到客户端，利于客户端闲置的处理能力来处理，减轻服务器和带宽的负担，节约空间和带宽租用成本；</strong><br />
<strong>5、Ajax由于可以调用外部数据；</strong><br />
<strong>6、基于标准化的并被广泛支持和技术，并且不需要插件或下载小程序；</strong><br />
<strong>7、Ajax使WEB中的界面与应用分离（也可以说是数据与呈现分离）；</strong><br />
<strong>8、对于用户和ISP来说是双盈的。</strong><br />
</div>
<div>六、Ajax的问题</div>
<div>　　1、一些手持设备（如手机、PDA等）现在还不能很好的支持Ajax；<br />
2、用JavaScript作的Ajax引擎，JavaScript的兼容性和DeBug都是让人头痛的事；<br />
3、Ajax的无刷新重载，由于页面的变化没有刷新重载那么明显，所以容易给用户带来困扰――用户不太清楚现在的数据是新的还是已经更新过的；现有的解决有：在相关位置提示、数据更新的区域设计得比较明显、数据更新后给用户提示等；<br />
4、对流媒体的支持没有FLASH、Java Applet好；<br />
</div>
<div>七、结束语</div>
<div>　　更好的Ajax应用，需要更多的客户端的开发，和对当前的WEB应用理念的思考，而且良好的用户体验，来源于为处处用户考虑的理念，而不单纯是某种技术。<br />
<br />
url:http://100000.myabc.cn/home/Blog/view/148.htm</div>
<img src ="http://www.blogjava.net/jaunt/aggbug/151846.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jaunt/" target="_blank">Jaunt</a> 2007-10-10 18:04 <a href="http://www.blogjava.net/jaunt/archive/2007/10/10/151846.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>prototype 源码中文说明之 prototype.js(转)</title><link>http://www.blogjava.net/jaunt/archive/2007/10/10/151826.html</link><dc:creator>Jaunt</dc:creator><author>Jaunt</author><pubDate>Wed, 10 Oct 2007 09:18:00 GMT</pubDate><guid>http://www.blogjava.net/jaunt/archive/2007/10/10/151826.html</guid><wfw:comment>http://www.blogjava.net/jaunt/comments/151826.html</wfw:comment><comments>http://www.blogjava.net/jaunt/archive/2007/10/10/151826.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jaunt/comments/commentRss/151826.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jaunt/services/trackbacks/151826.html</trackback:ping><description><![CDATA[<div>
<div>/** <br />
&nbsp;* 定义一个全局对象, 属性 Version 在发布的时候会替换为当前版本号 <br />
&nbsp;*/ <br />
var Prototype = { <br />
&nbsp;Version: '@@VERSION@@' <br />
} <br />
<br />
/** <br />
&nbsp;* 创建一种类型，注意其属性 create 是一个方法，返回一个构造函数。 <br />
&nbsp;* 一般使用如下 <br />
&nbsp;* var X = Class.create(); 返回一个类型，类似于 java 的一个Class实例。 <br />
&nbsp;* 要使用 X 类型，需继续用 new X()来获取一个实例，如同 java 的 Class.newInstance()方法。 <br />
&nbsp;* <br />
&nbsp;* 返回的构造函数会执行名为 initialize 的方法， initialize 是 Ruby 对象的构造器方法名字。 <br />
&nbsp;* 此时initialize方法还没有定义，其后的代码中创建新类型时会建立相应的同名方法。 <br />
&nbsp;* <br />
&nbsp;* 如果一定要从java上去理解。你可以理解为用Class.create()创建一个继承java.lang.Class类的类。当然java不允许这样做，因为Class类是final的 <br />
&nbsp;* <br />
&nbsp;*/ <br />
var Class = { <br />
&nbsp;create: function() { <br />
&nbsp;return function() { <br />
&nbsp;this.initialize.apply(this, arguments); <br />
&nbsp;} <br />
&nbsp;} <br />
} <br />
<br />
/** <br />
&nbsp;* 创建一个对象，从变量名来思考，本意也许是定义一个抽象类，以后创建新对象都 extend 它。 <br />
&nbsp;* 但从其后代码的应用来看， Abstract 更多是为了保持命名空间清晰的考虑。 <br />
&nbsp;* 也就是说，我们可以给 Abstract 这个对象实例添加新的对象定义。 <br />
&nbsp;* <br />
&nbsp;* 从java去理解，就是动态给一个对象创建内部类。 <br />
&nbsp;*/ <br />
var Abstract = new Object(); <br />
<br />
/** <br />
&nbsp;* 获取参数对象的所有属性和方法，有点象多重继承。但是这种继承是动态获得的。 <br />
&nbsp;* 如： <br />
&nbsp;* var a = new ObjectA(), b = new ObjectB(); <br />
&nbsp;* var c = a.extend(b); <br />
&nbsp;* 此时 c 对象同时拥有 a 和 b 对象的属性和方法。但是与多重继承不同的是，c instanceof ObjectB 将返回false。 <br />
&nbsp;*/ <br />
Object.prototype.extend = function(object) { <br />
&nbsp;for (property in object) { <br />
&nbsp;this[property] = object[property]; <br />
&nbsp;} <br />
&nbsp;return this; <br />
} <br />
<br />
/** <br />
&nbsp;* 这个方法很有趣，它封装一个javascript函数对象，返回一个新函数对象，新函数对象的主体和原对象相同，但是bind()方法参数将被用作当前对象的对象。 <br />
&nbsp;* 也就是说新函数中的 this 引用被改变为参数提供的对象。 <br />
&nbsp;* 比如： <br />
&nbsp;* &lt;input type="text" id="aaa" value="aaa"&gt; <br />
&nbsp;* &lt;input type="text" id="bbb" value="bbb"&gt; <br />
&nbsp;* ................. <br />
&nbsp;* &lt;script&gt; <br />
&nbsp;* var aaa = document.getElementById("aaa"); <br />
&nbsp;* var bbb = document.getElementById("bbb"); <br />
&nbsp;* aaa.showValue = function() {alert(this.value);} <br />
&nbsp;* aaa.showValue2 = aaa.showValue.bind(bbb); <br />
&nbsp;* &lt;/script&gt; <br />
&nbsp;* 那么，调用aaa.showValue 将返回"aaa", 但调用aaa.showValue2 将返回"bbb"。 <br />
&nbsp;* <br />
&nbsp;* apply 是ie5.5后才出现的新方法(Netscape好像很早就支持了)。 <br />
&nbsp;* 该方法更多的资料参考MSDN http://msdn.microsoft.com/library/en-us/script56/html/js56jsmthApply.asp <br />
&nbsp;* 还有一个 call 方法，应用起来和 apply 类似。可以一起研究下。 <br />
&nbsp;*/ <br />
Function.prototype.bind = function(object) { <br />
&nbsp;var method = this; <br />
&nbsp;return function() { <br />
&nbsp;method.apply(object, arguments); <br />
&nbsp;} <br />
} <br />
<br />
/** <br />
&nbsp;* 和bind一样，不过这个方法一般用做html控件对象的事件处理。所以要传递event对象 <br />
&nbsp;* 注意这时候，用到了 Function.call。它与 Function.apply 的不同好像仅仅是对参数形式的定义。 <br />
&nbsp;* 如同 java 两个过载的方法。 <br />
&nbsp;*/ <br />
Function.prototype.bindAsEventListener = function(object) { <br />
&nbsp;var method = this; <br />
&nbsp;return function(event) { <br />
&nbsp;method.call(object, event || window.event); <br />
&nbsp;} <br />
} <br />
<br />
/** <br />
&nbsp;* 将整数形式RGB颜色值转换为HEX形式 <br />
&nbsp;*/ <br />
Number.prototype.toColorPart = function() { <br />
&nbsp;var digits = this.toString(16); <br />
&nbsp;if (this &lt; 16) return '0' + digits; <br />
&nbsp;return digits; <br />
} <br />
<br />
/** <br />
&nbsp;* 典型 Ruby 风格的函数，将参数中的方法逐个调用，返回第一个成功执行的方法的返回值 <br />
&nbsp;*/ <br />
var Try = { <br />
&nbsp;these: function() { <br />
&nbsp;var returnValue; <br />
&nbsp;<br />
&nbsp;for (var i = 0; i &lt; arguments.length; i++) { <br />
&nbsp;var lambda = arguments[i]; <br />
&nbsp;try { <br />
&nbsp;returnValue = lambda(); <br />
&nbsp;break; <br />
&nbsp;} catch (e) {} <br />
&nbsp;} <br />
&nbsp;<br />
&nbsp;return returnValue; <br />
&nbsp;} <br />
} <br />
<br />
/*--------------------------------------------------------------------------*/ <br />
<br />
/** <br />
&nbsp;* 一个设计精巧的定时执行器 <br />
&nbsp;* 首先由 Class.create() 创建一个 PeriodicalExecuter 类型， <br />
&nbsp;* 然后用对象直接量的语法形式设置原型。 <br />
&nbsp;* <br />
&nbsp;* 需要特别说明的是 rgisterCallback 方法，它调用上面定义的函数原型方法bind, 并传递自己为参数。 <br />
&nbsp;* 之所以这样做，是因为 setTimeout 默认总以 window 对象为当前对象，也就是说，如果 registerCallback 方法定义如下的话： <br />
&nbsp;* registerCallback: function() { <br />
&nbsp;* setTimeout(this.onTimerEvent, this.frequency * 1000); <br />
&nbsp;* } <br />
&nbsp;* 那么，this.onTimeoutEvent 方法执行失败，因为它无法访问 this.currentlyExecuting 属性。 <br />
&nbsp;* 而使用了bind以后，该方法才能正确的找到this，也就是PeriodicalExecuter的当前实例。 <br />
&nbsp;*/ <br />
var PeriodicalExecuter = Class.create(); <br />
PeriodicalExecuter.prototype = { <br />
&nbsp;initialize: function(callback, frequency) { <br />
&nbsp;this.callback = callback; <br />
&nbsp;this.frequency = frequency; <br />
&nbsp;this.currentlyExecuting = false; <br />
&nbsp;<br />
&nbsp;this.registerCallback(); <br />
&nbsp;}, <br />
&nbsp;<br />
&nbsp;registerCallback: function() { <br />
&nbsp;setTimeout(this.onTimerEvent.bind(this), this.frequency * 1000); <br />
&nbsp;}, <br />
&nbsp;<br />
&nbsp;onTimerEvent: function() { <br />
&nbsp;if (!this.currentlyExecuting) { <br />
&nbsp;try { <br />
&nbsp;this.currentlyExecuting = true; <br />
&nbsp;this.callback(); <br />
&nbsp;} finally { <br />
&nbsp;this.currentlyExecuting = false; <br />
&nbsp;} <br />
&nbsp;} <br />
&nbsp;<br />
&nbsp;this.registerCallback(); <br />
&nbsp;} <br />
} <br />
<br />
/*--------------------------------------------------------------------------*/ <br />
<br />
/** <br />
&nbsp;* 这个函数就 Ruby 了。我觉得它的作用主要有两个 <br />
&nbsp;* 1. 大概是 document.getElementById(id) 的最简化调用。 <br />
&nbsp;* 比如：$("aaa") 将返回上 aaa 对象 <br />
&nbsp;* 2. 得到对象数组 <br />
&nbsp;* 比如: $("aaa","bbb") 返回一个包括id为"aaa"和"bbb"两个input控件对象的数组。 <br />
&nbsp;*/ <br />
function $() { <br />
&nbsp;var elements = new Array(); <br />
&nbsp;<br />
&nbsp;for (var i = 0; i &lt; arguments.length; i++) { <br />
&nbsp;var element = arguments[i]; <br />
&nbsp;if (typeof element == 'string') <br />
&nbsp;element = document.getElementById(element); <br />
<br />
&nbsp;if (arguments.length == 1) <br />
&nbsp;return element; <br />
&nbsp;<br />
&nbsp;elements.push(element); <br />
&nbsp;} <br />
&nbsp;<br />
&nbsp;return elements; <br />
} <br />
/** <br />
&nbsp;* 定义 Ajax 对象, 静态方法 getTransport 方法返回一个 XMLHttp 对象 <br />
&nbsp;*/ <br />
var Ajax = { <br />
&nbsp;getTransport: function() { <br />
&nbsp;return Try.these( <br />
&nbsp;function() {return new ActiveXObject('Msxml2.XMLHTTP')}, <br />
&nbsp;function() {return new ActiveXObject('Microsoft.XMLHTTP')}, <br />
&nbsp;function() {return new XMLHttpRequest()} <br />
&nbsp;) || false; <br />
&nbsp;}, <br />
&nbsp;<br />
&nbsp;emptyFunction: function() {} <br />
} <br />
<br />
/** <br />
&nbsp;* 我以为此时的Ajax对象起到命名空间的作用。 <br />
&nbsp;* Ajax.Base 声明为一个基础对象类型 <br />
&nbsp;* 注意 Ajax.Base 并没有使用 Class.create() 的方式来创建，我想是因为作者并不希望 Ajax.Base 被库使用者实例化。 <br />
&nbsp;* 作者在其他对象类型的声明中，将会继承于它。 <br />
&nbsp;* 就好像 java 中的私有抽象类 <br />
&nbsp;*/ <br />
Ajax.Base = function() {}; <br />
Ajax.Base.prototype = { <br />
&nbsp;/** <br />
&nbsp;* extend (见prototype.js中的定义) 的用法真是让人耳目一新 <br />
&nbsp;* options 首先设置默认属性，然后再 extend 参数对象，那么参数对象中也有同名的属性，那么就覆盖默认属性值。 <br />
&nbsp;* 想想如果我写这样的实现，应该类似如下： <br />
&nbsp;setOptions: function(options) { <br />
&nbsp;this.options.methed = options.methed? options.methed : 'post'; <br />
&nbsp;.......... <br />
&nbsp;} <br />
&nbsp;我想很多时候，java 限制了 js 的创意。 <br />
&nbsp;*/ <br />
&nbsp;setOptions: function(options) { <br />
&nbsp;this.options = { <br />
&nbsp;method: 'post', <br />
&nbsp;asynchronous: true, <br />
&nbsp;parameters: '' <br />
&nbsp;}.extend(options || {}); <br />
&nbsp;} <br />
} <br />
<br />
/** <br />
&nbsp;* Ajax.Request 封装 XmlHttp <br />
&nbsp;*/ <br />
Ajax.Request = Class.create(); <br />
<br />
/** <br />
&nbsp;* 定义四种事件(状态)， 参考http://msdn.microsoft.com/workshop/author/dhtml/reference/properties/readystate_1.asp <br />
&nbsp;*/ <br />
Ajax.Request.Events = <br />
&nbsp;['Uninitialized', 'Loading', 'Loaded', 'Interactive', 'Complete']; <br />
<br />
/** <br />
&nbsp;* <br />
&nbsp;*/ <br />
Ajax.Request.prototype = (new Ajax.Base()).extend({ <br />
&nbsp;initialize: function(url, options) { <br />
&nbsp;this.transport = Ajax.getTransport(); <br />
&nbsp;this.setOptions(options); <br />
&nbsp;<br />
&nbsp;try { <br />
&nbsp;if (this.options.method == 'get') <br />
&nbsp;url += '?' + this.options.parameters + '&amp;_='; <br />
&nbsp;<br />
&nbsp;/** <br />
&nbsp;* 此处好像强制使用了异步方式，而不是依照 this.options.asynchronous 的值 <br />
&nbsp;*/ <br />
&nbsp;this.transport.open(this.options.method, url, true); <br />
&nbsp;<br />
&nbsp;/** <br />
&nbsp;* 这里提供了 XmlHttp 传输过程中每个步骤的回调函数 <br />
&nbsp;*/ <br />
&nbsp;if (this.options.asynchronous) { <br />
&nbsp;this.transport.onreadystatechange = this.onStateChange.bind(this); <br />
&nbsp;setTimeout((function() {this.respondToReadyState(1)}).bind(this), 10); <br />
&nbsp;} <br />
&nbsp;<br />
&nbsp;this.transport.setRequestHeader('X-Requested-With', 'XMLHttpRequest'); <br />
&nbsp;this.transport.setRequestHeader('X-Prototype-Version', Prototype.Version); <br />
<br />
&nbsp;if (this.options.method == 'post') { <br />
&nbsp;this.transport.setRequestHeader('Connection', 'close'); <br />
&nbsp;this.transport.setRequestHeader('Content-type', <br />
&nbsp;'application/x-www-form-urlencoded'); <br />
&nbsp;} <br />
&nbsp;<br />
&nbsp;this.transport.send(this.options.method == 'post' ? <br />
&nbsp;this.options.parameters + '&amp;_=' : null); <br />
&nbsp;<br />
&nbsp;} catch (e) { <br />
&nbsp;} <br />
&nbsp;}, <br />
&nbsp;<br />
&nbsp;onStateChange: function() { <br />
&nbsp;var readyState = this.transport.readyState; <br />
&nbsp;/** <br />
&nbsp;* 如果不是 Loading 状态，就调用回调函数 <br />
&nbsp;*/ <br />
&nbsp;if (readyState != 1) <br />
&nbsp;this.respondToReadyState(this.transport.readyState); <br />
&nbsp;}, <br />
&nbsp;<br />
&nbsp;/** <br />
&nbsp;* 回调函数定义在 this.options 属性中，比如: <br />
&nbsp;var option = { <br />
&nbsp;onLoaded : function(req) {...}; <br />
&nbsp;...... <br />
&nbsp;} <br />
&nbsp;new Ajax.Request(url, option); <br />
&nbsp;*/ <br />
&nbsp;respondToReadyState: function(readyState) { <br />
&nbsp;var event = Ajax.Request.Events[readyState]; <br />
&nbsp;(this.options['on' + event] || Ajax.emptyFunction)(this.transport); <br />
&nbsp;} <br />
}); <br />
<br />
/** <br />
&nbsp;* Ajax.Updater 用于绑定一个html元素与 XmlHttp调用的返回值。类似与 buffalo 的 bind。 <br />
&nbsp;* 如果 options 中有 insertion(from dom.js) 对象的话, insertion 能提供更多的插入控制。 <br />
&nbsp;*/ <br />
Ajax.Updater = Class.create(); <br />
Ajax.Updater.prototype = (new Ajax.Base()).extend({ <br />
&nbsp;initialize: function(container, url, options) { <br />
&nbsp;this.container = $(container); <br />
&nbsp;this.setOptions(options); <br />
&nbsp;<br />
&nbsp;if (this.options.asynchronous) { <br />
&nbsp;this.onComplete = this.options.onComplete; <br />
&nbsp;this.options.onComplete = this.updateContent.bind(this); <br />
&nbsp;} <br />
&nbsp;<br />
&nbsp;this.request = new Ajax.Request(url, this.options); <br />
&nbsp;<br />
&nbsp;if (!this.options.asynchronous) <br />
&nbsp;this.updateContent(); <br />
&nbsp;}, <br />
&nbsp;<br />
&nbsp;updateContent: function() { <br />
&nbsp;if (this.options.insertion) { <br />
&nbsp;new this.options.insertion(this.container, <br />
&nbsp;this.request.transport.responseText); <br />
&nbsp;} else { <br />
&nbsp;this.container.innerHTML = this.request.transport.responseText; <br />
&nbsp;} <br />
<br />
&nbsp;if (this.onComplete) { <br />
&nbsp;setTimeout((function() {this.onComplete(this.request)}).bind(this), 10); <br />
&nbsp;} <br />
&nbsp;} <br />
}); <br />
/** <br />
&nbsp;* 针对 页面元素对象 的工具类，提供一些简单静态方法 <br />
&nbsp;*/ <br />
var Field = { <br />
&nbsp;/** <br />
&nbsp;* 清除参数引用对象的值 <br />
&nbsp;*/ <br />
&nbsp;clear: function() { <br />
&nbsp;for (var i = 0; i &lt; arguments.length; i++) <br />
&nbsp;$(arguments[i]).value = ''; <br />
&nbsp;}, <br />
<br />
&nbsp;/** <br />
&nbsp;* 使参数引用对象获取焦点 <br />
&nbsp;*/ <br />
&nbsp;focus: function(element) { <br />
&nbsp;$(element).focus(); <br />
&nbsp;}, <br />
&nbsp;<br />
&nbsp;/** <br />
&nbsp;* 判断参数引用对象值是否为空，如为空，返回false, 反之true <br />
&nbsp;*/ <br />
&nbsp;present: function() { <br />
&nbsp;for (var i = 0; i &lt; arguments.length; i++) <br />
&nbsp;if ($(arguments[i]).value == '') return false; <br />
&nbsp;return true; <br />
&nbsp;}, <br />
&nbsp;<br />
&nbsp;/** <br />
&nbsp;* 使选中参数引用对象 <br />
&nbsp;*/ <br />
&nbsp;select: function(element) { <br />
&nbsp;$(element).select(); <br />
&nbsp;}, <br />
<br />
&nbsp;/** <br />
&nbsp;* 使参数引用对象处于可编辑状态 <br />
&nbsp;*/ <br />
&nbsp;activate: function(element) { <br />
&nbsp;$(element).focus(); <br />
&nbsp;$(element).select(); <br />
&nbsp;} <br />
} <br />
<br />
/*--------------------------------------------------------------------------*/ <br />
<br />
/** <br />
&nbsp;* 表单工具类 <br />
&nbsp;*/ <br />
var Form = { <br />
&nbsp;/** <br />
&nbsp;* 将表单元素序列化后的值组合成 QueryString 的形式 <br />
&nbsp;*/ <br />
&nbsp;serialize: function(form) { <br />
&nbsp;var elements = Form.getElements($(form)); <br />
&nbsp;var queryComponents = new Array(); <br />
&nbsp;<br />
&nbsp;for (var i = 0; i &lt; elements.length; i++) { <br />
&nbsp;var queryComponent = Form.Element.serialize(elements[i]); <br />
&nbsp;if (queryComponent) <br />
&nbsp;queryComponents.push(queryComponent); <br />
&nbsp;} <br />
&nbsp;<br />
&nbsp;return queryComponents.join('&amp;'); <br />
&nbsp;}, <br />
&nbsp;<br />
&nbsp;/** <br />
&nbsp;* 得到表单的所有元素对象 <br />
&nbsp;*/ <br />
&nbsp;getElements: function(form) { <br />
&nbsp;form = $(form); <br />
&nbsp;var elements = new Array(); <br />
<br />
&nbsp;for (tagName in Form.Element.Serializers) { <br />
&nbsp;var tagElements = form.getElementsByTagName(tagName); <br />
&nbsp;for (var j = 0; j &lt; tagElements.length; j++) <br />
&nbsp;elements.push(tagElements[j]); <br />
&nbsp;} <br />
&nbsp;return elements; <br />
&nbsp;}, <br />
&nbsp;<br />
&nbsp;/** <br />
&nbsp;* 将指定表单的元素置于不可用状态 <br />
&nbsp;*/ <br />
&nbsp;disable: function(form) { <br />
&nbsp;var elements = Form.getElements(form); <br />
&nbsp;for (var i = 0; i &lt; elements.length; i++) { <br />
&nbsp;var element = elements[i]; <br />
&nbsp;element.blur(); <br />
&nbsp;element.disable = 'true'; <br />
&nbsp;} <br />
&nbsp;}, <br />
<br />
&nbsp;/** <br />
&nbsp;* 使表单的第一个非 hidden 类型而且处于可用状态的元素获得焦点 <br />
&nbsp;*/ <br />
&nbsp;focusFirstElement: function(form) { <br />
&nbsp;form = $(form); <br />
&nbsp;var elements = Form.getElements(form); <br />
&nbsp;for (var i = 0; i &lt; elements.length; i++) { <br />
&nbsp;var element = elements[i]; <br />
&nbsp;if (element.type != 'hidden' &amp;&amp; !element.disabled) { <br />
&nbsp;Field.activate(element); <br />
&nbsp;break; <br />
&nbsp;} <br />
&nbsp;} <br />
&nbsp;}, <br />
<br />
&nbsp;/* <br />
&nbsp;* 重置表单 <br />
&nbsp;*/ <br />
&nbsp;reset: function(form) { <br />
&nbsp;$(form).reset(); <br />
&nbsp;} <br />
} <br />
<br />
/** <br />
&nbsp;* 表单元素工具类 <br />
&nbsp;*/ <br />
Form.Element = { <br />
&nbsp;/** <br />
&nbsp;* 返回表单元素的值先序列化再进行 URL 编码后的值 <br />
&nbsp;*/ <br />
&nbsp;serialize: function(element) { <br />
&nbsp;element = $(element); <br />
&nbsp;var method = element.tagName.toLowerCase(); <br />
&nbsp;var parameter = Form.Element.Serializers[method](element); <br />
&nbsp;<br />
&nbsp;if (parameter) <br />
&nbsp;return encodeURIComponent(parameter[0]) + '=' + <br />
&nbsp;encodeURIComponent(parameter[1]); <br />
&nbsp;}, <br />
&nbsp;<br />
&nbsp;/** <br />
&nbsp;* 返回表单元素序列化后的值 <br />
&nbsp;*/ <br />
&nbsp;getValue: function(element) { <br />
&nbsp;element = $(element); <br />
&nbsp;var method = element.tagName.toLowerCase(); <br />
&nbsp;var parameter = Form.Element.Serializers[method](element); <br />
&nbsp;<br />
&nbsp;if (parameter) <br />
&nbsp;return parameter[1]; <br />
&nbsp;} <br />
} <br />
<br />
/** <br />
&nbsp;* prototype 的所谓序列化其实就是将表单的名字和值组合成一个数组 <br />
&nbsp;*/ <br />
Form.Element.Serializers = { <br />
&nbsp;input: function(element) { <br />
&nbsp;switch (element.type.toLowerCase()) { <br />
&nbsp;case 'hidden': <br />
&nbsp;case 'password': <br />
&nbsp;case 'text': <br />
&nbsp;return Form.Element.Serializers.textarea(element); <br />
&nbsp;case 'checkbox': <br />
&nbsp;case 'radio': <br />
&nbsp;return Form.Element.Serializers.inputSelector(element); <br />
&nbsp;} <br />
&nbsp;return false; <br />
&nbsp;}, <br />
&nbsp;<br />
&nbsp;inputSelector: function(element) { <br />
&nbsp;if (element.checked) <br />
&nbsp;return [element.name, element.value]; <br />
&nbsp;}, <br />
<br />
&nbsp;textarea: function(element) { <br />
&nbsp;return [element.name, element.value]; <br />
&nbsp;}, <br />
<br />
&nbsp;/** <br />
&nbsp;* 看样子，也不支持多选框(select-multiple) <br />
&nbsp;*/ <br />
&nbsp;select: function(element) { <br />
&nbsp;var index = element.selectedIndex; <br />
&nbsp;var value = element.options[index].value || element.options[index].text; <br />
&nbsp;return [element.name, (index &gt;= 0) ? value : '']; <br />
&nbsp;} <br />
} <br />
<br />
/*--------------------------------------------------------------------------*/ <br />
<br />
/** <br />
&nbsp;* Form.Element.getValue 也许会经常用到，所以做了一个快捷引用 <br />
&nbsp;*/ <br />
var $F = Form.Element.getValue; <br />
<br />
/*--------------------------------------------------------------------------*/ <br />
<br />
/** <br />
&nbsp;* Abstract.TimedObserver 也没有用 Class.create() 来创建，和Ajax.Base 意图应该一样 <br />
&nbsp;* Abstract.TimedObserver 顾名思义，是套用Observer设计模式来跟踪指定表单元素， <br />
&nbsp;* 当表单元素的值发生变化的时候，就执行回调函数 <br />
&nbsp;* <br />
&nbsp;* 我想　Observer 与注册onchange事件相似，不同点在于 onchange 事件是在元素失去焦点的时候才激发。 <br />
&nbsp;* 同样的与 onpropertychange 事件也相似，不过它只关注表单元素的值的变化，而且提供timeout的控制。 <br />
&nbsp;* <br />
&nbsp;* 除此之外，Observer 的好处大概就在与更面向对象，另外可以动态的更换回调函数，这就比注册事件要灵活一些。 <br />
&nbsp;* Observer 应该可以胜任动态数据校验，或者多个关联下拉选项列表的连动等等 <br />
&nbsp;* <br />
&nbsp;*/ <br />
Abstract.TimedObserver = function() {} <br />
<br />
/** <br />
&nbsp;* 这个设计和 PeriodicalExecuter 一样，bind 方法是实现的核心 <br />
&nbsp;*/ <br />
Abstract.TimedObserver.prototype = { <br />
&nbsp;initialize: function(element, frequency, callback) { <br />
&nbsp;this.frequency = frequency; <br />
&nbsp;this.element = $(element); <br />
&nbsp;this.callback = callback; <br />
&nbsp;<br />
&nbsp;this.lastValue = this.getValue(); <br />
&nbsp;this.registerCallback(); <br />
&nbsp;}, <br />
&nbsp;<br />
&nbsp;registerCallback: function() { <br />
&nbsp;setTimeout(this.onTimerEvent.bind(this), this.frequency * 1000); <br />
&nbsp;}, <br />
&nbsp;<br />
&nbsp;onTimerEvent: function() { <br />
&nbsp;var value = this.getValue(); <br />
&nbsp;if (this.lastValue != value) { <br />
&nbsp;this.callback(this.element, value); <br />
&nbsp;this.lastValue = value; <br />
&nbsp;} <br />
&nbsp;<br />
&nbsp;this.registerCallback(); <br />
&nbsp;} <br />
} <br />
<br />
/** <br />
&nbsp;* Form.Element.Observer 和 Form.Observer 其实是一样的 <br />
&nbsp;* 注意 Form.Observer 并不是用来跟踪整个表单的，我想大概只是为了减少书写(这是Ruby的一个设计原则) <br />
&nbsp;*/ <br />
Form.Element.Observer = Class.create(); <br />
Form.Element.Observer.prototype = (new Abstract.TimedObserver()).extend({ <br />
&nbsp;getValue: function() { <br />
&nbsp;return Form.Element.getValue(this.element); <br />
&nbsp;} <br />
}); <br />
<br />
Form.Observer = Class.create(); <br />
Form.Observer.prototype = (new Abstract.TimedObserver()).extend({ <br />
&nbsp;getValue: function() { <br />
&nbsp;return Form.serialize(this.element); <br />
&nbsp;} <br />
}); <br />
<br />
/** <br />
&nbsp;* 根据 class attribute 的名字得到对象数组，支持 multiple class <br />
&nbsp;* <br />
&nbsp;*/ <br />
document.getElementsByClassName = function(className) { <br />
&nbsp;var children = document.getElementsByTagName('*') || document.all; <br />
&nbsp;var elements = new Array(); <br />
&nbsp;<br />
&nbsp;for (var i = 0; i &lt; children.length; i++) { <br />
&nbsp;var child = children[i]; <br />
&nbsp;var classNames = child.className.split(' '); <br />
&nbsp;for (var j = 0; j &lt; classNames.length; j++) { <br />
&nbsp;if (classNames[j] == className) { <br />
&nbsp;elements.push(child); <br />
&nbsp;break; <br />
&nbsp;} <br />
&nbsp;} <br />
&nbsp;} <br />
&nbsp;<br />
&nbsp;return elements; <br />
} <br />
<br />
/*--------------------------------------------------------------------------*/ <br />
<br />
/** <br />
&nbsp;* Element 就象一个 java 的工具类，主要用来 隐藏/显示/销除 对象，以及获取对象的简单属性。 <br />
&nbsp;* <br />
&nbsp;*/ <br />
var Element = { <br />
&nbsp;toggle: function() { <br />
&nbsp;for (var i = 0; i &lt; arguments.length; i++) { <br />
&nbsp;var element = $(arguments[i]); <br />
&nbsp;element.style.display = <br />
&nbsp;(element.style.display == 'none' ? '' : 'none'); <br />
&nbsp;} <br />
&nbsp;}, <br />
<br />
&nbsp;hide: function() { <br />
&nbsp;for (var i = 0; i &lt; arguments.length; i++) { <br />
&nbsp;var element = $(arguments[i]); <br />
&nbsp;element.style.display = 'none'; <br />
&nbsp;} <br />
&nbsp;}, <br />
<br />
&nbsp;show: function() { <br />
&nbsp;for (var i = 0; i &lt; arguments.length; i++) { <br />
&nbsp;var element = $(arguments[i]); <br />
&nbsp;element.style.display = ''; <br />
&nbsp;} <br />
&nbsp;}, <br />
<br />
&nbsp;remove: function(element) { <br />
&nbsp;element = $(element); <br />
&nbsp;element.parentNode.removeChild(element); <br />
&nbsp;}, <br />
&nbsp;<br />
&nbsp;getHeight: function(element) { <br />
&nbsp;element = $(element); <br />
&nbsp;return element.offsetHeight; <br />
&nbsp;} <br />
} <br />
<br />
/** <br />
&nbsp;* 为 Element.toggle 做了一个符号连接，大概是兼容性的考虑 <br />
&nbsp;*/ <br />
var Toggle = new Object(); <br />
Toggle.display = Element.toggle; <br />
<br />
/*--------------------------------------------------------------------------*/ <br />
<br />
/** <br />
&nbsp;*
动态插入内容的实现，MS的Jscript实现中对象有一个 insertAdjacentHTML
方法(http:
//msdn.microsoft.com/workshop/author/dhtml/reference/methods/insertadjacenthtml.asp)
<br />
&nbsp;* 这里算是一个对象形式的封装。 <br />
&nbsp;*/ <br />
Abstract.Insertion = function(adjacency) { <br />
&nbsp;this.adjacency = adjacency; <br />
} <br />
<br />
Abstract.Insertion.prototype = { <br />
&nbsp;initialize: function(element, content) { <br />
&nbsp;this.element = $(element); <br />
&nbsp;this.content = content; <br />
&nbsp;<br />
&nbsp;if (this.adjacency &amp;&amp; this.element.insertAdjacentHTML) { <br />
&nbsp;this.element.insertAdjacentHTML(this.adjacency, this.content); <br />
&nbsp;} else { <br />
&nbsp;/** <br />
&nbsp;* gecko 不支持 insertAdjacentHTML 方法，但可以用如下代码代替 <br />
&nbsp;*/ <br />
&nbsp;this.range = this.element.ownerDocument.createRange(); <br />
&nbsp;/** <br />
&nbsp;* 如果定义了 initializeRange 方法，则实行，这里相当与定义了一个抽象的 initializeRange 方法 <br />
&nbsp;*/ <br />
&nbsp;if (this.initializeRange) this.initializeRange(); <br />
&nbsp;this.fragment = this.range.createContextualFragment(this.content); <br />
<br />
&nbsp;/** <br />
&nbsp;* insertContent 也是一个抽象方法，子类必须实现 <br />
&nbsp;*/ <br />
&nbsp;this.insertContent(); <br />
&nbsp;} <br />
&nbsp;} <br />
} <br />
<br />
/** <br />
&nbsp;* prototype 加深了我的体会，就是写js 如何去遵循　Don&#8217;t Repeat Yourself (DRY) 原则 <br />
&nbsp;* 上文中 Abstract.Insertion 算是一个抽象类，定义了名为　initializeRange 的一个抽象方法 <br />
&nbsp;* var Insertion = new Object()　建立一个命名空间 <br />
&nbsp;* Insertion.Before|Top|Bottom|After 就象是四个java中的四个静态内部类，而它们分别继承于Abstract.Insertion，并实现了initializeRange方法。 <br />
&nbsp;*/ <br />
var Insertion = new Object(); <br />
<br />
Insertion.Before = Class.create(); <br />
Insertion.Before.prototype = (new Abstract.Insertion('beforeBegin')).extend({ <br />
&nbsp;initializeRange: function() { <br />
&nbsp;this.range.setStartBefore(this.element); <br />
&nbsp;}, <br />
&nbsp;<br />
&nbsp;/** <br />
&nbsp;* 将内容插入到指定节点的前面, 与指定节点同级 <br />
&nbsp;*/ <br />
&nbsp;insertContent: function() { <br />
&nbsp;this.element.parentNode.insertBefore(this.fragment, this.element); <br />
&nbsp;} <br />
}); <br />
<br />
Insertion.Top = Class.create(); <br />
Insertion.Top.prototype = (new Abstract.Insertion('afterBegin')).extend({ <br />
&nbsp;initializeRange: function() { <br />
&nbsp;this.range.selectNodeContents(this.element); <br />
&nbsp;this.range.collapse(true); <br />
&nbsp;}, <br />
&nbsp;<br />
&nbsp;/** <br />
&nbsp;* 将内容插入到指定节点的第一个子节点前，于是内容变为该节点的第一个子节点 <br />
&nbsp;*/ <br />
&nbsp;insertContent: function() { <br />
&nbsp;this.element.insertBefore(this.fragment, this.element.firstChild); <br />
&nbsp;} <br />
}); <br />
<br />
Insertion.Bottom = Class.create(); <br />
Insertion.Bottom.prototype = (new Abstract.Insertion('beforeEnd')).extend({ <br />
&nbsp;initializeRange: function() { <br />
&nbsp;this.range.selectNodeContents(this.element); <br />
&nbsp;this.range.collapse(this.element); <br />
&nbsp;}, <br />
&nbsp;<br />
&nbsp;/** <br />
&nbsp;* 将内容插入到指定节点的最后，于是内容变为该节点的最后一个子节点 <br />
&nbsp;*/ <br />
&nbsp;insertContent: function() { <br />
&nbsp;this.element.appendChild(this.fragment); <br />
&nbsp;} <br />
}); <br />
<br />
Insertion.After = Class.create(); <br />
Insertion.After.prototype = (new Abstract.Insertion('afterEnd')).extend({ <br />
&nbsp;initializeRange: function() { <br />
&nbsp;this.range.setStartAfter(this.element); <br />
&nbsp;}, <br />
<br />
&nbsp;/** <br />
&nbsp;* 将内容插入到指定节点的后面, 与指定节点同级 <br />
&nbsp;*/ <br />
&nbsp;insertContent: function() { <br />
&nbsp;this.element.parentNode.insertBefore(this.fragment, <br />
&nbsp;this.element.nextSibling); <br />
&nbsp;} <br />
}); <br />
<br />
/* 这是包含错误的原版本 <br />
if (!Function.prototype.apply) { <br />
// Based on code from http://www.youngpup.net/ <br />
Function.prototype.apply = function(object, parameters) { <br />
var parameterStrings = new Array(); <br />
if (!object) object = window; <br />
if (!parameters) parameters = new Array(); <br />
<br />
for (var i = 0; i &lt; parameters.length; i++) <br />
parameterStrings[i] = 'x[' + i + ']'; //Error 1 <br />
<br />
object.__apply__ = this; <br />
var result = eval('obj.__apply__(' + //Error 2 <br />
parameterStrings[i].join(', ') + ')'); <br />
object.__apply__ = null; <br />
<br />
return result; <br />
} <br />
} <br />
*/ <br />
<br />
if (!Function.prototype.apply) { <br />
&nbsp;Function.prototype.apply = function(object, parameters) { <br />
&nbsp;var parameterStrings = new Array(); <br />
&nbsp;if (!object) object = window; <br />
&nbsp;if (!parameters) parameters = new Array(); <br />
<br />
&nbsp;for (var i = 0; i &lt; parameters.length; i++) <br />
&nbsp;parameterStrings[i] = 'parameters[' + i + ']'; <br />
<br />
&nbsp;object.__apply__ = this; <br />
&nbsp;var result = eval('object.__apply__(' + parameterStrings.join(', ') + ')'); <br />
&nbsp;object.__apply__ = null; <br />
<br />
&nbsp;return result; <br />
&nbsp;} <br />
} <br />
</div>
Effect 的一个子类<br />
<br />
<br />
<div><br />
Effect.Blink = Class.create(); <br />
Effect.Blink.prototype = { <br />
&nbsp;initialize: function(element, frequency) { <br />
&nbsp;this.element = $(element); <br />
&nbsp;this.frequency = frequency?frequency:1000; <br />
&nbsp;this.element.effect_blink = this; <br />
&nbsp;this.blink(); <br />
&nbsp;}, <br />
<br />
&nbsp;blink: function() { <br />
&nbsp;if (this.timer) clearTimeout(this.timer); <br />
&nbsp;try { <br />
&nbsp;this.element.style.visibility = this.element.style.visibility == 'hidden'?'visible':'hidden'; <br />
&nbsp;} catch (e) {} <br />
&nbsp;this.timer = setTimeout(this.blink.bind(this), this.frequency); <br />
&nbsp;} <br />
};</div>
</div>
<img src ="http://www.blogjava.net/jaunt/aggbug/151826.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jaunt/" target="_blank">Jaunt</a> 2007-10-10 17:18 <a href="http://www.blogjava.net/jaunt/archive/2007/10/10/151826.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>IE下的开发工具包(好东西)</title><link>http://www.blogjava.net/jaunt/archive/2007/04/02/108038.html</link><dc:creator>Jaunt</dc:creator><author>Jaunt</author><pubDate>Mon, 02 Apr 2007 11:00:00 GMT</pubDate><guid>http://www.blogjava.net/jaunt/archive/2007/04/02/108038.html</guid><wfw:comment>http://www.blogjava.net/jaunt/comments/108038.html</wfw:comment><comments>http://www.blogjava.net/jaunt/archive/2007/04/02/108038.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jaunt/comments/commentRss/108038.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jaunt/services/trackbacks/108038.html</trackback:ping><description><![CDATA[<h1><span style="font-size: 12pt;">
没想到IE下面也有这等好东西:</span><span style="font-size: 12pt;"></span></h1>
<h1><span style="font-size: 12pt;"><a style="font-size: 10pt;" href="http://www.microsoft.com/downloads/details.aspx?familyid=e59c3964-672d-4511-bb3e-2d5e1db91038&amp;displaylang=en">Internet Explorer Developer Toolbar Beta 3</a></span></h1><img src ="http://www.blogjava.net/jaunt/aggbug/108038.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jaunt/" target="_blank">Jaunt</a> 2007-04-02 19:00 <a href="http://www.blogjava.net/jaunt/archive/2007/04/02/108038.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>prototype.js　1.4版开发者手册(强烈推荐)</title><link>http://www.blogjava.net/jaunt/archive/2007/03/23/105703.html</link><dc:creator>Jaunt</dc:creator><author>Jaunt</author><pubDate>Fri, 23 Mar 2007 00:56:00 GMT</pubDate><guid>http://www.blogjava.net/jaunt/archive/2007/03/23/105703.html</guid><wfw:comment>http://www.blogjava.net/jaunt/comments/105703.html</wfw:comment><comments>http://www.blogjava.net/jaunt/archive/2007/03/23/105703.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jaunt/comments/commentRss/105703.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jaunt/services/trackbacks/105703.html</trackback:ping><description><![CDATA[<h1 class="block_title">
<a id="viewpost1_TitleUrl" title="prototype-1.4.0.js详细解释" href="http://www.cnblogs.com/thinhunan/archive/2006/04/01/DeveloperNotesForPrototype.html">
<font color="#a52a2a" size="4">prototype.js　1.4版开发者手册(强烈推荐)</font>
</a>
</h1>
<img src ="http://www.blogjava.net/jaunt/aggbug/105703.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jaunt/" target="_blank">Jaunt</a> 2007-03-23 08:56 <a href="http://www.blogjava.net/jaunt/archive/2007/03/23/105703.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>status属性判断请求的结果与及Http请求响应代码的含义</title><link>http://www.blogjava.net/jaunt/archive/2006/11/29/84413.html</link><dc:creator>Jaunt</dc:creator><author>Jaunt</author><pubDate>Wed, 29 Nov 2006 11:24:00 GMT</pubDate><guid>http://www.blogjava.net/jaunt/archive/2006/11/29/84413.html</guid><wfw:comment>http://www.blogjava.net/jaunt/comments/84413.html</wfw:comment><comments>http://www.blogjava.net/jaunt/archive/2006/11/29/84413.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jaunt/comments/commentRss/84413.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jaunt/services/trackbacks/84413.html</trackback:ping><description><![CDATA[status存储服务器端返回的HTTP请求响应代码，它表示请求的处理结果，响应代码的含义如下表：<br /><br />Http状态码      |                 含义<br />      200          |       请求成功<br />      204          |       请求被接收，但处理未完成<br />      400          |       错误的请求<br />      404          |       请求资源未找到<br />      500          |       内部服务器错误，如是JSP,ASP代码错误等<img src ="http://www.blogjava.net/jaunt/aggbug/84413.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jaunt/" target="_blank">Jaunt</a> 2006-11-29 19:24 <a href="http://www.blogjava.net/jaunt/archive/2006/11/29/84413.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>readyState属性判断请求状态与及值的含义</title><link>http://www.blogjava.net/jaunt/archive/2006/11/29/84412.html</link><dc:creator>Jaunt</dc:creator><author>Jaunt</author><pubDate>Wed, 29 Nov 2006 11:16:00 GMT</pubDate><guid>http://www.blogjava.net/jaunt/archive/2006/11/29/84412.html</guid><wfw:comment>http://www.blogjava.net/jaunt/comments/84412.html</wfw:comment><comments>http://www.blogjava.net/jaunt/archive/2006/11/29/84412.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jaunt/comments/commentRss/84412.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jaunt/services/trackbacks/84412.html</trackback:ping><description><![CDATA[
		<p>onreadystatechange事件是在readyState属性发生改变时触发的，readyState的值表示了当前请求状态,在事件处理程序中可以根据这个值进行不同的处理，各个值的含义好下表：<br /><br />readyState值  |                                 含义   <br />      0              |    这也是readyState开始具有的值，表示对象已经建立，<br />                      |    但还未初始化,这时尚未调用open方法<br />      1              |    表示open方法已经调用，但尚未调用send方法<br />      2              |    表示send方法已经调用，其他数据未知<br />      3              |    表示请求已经发送成功，正在接收数据通信<br />      4              |    表示数据已接收成功，此时相当于直接使浏览器打开网页，<br />                      |    状态栏显示"完成"字样</p>
<img src ="http://www.blogjava.net/jaunt/aggbug/84412.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jaunt/" target="_blank">Jaunt</a> 2006-11-29 19:16 <a href="http://www.blogjava.net/jaunt/archive/2006/11/29/84412.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Ajax应用的三种用户交互类型</title><link>http://www.blogjava.net/jaunt/archive/2006/11/28/84122.html</link><dc:creator>Jaunt</dc:creator><author>Jaunt</author><pubDate>Tue, 28 Nov 2006 11:12:00 GMT</pubDate><guid>http://www.blogjava.net/jaunt/archive/2006/11/28/84122.html</guid><wfw:comment>http://www.blogjava.net/jaunt/comments/84122.html</wfw:comment><comments>http://www.blogjava.net/jaunt/archive/2006/11/28/84122.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jaunt/comments/commentRss/84122.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jaunt/services/trackbacks/84122.html</trackback:ping><description><![CDATA[
		<li>以内容为中心的交互 
<ul class="incremental"><li>服务器返回的是HTML格式的内容 
</li><li>客户端直接使用获得的内容为某个元素的innerHTML属性赋值 
</li><li>优点 
<ul><li>不需要在客户端建立领域模型，客户端的代码非常简单 
</li><li>与动态创建DOM元素相比，为innerHTML赋值的方式性能非常好 </li></ul></li><li>缺点 
<ul><li>修改的内容限于屏幕上某些固定的矩形区域，不够灵活 </li></ul></li></ul></li>
		<li>以脚本为中心的交互 
<ul class="incremental"><li>服务器返回的是一段JavaScript脚本 
</li><li>客户端调用eval()函数执行这段脚本，完成特定的任务 
</li><li>优点 
<ul><li>修改的内容不限于屏幕上某些固定的矩形区域 </li></ul></li><li>缺点 
<ul><li>生成的JavaScript流专门为这个客户端设计，客户端与服务器端耦合的太紧 </li></ul></li></ul></li>
		<li>以数据为中心的交互 
<ul class="incremental"><li>服务器返回的是XML或其他格式的数据 
</li><li>在客户端对获得的数据进行解析，使用DOM API创建新的元素 
</li><li>优点 
<ul><li>客户端与服务器端松散耦合，可以应用于多种类型的客户端 </li></ul></li><li>缺点 
<ul><li>客户端的代码最为复杂，需要在客户端划分MVC </li></ul></li></ul></li>
		<p>书摘：Ajax In Action</p>
<img src ="http://www.blogjava.net/jaunt/aggbug/84122.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jaunt/" target="_blank">Jaunt</a> 2006-11-28 19:12 <a href="http://www.blogjava.net/jaunt/archive/2006/11/28/84122.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Ajax客户端中MVC的划分</title><link>http://www.blogjava.net/jaunt/archive/2006/11/28/84121.html</link><dc:creator>Jaunt</dc:creator><author>Jaunt</author><pubDate>Tue, 28 Nov 2006 11:09:00 GMT</pubDate><guid>http://www.blogjava.net/jaunt/archive/2006/11/28/84121.html</guid><wfw:comment>http://www.blogjava.net/jaunt/comments/84121.html</wfw:comment><comments>http://www.blogjava.net/jaunt/archive/2006/11/28/84121.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jaunt/comments/commentRss/84121.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jaunt/services/trackbacks/84121.html</trackback:ping><description><![CDATA[
		<li>Model：业务领域对象，用JavaScript对象表示 
</li>
		<li>View：整个可编程处理的页面 
</li>
		<li>Controller：将UI和领域对象相连接的代码中的所有事件处理函数的组合 </li>
		<p>
				<br />书摘：Ajax In Action</p>
<img src ="http://www.blogjava.net/jaunt/aggbug/84121.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jaunt/" target="_blank">Jaunt</a> 2006-11-28 19:09 <a href="http://www.blogjava.net/jaunt/archive/2006/11/28/84121.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>XHTML/CSS/DOM的角色分配</title><link>http://www.blogjava.net/jaunt/archive/2006/11/28/84120.html</link><dc:creator>Jaunt</dc:creator><author>Jaunt</author><pubDate>Tue, 28 Nov 2006 11:03:00 GMT</pubDate><guid>http://www.blogjava.net/jaunt/archive/2006/11/28/84120.html</guid><wfw:comment>http://www.blogjava.net/jaunt/comments/84120.html</wfw:comment><comments>http://www.blogjava.net/jaunt/archive/2006/11/28/84120.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jaunt/comments/commentRss/84120.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jaunt/services/trackbacks/84120.html</trackback:ping><description><![CDATA[
		<p>Ajax所基于的核心技术</p>
		<li>XHTML 
</li>
		<li>CSS 
</li>
		<li>DOM 
</li>
		<li>JavaScript 
</li>
		<li>XML 
</li>
		<li>XMLHttpRequest 
<p>--------------------------------------------------------------------------------------------</p></li>
		<li>XHTML代表页面中的结构 
</li>
		<li>CSS代表页面中的表现 
</li>
		<li>DOM代表页面中的行为 
<p>--------------------------------------------------------------------------------------------</p></li>
		<li>页面中的结构/表现/行为三部分的分离是实现页面开发组件化和重用的关键 
<ul class="incremental"><li>使用XHTML 1.0的strict DTD，在html文件中不包含任何有表现含义的标签 
</li><li>完全使用CSS来做布局，尽力探索CSS的潜力 
</li><li>JavaScript应尽量多地通过设置元素的id或class的方式来调用CSS，而不是直接设置元素的style属性 </li></ul></li>
		<li>忽视页面中这三部分的分离，是造成大多数Ajax开发的混乱之源 
<ul class="incremental"><li>将这三部分混杂在一起，开发、维护的成本非常高 
</li><li>不将这三部分分离开，就无法对Ajax应用进行自动化的单元测试 </li></ul></li>
		<li>是否熟练掌握这三个规范，是区分Ajax高手和低手的标准 
<ul class="incremental"><li>这三个规范并非像某些人想象的那样，一周之内就可以掌握 
</li><li>忠告：<font color="#ff1493">在还没有学会走路之前，不要指望自己能跑的像刘翔一样快</font></li></ul></li>
		<p>书摘：Ajax In Action</p>
<img src ="http://www.blogjava.net/jaunt/aggbug/84120.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jaunt/" target="_blank">Jaunt</a> 2006-11-28 19:03 <a href="http://www.blogjava.net/jaunt/archive/2006/11/28/84120.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>常用的Ajax开发工具</title><link>http://www.blogjava.net/jaunt/archive/2006/11/28/84119.html</link><dc:creator>Jaunt</dc:creator><author>Jaunt</author><pubDate>Tue, 28 Nov 2006 10:59:00 GMT</pubDate><guid>http://www.blogjava.net/jaunt/archive/2006/11/28/84119.html</guid><wfw:comment>http://www.blogjava.net/jaunt/comments/84119.html</wfw:comment><comments>http://www.blogjava.net/jaunt/archive/2006/11/28/84119.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jaunt/comments/commentRss/84119.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jaunt/services/trackbacks/84119.html</trackback:ping><description><![CDATA[
		<ul class="incremental">
				<li>Firefox家族 
<ul class="incremental"><li><font color="#008000">Firefox </font></li><li><font color="#008000">FireBug </font></li><li><font color="#008000">Venkman </font></li><li>Web Developer 
</li><li>DOM Inspector 
</li><li>Tamper Data 
</li><li>LiveHTTPHeader </li></ul></li>
				<li>IE家族 
<ul class="incremental"><li>IE 
</li><li><font color="#008000">MSE（Microsoft Script Editor）</font></li><li>Visual InterDev 
</li><li>IE Developer Toolbar 
</li><li>Fiddler </li></ul></li>
		</ul>
		<p>----------------------------------------------------------------------</p>
		<ul class="incremental">
				<li>选择Firefox作为首选Ajax开发平台的理由 
<ul class="incremental"><li>Firefox的Web开发插件极其丰富和强大 
</li><li>Firefox对Web标准具有很好的支持 
</li><li>Firefox支持JavaScript的最新版本 
</li><li>Firefox支持Canvas、SVG、E4X等新的技术 </li></ul></li>
				<li>建议：<font color="#008000">在Firefox上做开发，在IE上做测试</font></li>
		</ul>
		<p>书摘：Ajax In Action</p>
<img src ="http://www.blogjava.net/jaunt/aggbug/84119.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jaunt/" target="_blank">Jaunt</a> 2006-11-28 18:59 <a href="http://www.blogjava.net/jaunt/archive/2006/11/28/84119.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>真正的JavaScript而非JScript</title><link>http://www.blogjava.net/jaunt/archive/2006/11/26/83551.html</link><dc:creator>Jaunt</dc:creator><author>Jaunt</author><pubDate>Sat, 25 Nov 2006 18:39:00 GMT</pubDate><guid>http://www.blogjava.net/jaunt/archive/2006/11/26/83551.html</guid><wfw:comment>http://www.blogjava.net/jaunt/comments/83551.html</wfw:comment><comments>http://www.blogjava.net/jaunt/archive/2006/11/26/83551.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jaunt/comments/commentRss/83551.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jaunt/services/trackbacks/83551.html</trackback:ping><description><![CDATA[
		<p>Now网上有大量关于所谓JavaScript的参考手册或参考资料的，其实大部分都是真对于微软所推出的JScript的，而不是现在我们使用Ajax使用到的JavaScript哦……<br />今天在网上看到阿江对<a href="http://www.ajiang.net/article/artview.asp?id=469">真正JavaScript</a>而非Jscript的整理，如下：</p>
		<p>
				<br />        1、javascript 参考 V1.5（英文）<br />　　<a href="http://www.ajiang.net/tools/CoreReferenceJS15.chm"><font class="zw">http://www.ajiang.net/tools/CoreReferenceJS15.chm</font></a><br />　　2、javascript 指南 V1.5（英文）<br />　　<a href="http://www.ajiang.net/tools/CoreGuideJS15.chm"><font class="zw">http://www.ajiang.net/tools/CoreGuideJS15.chm</font></a><br />　　以上来自<br />　　http://devedge.netscape.com/central/javascript/<br />　　<br />　　3、javascript 参考  来自 www.devguru.com（英文）结构很清晰<br />　　<a href="http://www.ajiang.net/tools/javascript_devguru.chm"><font class="zw">http://www.ajiang.net/tools/javascript_devguru.chm</font></a><br />　　4、中文的参考<br />　　<a href="http://www.ajiang.net/tools/JavaScriptHelp_cn.chm"><font class="zw">http://www.ajiang.net/tools/JavaScriptHelp_cn.chm</font></a><br />　　<br />　　网上很多地方把微软JSscript的中文参考当作javascript的参考提供下载，那是不能用的。</p>
<img src ="http://www.blogjava.net/jaunt/aggbug/83551.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jaunt/" target="_blank">Jaunt</a> 2006-11-26 02:39 <a href="http://www.blogjava.net/jaunt/archive/2006/11/26/83551.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>