??xml version="1.0" encoding="utf-8" standalone="yes"?>最新国产精品亚洲,亚洲精品无码专区2,亚洲精品亚洲人成在线http://m.tkk7.com/jaunt/category/17634.html站在巨h的肩?lt;br> Flying in the world of Javazh-cnThu, 11 Oct 2007 23:10:17 GMTThu, 11 Oct 2007 23:10:17 GMT60AJAX概况http://m.tkk7.com/jaunt/archive/2007/10/10/151846.htmlJauntJauntWed, 10 Oct 2007 10:04:00 GMThttp://m.tkk7.com/jaunt/archive/2007/10/10/151846.htmlhttp://m.tkk7.com/jaunt/comments/151846.htmlhttp://m.tkk7.com/jaunt/archive/2007/10/10/151846.html#Feedback0http://m.tkk7.com/jaunt/comments/commentRss/151846.htmlhttp://m.tkk7.com/jaunt/services/trackbacks/151846.html1、通过适当的Ajax应用辑ֈ更好的用户体验;
2、把以前的一些服务器负担的工作{嫁到客户端,利于客户端闲|的处理能力来处理,减轻服务器和带宽的负担,从而达到节UISP的空间及带宽U用成本的目的?/strong>
二、引?/div>
Ajaxq个概念的最早提?a target="_blank">Jesse James Garrett认ؓQ?/strong>
Ajax是Asynchronous JavaScript and XML的羃写?br /> Ajaxq不是一门新的语a或技?它实际上是几Ҏ术按一定的方式l合在一在同q协作中发挥各自的作用,它包?br /> 使用XHTML和CSS标准化呈?
使用DOM实现动态显C和交互;
使用XML和XSLTq行数据交换与处?
使用XMLHttpRequestq行异步数据d;
最后用JavaScriptl定和处理所有数?
Ajax的工作原理相当于在用户和服务器之间加了—个中间?使用h作与服务器响应异步化。ƈ不是所有的用户h都提交给服务?像—些数据验证和数据处理等都交lAjax引擎自己来做,只有定需要从服务器读取新数据时再由Ajax引擎代ؓ向服务器提交h?br />
?Q?
?Q?

?Q?
?Q?
三、概q?/div>
虽然Garrent列出?条Ajax的构成技术,但个为,所谓的Ajax其核心只有JavaScript、XMLHTTPRequest? DOMQ如果所用数据格式ؓXML的话Q还可以再加上XMLq一?Ajax从服务器端返回的数据可以是XML格式Q也可以是文本等其他格式)?br /> 在旧的交互方式中,q戯发一个HTTPh到服务器,服务器对其进行处理后再返回一个新的HTHL到客户?每当服务器处理客L提交的请求时, 客户都只能空闲等?q且哪怕只是一ơ很的交互、只需从服务器端得到很单的一个数?都要q回一个完整的HTML?而用hơ都要浪Ҏ间和带宽? 重新d整个面?br /> 而用Ajax后用户从感觉上几乎所有的操作都会很快响应没有面重蝲Q白屏)的等待?br /> 1、XMLHTTPRequest
Ajax的一个最大的特点是无需h面便可向服务器传输或读写数?又称无刷新更新页?,q一特点主要得益于XMLHTTPlg XMLHTTPRequest对象。这样就可以向再发桌面应用程序只同服务器q行数据层面的交?而不用每ơ都h界面也不用每ơ将数据处理的工作提交给 服务器来?q样卛_M服务器的负担又加快了响应速度、羃短了用户{候时间?br /> 最早应用XMLHTTP的是微Y,IEQIE5以上Q通过允许 开发h员在Web面内部使用XMLHTTP ActiveXlg扩展自n的功?开发h员可以不用从当前的Web面D而直接传输数据到服务器上或者从服务器取数据。这个功能是很重要的,因ؓ它帮 助减了无状态连接的痛苦,它还可以排除下蝲冗余HTML的需?从而提高进E的速度。MozillaQMozilla1.0以上及NetScape7? 上)做出的回应是创徏它自ql承XML代理c:XMLHttpRequestcRKonqueror (和Safari v1.2,同样也是ZKHTML的浏览器)也支持XMLHttpRequest对象,而Opera也将在其v7.6x+以后的版本中支持 XMLHttpRequest对象。对于大多数情况QXMLHttpRequest对象和XMLHTTPlg很相?Ҏ和属性也cM,只是有一部分属 性不支持?br /> XMLHttpRequest的应用:
XMLHttpRequest对象在JS中的应用
var xmlhttp = new XMLHttpRequest();
微Y的XMLHTTPlg在JS中的应用
var xmlhttp = new ActiveXObject(Microsoft.XMLHTTP);
var xmlhttp = new ActiveXObject(Msxml2.XMLHTTP);
XMLHttpRequest 对象Ҏ
/**
* Cross-browser XMLHttpRequest instantiation.
*/

if (typeof XMLHttpRequest == 'undefined') {
XMLHttpRequest = function () {
var msxmls = ['MSXML3', 'MSXML2', 'Microsoft']
for (var i=0; i < msxmls.length; i++) {
try {
return new ActiveXObject(msxmls[i]+'.XMLHTTP')
} catch (e) { }
}
throw new Error("No XML component installed!")
}
}
function createXMLHttpRequest() {
try {
// Attempt to create it "the Mozilla way"
if (window.XMLHttpRequest) {
return new XMLHttpRequest();
}
// Guess not - now the IE way
if (window.ActiveXObject) {
return new ActiveXObject(getXMLPrefix() + ".XmlHttp");
}
}
catch (ex) {}
return false;
};

XMLHttpRequest 对象Ҏ
Ҏ 描述
abort() 停止当前h
getAllResponseHeaders() 作ؓ字符串返问完整的headers
getResponseHeader("headerLabel") 作ؓ字符串返问单个的header标签
open("method","URL"[,asyncFlag[,"userName"[, "password"]]]) 讄未决的请求的目标 URL, Ҏ, 和其他参?/td>
send(content) 发送请?/td>
setRequestHeader("label", "value") 讄headerq和h一起发?/td>

XMLHttpRequest 对象属?
属?/strong> 描述
onreadystatechange 状态改变的事g触发?/td>
readyState 对象状?integer):
0 = 未初始化
1 = d?br /> 2 = 已读?br /> 3 = 交互?br /> 4 = 完成
responseText 服务器进E返回数据的文本版本
responseXML 服务器进E返回数据的兼容DOM的XML文档对象
status 服务器返回的状态码, 如:404 = "文g末找? ?00 ="成功"
statusText 服务器返回的状态文本信?/td>

2、JavaScript
JavaScript是一在浏览器中大量用的~程语言Q,他以前一直被贬低Z门糟p的语言Q他实在用上比较枯燥Q,以在常被用来作一些用来炫耀 的小玩意和恶作剧或是单调琐碎的表单验证。但事实是,他是一门真正的~程语言Q有着自已的标准ƈ在各U浏览器中被q泛支持?br /> 3、DOM
Document Object Model?br /> DOM是给 HTML ?XML 文g使用的一l?API。它提供了文件的l构表述Q让你可以改变其中的內容及可见物。其本质是徏立网与 Script 或程序语a沟通的桥梁?br /> 所有WEB开发h员可操作及徏立文件的属性、方法及事g都以对象来展玎ͼ例如Qdocument ׃?#8220;文g本n“q个对像Qtable 对象则代?HTML 的表格对象等{)。这些对象可以由当今大多数的览器以 Script 来取用?br /> 一个用HTML或XHTML构徏的网也可以看作是一l结构化的数据,q些数据被封在DOMQDocument Object ModelQ中QDOM提供了网中各个对象的读写的支持?br /> 4、XML
可扩展的标记语言QExtensible Markup LanguageQ具有一U开攄、可扩展的、可自描q的语言l构Q它已经成ؓ|上数据和文档传输的标准。它是用来描q数据结构的一U语aQ就正如他的? 字一栗他使对某些l构化数据的定义更加ҎQƈ且可以通过他和其他应用E序交换数据?br /> 5、综?/strong>
Jesse James Garrett提到的Ajax引擎Q实际上是一个比较复杂的JavaScript应用E序Q用来处理用戯求,d服务器和更改DOM内容?br /> JavaScript的Ajax引擎d信息Qƈ且互动地重写DOMQ这使网能无缝化重构,也就是在面已经下蝲完毕后改变页面内容,q是我们一直在 通过JavaScript和DOM在广泛用的ҎQ但要ɾ|页真正动态v来,不仅要内部的互动Q还需要从外部获取数据Q在以前Q我们是让用h输入数据 q过DOM来改变网内容的Q但现在QXMLHTTPRequestQ可以让我们在不重蝲面的情况下d服务器上的数据,使用L输入辑ֈ最?br /> ZXML的网l通讯也ƈ不是C物,实际上FLASH和JAVA Applet都有不错的表玎ͼ现在q种富交互在|页上也可用了,Z标准化的q被q泛支持和技术,q且不需要插件或下蝲程序?br /> Ajax是传lWEB应用E序的一个{变。以前是服务器每ơ生成HTML面q返回给客户端(览器)。在大多数网站中Q很多页面中臛_90%都是一? 的,比如Q结构、格式、页头、页、广告等Q所不同的只是一部分的内容Q但每次服务器都会生成所有的面再返回给客户端,q无形之中是一U浪费,不管? 对于用户的时间、带宽、CPU耗用Q还是对于ISP的高L用的带宽和空间来说。如果按一|,只能几K或是几十K可能q不LQ但像SINA每天要生 成几百万个页面的大ISP来说Q可以说是损失巨大的。?a href="javascript:void(0);" class="lore_glossary_term_link" onmouseover="return overlib('AjaxQ是一U无h技?异步交互Q给用户的感觉是响应速度快、连l不断、体验丰富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? 以所为客L和服务器的中间层Q来处理客户端的hQƈҎ需要向服务器端发送请求,用什么就取什么、用多少取多少Q就不会有数据的冗余和浪费,减少? 数据下蝲总量Q而且更新面时不用重载全部内容,只更新需要更新的那部分即可,相对于纯后台处理q载的方式~短了用L待时_也把对资源的费降到最 低,Z标准化的q被q泛支持和技术,q且不需要插件或下蝲程序,所以Ajax对于用户和ISP来说是双盈的?br /> Ajax使WEB中的界面? 应用分离Q也可以说是数据与呈现分)Q而在以前两者是没有清晰的界限的Q数据与呈现分离的分,有利于分工合作、减非技术h员对面的修攚w成? WEB应用E序错误、提高效率、也更加适用于现在的发布pȝ。也可以把以前的一些服务器负担的工作{嫁到客户端,利于客户端闲|的处理能力来处理?br />
四、应?/div>
  Ajax理念的出玎ͼ揭开了无h更新面时代的序q,q有代替传统web开发中采用form(表单)递交方式更新web面的趋势,可以是一个里E碑。但Ajax都不是适用于所有地方的Q它的适用范围是由它的Ҏ所军_的?br /> 举个应用的例子,是关于联菜单方面的Ajax应用?br /> 我们以前的对U联菜单的处理是q样的:
Z避免每次对菜单的操作引v的重载页面,不采用每ơ调用后台的方式Q而是一ơ性将U联菜单的所有数据全部读取出来ƈ写入数组Q然后根据用L操作? JavaScript来控制它的子集项目的呈现Q这栯然解决了操作响应速度、不重蝲面以及避免向服务器频繁发送请求的问题Q但是如果用户不对菜单进? 操作或只对菜单中的一部分q行操作的话Q那d的数据中的一部分׃成ؓ冗余数据而浪费用L资源Q特别是在菜单结构复杂、数据量大的情况下(比如菜单? 很多U、每一U菜又有上百个项目)Q这U弊端就更ؓH出?br /> 如果在此案中应用Ajax后,l果׃有所改观Q?br /> 在初始化面时我们只 d它的W一U的所有数据ƈ昄Q在用户操作一U菜单其中一ҎQ会通过Ajax向后台请求当前一U项目所属的二子菜单的所有数据,如果再l请求已l? 呈现的二U菜单中的一ҎQ再向后面请求所操作二菜单对应的所有三U菜单的所有数据,以此cL……q样Q用什么就取什么、用多少取多少Q就不会有数 据的冗余和浪费,减少了数据下载总量Q而且更新面时不用重载全部内容,只更新需要更新的那部分即可,相对于后台处理ƈ重蝲的方式羃短了用户{待旉Q也 把对资源的浪贚w到最低?br /> 此外QAjax׃可以调用外部数据Q也可以实现数据聚合的功能(当然要有相应授权Q,比如微Y刚刚??5日发布的在线RSS阅读器BETA版;q可以利于一些开攄数据Q开发自已的一些应用程序,比如用Amazon的数据作的一些新颖的图书搜烦应用?br /> MQAjax适用于交互较多,频繁L据,数据分类良好的WEB应用?br />
五、Ajax的优?/div>
  1、减L务器的负担。因为Ajax的根本理忉|“按需取数?#8221;Q所以最大可能在减少了冗余请求和响媄Ҏ务器造成的负担;
2、无h更新面Q减用户实际和心理{待旉Q?/strong>
首先Q?#8220;按需取数?#8221;的模式减了数据的实际读取量Q打个很形象的比方,如果说重载的方式是从一个终点回到原点再到另一个终点的话,那么Ajax是以一个终点ؓ基点到达另一个终点;
重蝲方式
?Q?

Ajax方式
?Q?
其次Q即使要d比较大的数据Q也不用像RELOAD一样出现白屏的情况Q由于Ajax是用XMLHTTP发送请求得到服务端应答数据Q在不重新蝲入整 个页面的情况下用Javascript操作DOM最l更新页面的Q所以在d数据的过E中Q用h面对的也不是白屏Q而是原来的页面状态(或者可以加一? LOADING的提C框让用户了解数据读取的状态)Q只有当接收到全部数据后才更新相应部分的内容Q而这U更C是瞬间的Q用户几乎感觉不到。M用户? 很敏感的Q他们能感觉C对他们的体脓Q虽然不太可能立竿见q效果Q但会在用户的心中一点一滴的U篏他们对网站的依赖?br /> 3、更好的用户体验Q?/strong>
4、也可以把以前的一些服务器负担的工作{嫁到客户端,利于客户端闲|的处理能力来处理,减轻服务器和带宽的负担,节约I间和带宽租用成本;
5、Ajax׃可以调用外部数据Q?/strong>
6、基于标准化的ƈ被广泛支持和技术,q且不需要插件或下蝲程序;
7、Ajax使WEB中的界面与应用分(也可以说是数据与呈现分离Q;
8、对于用户和ISP来说是双盈的?/strong>
六、Ajax的问?/div>
  1、一些手持设备(如手机、PDA{)现在q不能很好的支持AjaxQ?br /> 2、用JavaScript作的Ajax引擎QJavaScript的兼Ҏ和DeBug都是让h头痛的事Q?br /> 3、Ajax的无h重蝲Q由于页面的变化没有h重蝲那么明显Q所以容易给用户带来困扰――用户不太清楚现在的数据是新的还是已l更新过的;现有的解xQ在相关位置提示、数据更新的区域设计得比较明显、数据更新后l用hC等Q?br /> 4、对媒体的支持没有FLASH、Java Applet好;
七、结束语
  更好的Ajax应用Q需要更多的客户端的开发,和对当前的WEB应用理念的思考,而且良好的用户体验,来源于ؓ处处用户考虑的理念,而不单纯是某U技术?br />
url:http://100000.myabc.cn/home/Blog/view/148.htm


Jaunt 2007-10-10 18:04 发表评论
]]>prototype 源码中文说明?prototype.js(?http://m.tkk7.com/jaunt/archive/2007/10/10/151826.htmlJauntJauntWed, 10 Oct 2007 09:18:00 GMThttp://m.tkk7.com/jaunt/archive/2007/10/10/151826.htmlhttp://m.tkk7.com/jaunt/comments/151826.htmlhttp://m.tkk7.com/jaunt/archive/2007/10/10/151826.html#Feedback0http://m.tkk7.com/jaunt/comments/commentRss/151826.htmlhttp://m.tkk7.com/jaunt/services/trackbacks/151826.html
/**
 * 定义一个全局对象, 属?Version 在发布的时候会替换为当前版本号
 */
var Prototype = {
 Version: '@@VERSION@@'
}

/**
 * 创徏一U类型,注意其属?create 是一个方法,q回一个构造函数?
 * 一般用如?
 * var X = Class.create(); q回一个类型,cM?java 的一个Class实例?
 * 要?X cdQ需l箋?new X()来获取一个实例,如同 java ?Class.newInstance()Ҏ?
 *
 * q回的构造函C执行名ؓ initialize 的方法, initialize ?Ruby 对象的构造器Ҏ名字?
 * 此时initializeҎq没有定义,其后的代码中创徏新类型时会徏立相应的同名Ҏ?
 *
 * 如果一定要从java上去理解。你可以理解为用Class.create()创徏一个承java.lang.ClasscȝcR当然java不允许这样做Q因为ClasscLfinal?
 *
 */
var Class = {
 create: function() {
 return function() {
 this.initialize.apply(this, arguments);
 }
 }
}

/**
 * 创徏一个对象,从变量名来思考,本意也许是定义一个抽象类Q以后创建新对象?extend 它?
 * 但从其后代码的应用来看, Abstract 更多是ؓ了保持命名空间清晰的考虑?
 * 也就是说Q我们可以给 Abstract q个对象实例d新的对象定义?
 *
 * 从javaȝ解,是动态给一个对象创建内部类?
 */
var Abstract = new Object();

/**
 * 获取参数对象的所有属性和ҎQ有点象多重l承。但是这U承是动态获得的?
 * 如:
 * var a = new ObjectA(), b = new ObjectB();
 * var c = a.extend(b);
 * 此时 c 对象同时拥有 a ?b 对象的属性和Ҏ。但是与多重l承不同的是Qc instanceof ObjectB 返回false?
 */
Object.prototype.extend = function(object) {
 for (property in object) {
 this[property] = object[property];
 }
 return this;
}

/**
 * q个Ҏ很有,它封装一个javascript函数对象Q返回一个新函数对象Q新函数对象的主体和原对象相同,但是bind()Ҏ参数被用作当前对象的对象?
 * 也就是说新函C?this 引用被改变ؓ参数提供的对象?
 * 比如Q?
 * <input type="text" id="aaa" value="aaa">
 * <input type="text" id="bbb" value="bbb">
 * .................
 * <script>
 * var aaa = document.getElementById("aaa");
 * var bbb = document.getElementById("bbb");
 * aaa.showValue = function() {alert(this.value);}
 * aaa.showValue2 = aaa.showValue.bind(bbb);
 * </script>
 * 那么Q调用aaa.showValue 返?aaa", 但调用aaa.showValue2 返?bbb"?
 *
 * apply 是ie5.5后才出现的新Ҏ(Netscape好像很早支持了)?
 * 该方法更多的资料参考MSDN http://msdn.microsoft.com/library/en-us/script56/html/js56jsmthApply.asp
 * q有一?call ҎQ应用v来和 apply cM。可以一LI下?
 */
Function.prototype.bind = function(object) {
 var method = this;
 return function() {
 method.apply(object, arguments);
 }
}

/**
 * 和bind一P不过q个Ҏ一般用做html控g对象的事件处理。所以要传递event对象
 * 注意q时候,用到?Function.call。它?Function.apply 的不同好像仅仅是对参数Ş式的定义?
 * 如同 java 两个q蝲的方法?
 */
Function.prototype.bindAsEventListener = function(object) {
 var method = this;
 return function(event) {
 method.call(object, event || window.event);
 }
}

/**
 * 整数Ş式RGB颜色D{换ؓHEX形式
 */
Number.prototype.toColorPart = function() {
 var digits = this.toString(16);
 if (this < 16) return '0' + digits;
 return digits;
}

/**
 * 典型 Ruby 风格的函敎ͼ参C的方法逐个调用Q返回第一个成功执行的Ҏ的返回?
 */
var Try = {
 these: function() {
 var returnValue;
 
 for (var i = 0; i < arguments.length; i++) {
 var lambda = arguments[i];
 try {
 returnValue = lambda();
 break;
 } catch (e) {}
 }
 
 return returnValue;
 }
}

/*--------------------------------------------------------------------------*/

/**
 * 一个设计精巧的定时执行?
 * 首先?Class.create() 创徏一?PeriodicalExecuter cdQ?
 * 然后用对象直接量的语法Ş式设|原型?
 *
 * 需要特别说明的?rgisterCallback ҎQ它调用上面定义的函数原型方法bind, q传递自׃ؓ参数?
 * 之所以这样做Q是因ؓ setTimeout 默认M window 对象为当前对象,也就是说Q如?registerCallback Ҏ定义如下的话Q?
 * registerCallback: function() {
 * setTimeout(this.onTimerEvent, this.frequency * 1000);
 * }
 * 那么Qthis.onTimeoutEvent Ҏ执行p|Q因为它无法讉K this.currentlyExecuting 属性?
 * 而用了bind以后Q该Ҏ才能正确的找到thisQ也是PeriodicalExecuter的当前实例?
 */
var PeriodicalExecuter = Class.create();
PeriodicalExecuter.prototype = {
 initialize: function(callback, frequency) {
 this.callback = callback;
 this.frequency = frequency;
 this.currentlyExecuting = false;
 
 this.registerCallback();
 },
 
 registerCallback: function() {
 setTimeout(this.onTimerEvent.bind(this), this.frequency * 1000);
 },
 
 onTimerEvent: function() {
 if (!this.currentlyExecuting) {
 try {
 this.currentlyExecuting = true;
 this.callback();
 } finally {
 this.currentlyExecuting = false;
 }
 }
 
 this.registerCallback();
 }
}

/*--------------------------------------------------------------------------*/

/**
 * q个函数?Ruby 了。我觉得它的作用主要有两?
 * 1. 大概?document.getElementById(id) 的最化调用?
 * 比如Q?("aaa") 返回上 aaa 对象
 * 2. 得到对象数组
 * 比如: $("aaa","bbb") q回一个包括id?aaa"?bbb"两个input控g对象的数l?
 */
function $() {
 var elements = new Array();
 
 for (var i = 0; i < arguments.length; i++) {
 var element = arguments[i];
 if (typeof element == 'string')
 element = document.getElementById(element);

 if (arguments.length == 1)
 return element;
 
 elements.push(element);
 }
 
 return elements;
}
/**
 * 定义 Ajax 对象, 静态方?getTransport Ҏq回一?XMLHttp 对象
 */
var Ajax = {
 getTransport: function() {
 return Try.these(
 function() {return new ActiveXObject('Msxml2.XMLHTTP')},
 function() {return new ActiveXObject('Microsoft.XMLHTTP')},
 function() {return new XMLHttpRequest()}
 ) || false;
 },
 
 emptyFunction: function() {}
}

/**
 * 我以为此时的Ajax对象起到命名I间的作用?
 * Ajax.Base 声明Z个基对象cd
 * 注意 Ajax.Base q没有?Class.create() 的方式来创徏Q我x因ؓ作者ƈ不希?Ajax.Base 被库使用者实例化?
 * 作者在其他对象cd的声明中Q将会承于它?
 * 好?java 中的U有抽象c?
 */
Ajax.Base = function() {};
Ajax.Base.prototype = {
 /**
 * extend (见prototype.js中的定义) 的用法真是让目一?
 * options 首先讄默认属性,然后?extend 参数对象Q那么参数对象中也有同名的属性,那么p盖默认属性倹{?
 * x如果我写q样的实玎ͼ应该cM如下Q?
 setOptions: function(options) {
 this.options.methed = options.methed? options.methed : 'post';
 ..........
 }
 我想很多时候,java 限制?js 的创意?
 */
 setOptions: function(options) {
 this.options = {
 method: 'post',
 asynchronous: true,
 parameters: ''
 }.extend(options || {});
 }
}

/**
 * Ajax.Request 装 XmlHttp
 */
Ajax.Request = Class.create();

/**
 * 定义四种事g(状?Q?参考http://msdn.microsoft.com/workshop/author/dhtml/reference/properties/readystate_1.asp
 */
Ajax.Request.Events =
 ['Uninitialized', 'Loading', 'Loaded', 'Interactive', 'Complete'];

/**
 *
 */
Ajax.Request.prototype = (new Ajax.Base()).extend({
 initialize: function(url, options) {
 this.transport = Ajax.getTransport();
 this.setOptions(options);
 
 try {
 if (this.options.method == 'get')
 url += '?' + this.options.parameters + '&_=';
 
 /**
 * 此处好像强制使用了异步方式,而不是依?this.options.asynchronous 的?
 */
 this.transport.open(this.options.method, url, true);
 
 /**
 * q里提供?XmlHttp 传输q程中每个步骤的回调函数
 */
 if (this.options.asynchronous) {
 this.transport.onreadystatechange = this.onStateChange.bind(this);
 setTimeout((function() {this.respondToReadyState(1)}).bind(this), 10);
 }
 
 this.transport.setRequestHeader('X-Requested-With', 'XMLHttpRequest');
 this.transport.setRequestHeader('X-Prototype-Version', Prototype.Version);

 if (this.options.method == 'post') {
 this.transport.setRequestHeader('Connection', 'close');
 this.transport.setRequestHeader('Content-type',
 'application/x-www-form-urlencoded');
 }
 
 this.transport.send(this.options.method == 'post' ?
 this.options.parameters + '&_=' : null);
 
 } catch (e) {
 }
 },
 
 onStateChange: function() {
 var readyState = this.transport.readyState;
 /**
 * 如果不是 Loading 状态,p用回调函?
 */
 if (readyState != 1)
 this.respondToReadyState(this.transport.readyState);
 },
 
 /**
 * 回调函数定义?this.options 属性中Q比?
 var option = {
 onLoaded : function(req) {...};
 ......
 }
 new Ajax.Request(url, option);
 */
 respondToReadyState: function(readyState) {
 var event = Ajax.Request.Events[readyState];
 (this.options['on' + event] || Ajax.emptyFunction)(this.transport);
 }
});

/**
 * Ajax.Updater 用于l定一个html元素?XmlHttp调用的返回倹{类g buffalo ?bind?
 * 如果 options 中有 insertion(from dom.js) 对象的话, insertion 能提供更多的插入控制?
 */
Ajax.Updater = Class.create();
Ajax.Updater.prototype = (new Ajax.Base()).extend({
 initialize: function(container, url, options) {
 this.container = $(container);
 this.setOptions(options);
 
 if (this.options.asynchronous) {
 this.onComplete = this.options.onComplete;
 this.options.onComplete = this.updateContent.bind(this);
 }
 
 this.request = new Ajax.Request(url, this.options);
 
 if (!this.options.asynchronous)
 this.updateContent();
 },
 
 updateContent: function() {
 if (this.options.insertion) {
 new this.options.insertion(this.container,
 this.request.transport.responseText);
 } else {
 this.container.innerHTML = this.request.transport.responseText;
 }

 if (this.onComplete) {
 setTimeout((function() {this.onComplete(this.request)}).bind(this), 10);
 }
 }
});
/**
 * 针对 面元素对象 的工LQ提供一些简单静态方?
 */
var Field = {
 /**
 * 清除参数引用对象的?
 */
 clear: function() {
 for (var i = 0; i < arguments.length; i++)
 $(arguments[i]).value = '';
 },

 /**
 * 使参数引用对象获取焦?
 */
 focus: function(element) {
 $(element).focus();
 },
 
 /**
 * 判断参数引用对象值是否ؓI,如ؓI,q回false, 反之true
 */
 present: function() {
 for (var i = 0; i < arguments.length; i++)
 if ($(arguments[i]).value == '') return false;
 return true;
 },
 
 /**
 * 佉K中参数引用对象
 */
 select: function(element) {
 $(element).select();
 },

 /**
 * 使参数引用对象处于可~辑状?
 */
 activate: function(element) {
 $(element).focus();
 $(element).select();
 }
}

/*--------------------------------------------------------------------------*/

/**
 * 表单工具c?
 */
var Form = {
 /**
 * 表单元素序列化后的值组合成 QueryString 的Ş?
 */
 serialize: function(form) {
 var elements = Form.getElements($(form));
 var queryComponents = new Array();
 
 for (var i = 0; i < elements.length; i++) {
 var queryComponent = Form.Element.serialize(elements[i]);
 if (queryComponent)
 queryComponents.push(queryComponent);
 }
 
 return queryComponents.join('&');
 },
 
 /**
 * 得到表单的所有元素对?
 */
 getElements: function(form) {
 form = $(form);
 var elements = new Array();

 for (tagName in Form.Element.Serializers) {
 var tagElements = form.getElementsByTagName(tagName);
 for (var j = 0; j < tagElements.length; j++)
 elements.push(tagElements[j]);
 }
 return elements;
 },
 
 /**
 * 指定表单的元素|于不可用状?
 */
 disable: function(form) {
 var elements = Form.getElements(form);
 for (var i = 0; i < elements.length; i++) {
 var element = elements[i];
 element.blur();
 element.disable = 'true';
 }
 },

 /**
 * 使表单的W一个非 hidden cd而且处于可用状态的元素获得焦点
 */
 focusFirstElement: function(form) {
 form = $(form);
 var elements = Form.getElements(form);
 for (var i = 0; i < elements.length; i++) {
 var element = elements[i];
 if (element.type != 'hidden' && !element.disabled) {
 Field.activate(element);
 break;
 }
 }
 },

 /*
 * 重置表单
 */
 reset: function(form) {
 $(form).reset();
 }
}

/**
 * 表单元素工具c?
 */
Form.Element = {
 /**
 * q回表单元素的值先序列化再q行 URL ~码后的?
 */
 serialize: function(element) {
 element = $(element);
 var method = element.tagName.toLowerCase();
 var parameter = Form.Element.Serializers[method](element);
 
 if (parameter)
 return encodeURIComponent(parameter[0]) + '=' +
 encodeURIComponent(parameter[1]);
 },
 
 /**
 * q回表单元素序列化后的?
 */
 getValue: function(element) {
 element = $(element);
 var method = element.tagName.toLowerCase();
 var parameter = Form.Element.Serializers[method](element);
 
 if (parameter)
 return parameter[1];
 }
}

/**
 * prototype 的所谓序列化其实是表单的名字和值组合成一个数l?
 */
Form.Element.Serializers = {
 input: function(element) {
 switch (element.type.toLowerCase()) {
 case 'hidden':
 case 'password':
 case 'text':
 return Form.Element.Serializers.textarea(element);
 case 'checkbox':
 case 'radio':
 return Form.Element.Serializers.inputSelector(element);
 }
 return false;
 },
 
 inputSelector: function(element) {
 if (element.checked)
 return [element.name, element.value];
 },

 textarea: function(element) {
 return [element.name, element.value];
 },

 /**
 * 看样子,也不支持多选框(select-multiple)
 */
 select: function(element) {
 var index = element.selectedIndex;
 var value = element.options[index].value || element.options[index].text;
 return [element.name, (index >= 0) ? value : ''];
 }
}

/*--------------------------------------------------------------------------*/

/**
 * Form.Element.getValue 也许会经常用刎ͼ所以做了一个快捷引?
 */
var $F = Form.Element.getValue;

/*--------------------------------------------------------------------------*/

/**
 * Abstract.TimedObserver 也没有用 Class.create() 来创建,和Ajax.Base 意图应该一?
 * Abstract.TimedObserver ֐思义Q是套用Observer设计模式来跟t指定表单元素,
 * 当表单元素的值发生变化的时候,执行回调函?
 *
 * 我想 Observer 与注册onchange事g怼Q不同点在于 onchange 事g是在元素失去焦点的时候才Ȁ发?
 * 同样的与 onpropertychange 事g也相|不过它只x表单元素的值的变化Q而且提供timeout的控制?
 *
 * 除此之外QObserver 的好处大概就在与更面向对象,另外可以动态的更换回调函数Q这比注册事g要灵zM些?
 * Observer 应该可以胜Q动态数据校验,或者多个关联下拉选项列表的连动等{?
 *
 */
Abstract.TimedObserver = function() {}

/**
 * q个设计?PeriodicalExecuter 一Pbind Ҏ是实现的核心
 */
Abstract.TimedObserver.prototype = {
 initialize: function(element, frequency, callback) {
 this.frequency = frequency;
 this.element = $(element);
 this.callback = callback;
 
 this.lastValue = this.getValue();
 this.registerCallback();
 },
 
 registerCallback: function() {
 setTimeout(this.onTimerEvent.bind(this), this.frequency * 1000);
 },
 
 onTimerEvent: function() {
 var value = this.getValue();
 if (this.lastValue != value) {
 this.callback(this.element, value);
 this.lastValue = value;
 }
 
 this.registerCallback();
 }
}

/**
 * Form.Element.Observer ?Form.Observer 其实是一L
 * 注意 Form.Observer q不是用来跟t整个表单的Q我惛_概只是ؓ了减书?q是Ruby的一个设计原?
 */
Form.Element.Observer = Class.create();
Form.Element.Observer.prototype = (new Abstract.TimedObserver()).extend({
 getValue: function() {
 return Form.Element.getValue(this.element);
 }
});

Form.Observer = Class.create();
Form.Observer.prototype = (new Abstract.TimedObserver()).extend({
 getValue: function() {
 return Form.serialize(this.element);
 }
});

/**
 * Ҏ class attribute 的名字得到对象数l,支持 multiple class
 *
 */
document.getElementsByClassName = function(className) {
 var children = document.getElementsByTagName('*') || document.all;
 var elements = new Array();
 
 for (var i = 0; i < children.length; i++) {
 var child = children[i];
 var classNames = child.className.split(' ');
 for (var j = 0; j < classNames.length; j++) {
 if (classNames[j] == className) {
 elements.push(child);
 break;
 }
 }
 }
 
 return elements;
}

/*--------------------------------------------------------------------------*/

/**
 * Element p一?java 的工LQ主要用?隐藏/昄/销?对象Q以及获取对象的单属性?
 *
 */
var Element = {
 toggle: function() {
 for (var i = 0; i < arguments.length; i++) {
 var element = $(arguments[i]);
 element.style.display =
 (element.style.display == 'none' ? '' : 'none');
 }
 },

 hide: function() {
 for (var i = 0; i < arguments.length; i++) {
 var element = $(arguments[i]);
 element.style.display = 'none';
 }
 },

 show: function() {
 for (var i = 0; i < arguments.length; i++) {
 var element = $(arguments[i]);
 element.style.display = '';
 }
 },

 remove: function(element) {
 element = $(element);
 element.parentNode.removeChild(element);
 },
 
 getHeight: function(element) {
 element = $(element);
 return element.offsetHeight;
 }
}

/**
 * ?Element.toggle 做了一个符可接,大概是兼Ҏ的考虑
 */
var Toggle = new Object();
Toggle.display = Element.toggle;

/*--------------------------------------------------------------------------*/

/**
 * 动态插入内容的实现QMS的Jscript实现中对象有一?insertAdjacentHTML Ҏ(http: //msdn.microsoft.com/workshop/author/dhtml/reference/methods/insertadjacenthtml.asp)
 * q里是一个对象Ş式的装?
 */
Abstract.Insertion = function(adjacency) {
 this.adjacency = adjacency;
}

Abstract.Insertion.prototype = {
 initialize: function(element, content) {
 this.element = $(element);
 this.content = content;
 
 if (this.adjacency && this.element.insertAdjacentHTML) {
 this.element.insertAdjacentHTML(this.adjacency, this.content);
 } else {
 /**
 * gecko 不支?insertAdjacentHTML ҎQ但可以用如下代码代?
 */
 this.range = this.element.ownerDocument.createRange();
 /**
 * 如果定义?initializeRange ҎQ则实行Q这里相当与定义了一个抽象的 initializeRange Ҏ
 */
 if (this.initializeRange) this.initializeRange();
 this.fragment = this.range.createContextualFragment(this.content);

 /**
 * insertContent 也是一个抽象方法,子类必须实现
 */
 this.insertContent();
 }
 }
}

/**
 * prototype 加深了我的体会,是写js 如何去遵循 Don’t Repeat Yourself (DRY) 原则
 * 上文?Abstract.Insertion 是一个抽象类Q定义了名ؓ initializeRange 的一个抽象方?
 * var Insertion = new Object() 建立一个命名空?
 * Insertion.Before|Top|Bottom|After p是四个java中的四个静态内部类Q而它们分别承于Abstract.InsertionQƈ实现了initializeRangeҎ?
 */
var Insertion = new Object();

Insertion.Before = Class.create();
Insertion.Before.prototype = (new Abstract.Insertion('beforeBegin')).extend({
 initializeRange: function() {
 this.range.setStartBefore(this.element);
 },
 
 /**
 * 内Ҏ入到指定节点的前? 与指定节点同U?
 */
 insertContent: function() {
 this.element.parentNode.insertBefore(this.fragment, this.element);
 }
});

Insertion.Top = Class.create();
Insertion.Top.prototype = (new Abstract.Insertion('afterBegin')).extend({
 initializeRange: function() {
 this.range.selectNodeContents(this.element);
 this.range.collapse(true);
 },
 
 /**
 * 内Ҏ入到指定节点的第一个子节点前,于是内容变ؓ该节点的W一个子节点
 */
 insertContent: function() {
 this.element.insertBefore(this.fragment, this.element.firstChild);
 }
});

Insertion.Bottom = Class.create();
Insertion.Bottom.prototype = (new Abstract.Insertion('beforeEnd')).extend({
 initializeRange: function() {
 this.range.selectNodeContents(this.element);
 this.range.collapse(this.element);
 },
 
 /**
 * 内Ҏ入到指定节点的最后,于是内容变ؓ该节点的最后一个子节点
 */
 insertContent: function() {
 this.element.appendChild(this.fragment);
 }
});

Insertion.After = Class.create();
Insertion.After.prototype = (new Abstract.Insertion('afterEnd')).extend({
 initializeRange: function() {
 this.range.setStartAfter(this.element);
 },

 /**
 * 内Ҏ入到指定节点的后? 与指定节点同U?
 */
 insertContent: function() {
 this.element.parentNode.insertBefore(this.fragment,
 this.element.nextSibling);
 }
});

/* q是包含错误的原版本
if (!Function.prototype.apply) {
// Based on code from http://www.youngpup.net/
Function.prototype.apply = function(object, parameters) {
var parameterStrings = new Array();
if (!object) object = window;
if (!parameters) parameters = new Array();

for (var i = 0; i < parameters.length; i++)
parameterStrings[i] = 'x[' + i + ']'; //Error 1

object.__apply__ = this;
var result = eval('obj.__apply__(' + //Error 2
parameterStrings[i].join(', ') + ')');
object.__apply__ = null;

return result;
}
}
*/

if (!Function.prototype.apply) {
 Function.prototype.apply = function(object, parameters) {
 var parameterStrings = new Array();
 if (!object) object = window;
 if (!parameters) parameters = new Array();

 for (var i = 0; i < parameters.length; i++)
 parameterStrings[i] = 'parameters[' + i + ']';

 object.__apply__ = this;
 var result = eval('object.__apply__(' + parameterStrings.join(', ') + ')');
 object.__apply__ = null;

 return result;
 }
}
Effect 的一个子c?br />


Effect.Blink = Class.create();
Effect.Blink.prototype = {
 initialize: function(element, frequency) {
 this.element = $(element);
 this.frequency = frequency?frequency:1000;
 this.element.effect_blink = this;
 this.blink();
 },

 blink: function() {
 if (this.timer) clearTimeout(this.timer);
 try {
 this.element.style.visibility = this.element.style.visibility == 'hidden'?'visible':'hidden';
 } catch (e) {}
 this.timer = setTimeout(this.blink.bind(this), this.frequency);
 }
};


Jaunt 2007-10-10 17:18 发表评论
]]>IE下的开发工具包(好东?http://m.tkk7.com/jaunt/archive/2007/04/02/108038.htmlJauntJauntMon, 02 Apr 2007 11:00:00 GMThttp://m.tkk7.com/jaunt/archive/2007/04/02/108038.htmlhttp://m.tkk7.com/jaunt/comments/108038.htmlhttp://m.tkk7.com/jaunt/archive/2007/04/02/108038.html#Feedback0http://m.tkk7.com/jaunt/comments/commentRss/108038.htmlhttp://m.tkk7.com/jaunt/services/trackbacks/108038.html 没想到IE下面也有q等好东?

Internet Explorer Developer Toolbar Beta 3



Jaunt 2007-04-02 19:00 发表评论
]]>
prototype.js 1.4版开发者手?强烈推荐)http://m.tkk7.com/jaunt/archive/2007/03/23/105703.htmlJauntJauntFri, 23 Mar 2007 00:56:00 GMThttp://m.tkk7.com/jaunt/archive/2007/03/23/105703.htmlhttp://m.tkk7.com/jaunt/comments/105703.htmlhttp://m.tkk7.com/jaunt/archive/2007/03/23/105703.html#Feedback0http://m.tkk7.com/jaunt/comments/commentRss/105703.htmlhttp://m.tkk7.com/jaunt/services/trackbacks/105703.html prototype.js 1.4版开发者手?强烈推荐)

Jaunt 2007-03-23 08:56 发表评论
]]>
status属性判断请求的l果与及Httph响应代码的含?/title><link>http://m.tkk7.com/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://m.tkk7.com/jaunt/archive/2006/11/29/84413.html</guid><wfw:comment>http://m.tkk7.com/jaunt/comments/84413.html</wfw:comment><comments>http://m.tkk7.com/jaunt/archive/2006/11/29/84413.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://m.tkk7.com/jaunt/comments/commentRss/84413.html</wfw:commentRss><trackback:ping>http://m.tkk7.com/jaunt/services/trackbacks/84413.html</trackback:ping><description><![CDATA[status存储服务器端q回的HTTPh响应代码Q它表示h的处理结果,响应代码的含义如下表Q?br /><br />Http状态码      |                 含义<br />      200          |       h成功<br />      204          |       h被接Ӟ但处理未完成<br />      400          |       错误的请?br />      404          |       h资源未找?br />      500          |       内部服务器错误,如是JSP,ASP代码错误{?img src ="http://m.tkk7.com/jaunt/aggbug/84413.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.tkk7.com/jaunt/" target="_blank">Jaunt</a> 2006-11-29 19:24 <a href="http://m.tkk7.com/jaunt/archive/2006/11/29/84413.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>readyState属性判断请求状态与及值的含义http://m.tkk7.com/jaunt/archive/2006/11/29/84412.htmlJauntJauntWed, 29 Nov 2006 11:16:00 GMThttp://m.tkk7.com/jaunt/archive/2006/11/29/84412.htmlhttp://m.tkk7.com/jaunt/comments/84412.htmlhttp://m.tkk7.com/jaunt/archive/2006/11/29/84412.html#Feedback0http://m.tkk7.com/jaunt/comments/commentRss/84412.htmlhttp://m.tkk7.com/jaunt/services/trackbacks/84412.htmlonreadystatechange事g是在readyState属性发生改变时触发的,readyState的DCZ当前h状?在事件处理程序中可以Ҏq个D行不同的处理Q各个值的含义好下表:

readyState值?|                                 含义   
      0              |    q也是readyState开始具有的|表示对象已经建立Q?br />                      |    但还未初始化,q时未调用openҎ
      1              |    表示openҎ已经调用Q但未调用sendҎ
      2              |    表示sendҎ已经调用Q其他数据未?br />      3              |    表示h已经发送成功,正在接收数据通信
      4              |    表示数据已接收成功,此时相当于直接ɋ览器打开|页Q?br />                      |    状态栏昄"完成"字样



Jaunt 2006-11-29 19:16 发表评论
]]>
Ajax应用的三U用户交互类?/title><link>http://m.tkk7.com/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://m.tkk7.com/jaunt/archive/2006/11/28/84122.html</guid><wfw:comment>http://m.tkk7.com/jaunt/comments/84122.html</wfw:comment><comments>http://m.tkk7.com/jaunt/archive/2006/11/28/84122.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://m.tkk7.com/jaunt/comments/commentRss/84122.html</wfw:commentRss><trackback:ping>http://m.tkk7.com/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元素相比QؓinnerHTML赋值的方式性能非常?</li></ul></li><li>~点 <ul><li>修改的内定w于屏q上某些固定的矩形区域,不够灉| </li></ul></li></ul></li> <li>以脚本ؓ中心的交? <ul class="incremental"><li>服务器返回的是一DJavaScript脚本 </li><li>客户端调用eval()函数执行q段脚本Q完成特定的d </li><li>优点 <ul><li>修改的内容不限于屏幕上某些固定的矩Ş区域 </li></ul></li><li>~点 <ul><li>生成的JavaScript专门ؓq个客户端设计,客户端与服务器端耦合的太?</li></ul></li></ul></li> <li>以数据ؓ中心的交? <ul class="incremental"><li>服务器返回的是XML或其他格式的数据 </li><li>在客L对获得的数据q行解析Q用DOM API创徏新的元素 </li><li>优点 <ul><li>客户端与服务器端松散耦合Q可以应用于多种cd的客L </li></ul></li><li>~点 <ul><li>客户端的代码最为复杂,需要在客户端划分MVC </li></ul></li></ul></li> <p>书摘QAjax In Action</p> <img src ="http://m.tkk7.com/jaunt/aggbug/84122.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.tkk7.com/jaunt/" target="_blank">Jaunt</a> 2006-11-28 19:12 <a href="http://m.tkk7.com/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://m.tkk7.com/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://m.tkk7.com/jaunt/archive/2006/11/28/84121.html</guid><wfw:comment>http://m.tkk7.com/jaunt/comments/84121.html</wfw:comment><comments>http://m.tkk7.com/jaunt/archive/2006/11/28/84121.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://m.tkk7.com/jaunt/comments/commentRss/84121.html</wfw:commentRss><trackback:ping>http://m.tkk7.com/jaunt/services/trackbacks/84121.html</trackback:ping><description><![CDATA[ <li>ModelQ业务领域对象,用JavaScript对象表示 </li> <li>ViewQ整个可~程处理的页? </li> <li>ControllerQ将UI和领域对象相q接的代码中的所有事件处理函数的l合 </li> <p> <br />书摘QAjax In Action</p> <img src ="http://m.tkk7.com/jaunt/aggbug/84121.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.tkk7.com/jaunt/" target="_blank">Jaunt</a> 2006-11-28 19:09 <a href="http://m.tkk7.com/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://m.tkk7.com/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://m.tkk7.com/jaunt/archive/2006/11/28/84120.html</guid><wfw:comment>http://m.tkk7.com/jaunt/comments/84120.html</wfw:comment><comments>http://m.tkk7.com/jaunt/archive/2006/11/28/84120.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://m.tkk7.com/jaunt/comments/commentRss/84120.html</wfw:commentRss><trackback:ping>http://m.tkk7.com/jaunt/services/trackbacks/84120.html</trackback:ping><description><![CDATA[ <p>Ajax所Z的核心技?/p> <li>XHTML </li> <li>CSS </li> <li>DOM </li> <li>JavaScript </li> <li>XML </li> <li>XMLHttpRequest <p>--------------------------------------------------------------------------------------------</p></li> <li>XHTML代表面中的l构 </li> <li>CSS代表面中的表现 </li> <li>DOM代表面中的行ؓ <p>--------------------------------------------------------------------------------------------</p></li> <li>面中的l构/表现/行ؓ三部分的分离是实现页面开发组件化和重用的关键 <ul class="incremental"><li>使用XHTML 1.0的strict DTDQ在html文g中不包含M有表现含义的标签 </li><li>完全使用CSS来做布局Q尽力探索CSS的潜? </li><li>JavaScript应尽量多地通过讄元素的id或class的方式来调用CSSQ而不是直接设|元素的style属?</li></ul></li> <li>忽视面中这三部分的分离Q是造成大多数Ajax开发的混ؕ之源 <ul class="incremental"><li>这三部分؜杂在一P开发、维护的成本非常? </li><li>不将q三部分分离开Q就无法对Ajax应用q行自动化的单元试 </li></ul></li> <li>是否熟练掌握q三个规范,是区分Ajax高手和低手的标准 <ul class="incremental"><li>q三个规范ƈ非像某些人想象的那样Q一周之内就可以掌握 </li><li>忠告Q?font color="#ff1493">在还没有学会走\之前Q不要指望自p跑的像刘一样快</font></li></ul></li> <p>书摘QAjax In Action</p> <img src ="http://m.tkk7.com/jaunt/aggbug/84120.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.tkk7.com/jaunt/" target="_blank">Jaunt</a> 2006-11-28 19:03 <a href="http://m.tkk7.com/jaunt/archive/2006/11/28/84120.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>常用的Ajax开发工?/title><link>http://m.tkk7.com/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://m.tkk7.com/jaunt/archive/2006/11/28/84119.html</guid><wfw:comment>http://m.tkk7.com/jaunt/comments/84119.html</wfw:comment><comments>http://m.tkk7.com/jaunt/archive/2006/11/28/84119.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://m.tkk7.com/jaunt/comments/commentRss/84119.html</wfw:commentRss><trackback:ping>http://m.tkk7.com/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">MSEQMicrosoft Script EditorQ?/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标准h很好的支? </li><li>Firefox支持JavaScript的最新版? </li><li>Firefox支持Canvas、SVG、E4X{新的技?</li></ul></li> <li>Q?font color="#008000">在Firefox上做开发,在IE上做试</font></li> </ul> <p>书摘QAjax In Action</p> <img src ="http://m.tkk7.com/jaunt/aggbug/84119.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.tkk7.com/jaunt/" target="_blank">Jaunt</a> 2006-11-28 18:59 <a href="http://m.tkk7.com/jaunt/archive/2006/11/28/84119.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>真正的JavaScript而非JScripthttp://m.tkk7.com/jaunt/archive/2006/11/26/83551.htmlJauntJauntSat, 25 Nov 2006 18:39:00 GMThttp://m.tkk7.com/jaunt/archive/2006/11/26/83551.htmlhttp://m.tkk7.com/jaunt/comments/83551.htmlhttp://m.tkk7.com/jaunt/archive/2006/11/26/83551.html#Feedback0http://m.tkk7.com/jaunt/comments/commentRss/83551.htmlhttp://m.tkk7.com/jaunt/services/trackbacks/83551.htmlNow|上有大量关于所谓JavaScript的参考手册或参考资料的Q其实大部分都是真对于微软所推出的JScript的,而不是现在我们用Ajax使用到的JavaScript哦…?br />今天在网上看到阿江对真正JavaScript而非Jscript的整理,如下Q?/p>


        1、javascript 参考 V1.5Q英文)
  http://www.ajiang.net/tools/CoreReferenceJS15.chm
  2、javascript 指南 V1.5Q英文)
  http://www.ajiang.net/tools/CoreGuideJS15.chm
  以上来自
  http://devedge.netscape.com/central/javascript/
  
  3、javascript 参考  来自 www.devguru.comQ英文)l构很清?br />  http://www.ajiang.net/tools/javascript_devguru.chm
  4、中文的参?br />  http://www.ajiang.net/tools/JavaScriptHelp_cn.chm
  
  |上很多地方把微软JSscript的中文参考当作javascript的参考提供下载,那是不能用的?/p>

Jaunt 2006-11-26 02:39 发表评论
]]>
վ֩ģ壺 һŷ| avһas| avƬһ| þùһ| AV뾫Ʒ| 91Ƶѹۿۿ| ˾Ʒձר61| վ| ޾Ʒ| ˾69ƷƵ| ޹˳վߵӰ| ŷƵ| ޾Ʒ߹ۿ| ѴƬ߹ۿ| Ʒҹ| ѿˬֻƽƬƵ1000| ޵һ͵Ľ| ۺ ŷ ˿ | Ƶ| þùѹۿƷ3| ޹Ʒyw߹ۿ| 99߾Ʒȫmy| ޺ݺۺϾþѿ| 뿴avվ| eeussӰԺֱ| þþþ޾ƷС˵| ww߹Ƶѹۿ| ޾ƷþþþYW| ѳ˻ɫƬ| þҹҹ³³Ƭ| ˬĻ| ޳꿴Ƭ߹ۿ| պƷѹۿ| ؼؼŷһ| һƷƵ| ƷƵ| ޾ƷľþĻ| ޾ƷӰ߲Ʒ| Ļ2019| ɫַ| ޾ƷwwwDz|