﻿<?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>IT博客-飘着的叶子，什么时候才落地-随笔分类-xml</title><link>http://www.cnitblog.com/piaoye12345/category/1032.html</link><description /><language>zh-cn</language><lastBuildDate>Fri, 30 Sep 2011 18:16:37 GMT</lastBuildDate><pubDate>Fri, 30 Sep 2011 18:16:37 GMT</pubDate><ttl>60</ttl><item><title>Web界面设计新趋势ajax</title><link>http://www.cnitblog.com/piaoye12345/archive/2005/11/23/4849.html</link><dc:creator>萌芽的叶子</dc:creator><author>萌芽的叶子</author><pubDate>Wed, 23 Nov 2005 09:02:00 GMT</pubDate><guid>http://www.cnitblog.com/piaoye12345/archive/2005/11/23/4849.html</guid><wfw:comment>http://www.cnitblog.com/piaoye12345/comments/4849.html</wfw:comment><comments>http://www.cnitblog.com/piaoye12345/archive/2005/11/23/4849.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/piaoye12345/comments/commentRss/4849.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/piaoye12345/services/trackbacks/4849.html</trackback:ping><description><![CDATA[<TABLE id=article54783980010000bh cellSpacing=0 cellPadding=0 border=0>
<TBODY>
<TR>
<TD align=middle>
<TABLE cellSpacing=0 cellPadding=0 border=0>
<TBODY>
<TR class=sysHand onclick="javascript:hide('articleBody54783980010000bh');swap('articleTitle54783980010000bh','className','up','down');">
<TD class=up id=articleTitle54783980010000bh>
<DIV class="sysBr500 title" id=commentText54783980010000bh>Web界面设计新趋势</DIV></TD></TR></TBODY></TABLE></TD></TR>
<TR id=articleBody54783980010000bh>
<TD class=aBody>
<TABLE cellSpacing=0 cellPadding=0 align=center border=0>
<TBODY>
<TR>
<TD class=author><IMG class=man src="http://image2.sina.com.cn/blog/tmpl/v3/theme/images/sun.gif"><SPAN class=time>2005-10-29　09:33:27</SPAN></TD></TR></TBODY></TABLE>
<TABLE class=dashed cellSpacing=0 cellPadding=0 align=center border=0>
<TBODY>
<TR>
<TD></TD></TR></TBODY></TABLE>
<TABLE class=aSize cellSpacing=0 cellPadding=0 align=center border=0>
<TBODY>
<TR>
<TD align=right><A onclick="$('articleText54783980010000bh').style.fontSize='16px'" href="javascript:;">大</A>　<A onclick="$('articleText54783980010000bh').style.fontSize='14'" href="javascript:;">中</A>　<A onclick="$('articleText54783980010000bh').style.fontSize='12'" href="javascript:;">小</A></TD></TR></TBODY></TABLE>
<TABLE class=description cellSpacing=0 cellPadding=0 align=center border=0>
<TBODY>
<TR>
<TD align=middle>
<DIV class="sysBr500 text" id=articleText54783980010000bh align=left>
<DIV>来源：视觉设计博客<BR><BR>严格说起来，AJAX<BR>并不是什么新鲜的技术，而且也不复杂高深，但是自从<BR>AJAX 这个名子出来之后，以及 Google 几个 Killer<BR>级的服务应用 AJAX，使得 AJAX<BR>好像在突然间大鸣大放，每个网站都想要开始采用类似的技术，但是<BR>AJAX 真的有这么好吗？在了解 AJAX<BR>之前先来看几个成功的例子：<BR>实例介绍<BR><BR><BR>Google Map<BR>Google Map 是应用 AJAX 技术最成功的例子，只要一提起<BR>AJAX，一定也会举 Google Map 做范例。底下是 Google Map 的<BR>UI，如果你有用过一定很熟悉：<BR><BR>&lt;img src="<A href="http://photos15.flickr.com/18802040_1ce6de48b7.jpg" target=_blank &#111;nclick="return top.js.OpenExtLink(window,event,this)">http://photos15.flickr.com<WBR>/18802040_1ce6de48b7.jpg</A>" alt="map"<BR>/&gt;<BR><BR>你可以直接在 Google Map<BR>的网页上拖拉缩放整面地图，地图细节则会慢慢显示出来<WBR>，就好像在你自己的计算机上使用<BR>papago 等软件一样，这就是 Google Map 最引人津津乐道的<BR>UI 设计，但是他怎么做到的？<BR><BR>GMail<BR>GMail 也是一个例子，在你登入你的 Gmail Account<BR>之后，你所看到的信件选单，信件内容等都是在同一个网页中显示<WBR>，不论你怎么选择你都不会做换页，它是怎么做到的？<BR>&lt;img src="<A href="http://photos15.flickr.com/18802042_bd82adf1dc.jpg" target=_blank &#111;nclick="return top.js.OpenExtLink(window,event,this)">http://photos15.flickr.com<WBR>/18802042_bd82adf1dc.jpg</A>" alt="a"<BR>/&gt;<BR><BR>Technorati Search Beta<BR>Technorati search 除了 search blog 文章外，现在也多了搜寻<BR>flickr 图片以及 furl 和 <A href="http://del.icio.us/" target=_blank &#111;nclick="return top.js.OpenExtLink(window,event,this)">del.icio.us</A> 的功能，算是半个<BR>meta-search engine<BR>吧，而且这些搜寻的结果都是在同一个页面中显示出来<WBR>，最快显示出来的数据当然是他自己<BR>index 的 blog<BR>文章，但当你在浏览结果时，网页的右手边也没闲着，正在帮你查询<BR>flickr, furl, <A href="http://del.lcio.us/" target=_blank &#111;nclick="return top.js.OpenExtLink(window,event,this)">del.lcio.us</A> 的结果呢！它是怎么做到的呢？<BR><BR>&lt;img src="<A href="http://photos12.flickr.com/18811520_4335f8d35b.jpg" target=_blank &#111;nclick="return top.js.OpenExtLink(window,event,this)">http://photos12.flickr.com<WBR>/18811520_4335f8d35b.jpg</A>" alt="b"<BR>/&gt;<BR><BR>这些问题的答案就是 AJAX。<BR><BR>传统网页流程的设计都是 Web Page -&gt; CGI -&gt; Web Page<BR>(Response) 的顺序，这之间整个页面都要经过重载，而且<BR>CGI<BR>在处理时是需要时间的，所以使用者在这段时间中需要等待<WBR> <!--
D(["mb","，但是这样的作法跟我们使用一般桌面应用软件的习惯不同<wbr />，在多数的应用软件中，即使是需要等待处理的程序<wbr />，也会先把处理完的结果先显示出来，但是在传统的网页流程设计中<wbr />，这是很难达到的。传统的网页流程设计是<br />synchronous 的，而 AJAX 是 Asynchronous，这就是为什么 AJAX<br />的全名是： Asynchronous &#106;avascript And XML ( Synchronous /<br />Asynchronous 的概念就好像是写 network socket<br />程序时，synchronous / asynchronous IO，或是 blocking /<br />none-blocking IO 的概念类似)。<br /><br />AJAX<br />并不是新的技术，早在这个名词出来以前，此类的技术就已经被广泛<wbr />运用了，后来由<br />Adaptive Path 这家公司取了 AJAX<br />这个名词来代表此类的技术。所以在这家公司的网站上可以找到一篇<wbr />由<br />Jesse James Garrett 所写的 Ajax: A New Approach to Web Applications<br />文章，可以帮助大家了解 AJAX<br />的定义以及技术层次的问题，这篇文章部分也被 Jacky\'s<br />blog 翻译成中文。其实说穿了，AJAX 就是运用 &#106;avascript<br />在背景偷偷帮你去跟服务器要资料，最后再由 &#106;avascript<br />或 DOM 来帮你呈现结果，因为所有动作都是由 &#106;avascript<br />代劳，所以省去了网页重载的麻烦，使用者也感受不到等待的痛苦<wbr />，让使用<br />Web Service 更像是在操作桌面软件。<br /><br />但是， AJAX 真的那么实用吗？网络上也有不少 blog<br />在批评 AJAX：<br /><br /><br />Ajax: 99% Bad<br /><br />嘟嘟老窝\'s AJAX的七宗罪<br />这篇文章讲得很好，说中了 AJAX 的麻烦所在。<br /><br />Ajax：剩下什么呢？<br /><br /><br />AJAX 存在的目的跟 Flash 有点雷同，都是要改进 Web UI<br />的呈现方式，但是既然不同于传统的 WebUI<br />呈现，便会出现一些不兼容性，例如不利于搜寻引擎做<br />index，以及造成一个没有 history 及 backforward<br />的网页浏览，这都不一定是使用者想要的，并不是所有的网页都适合<wbr />使用<br />AJAX 技术来改进 UI<br />呈现，在贸然转移前还是有必要多思考。<br /><br />其它 AJAX Demo<br /><br /><br />Spell Check<br /><br />Upload progress bar<br />这个 demo 可说是最能显示出 AJAX 强大的 Demo<br />了，很有趣，一定要看看。<br /><br />Google Instant<br />这个 meta-search engine 会由 &#106;avascript 在背景去 google<br />搜寻你的关键词，所以也不需要经过页面重载。<br /><br />Rico 的 AJAX Implementation 的 Demo<br />一定要玩看看他的 Weather Widget。<br />",0]
);

//--></SCRIPT>，但是这样的作法跟我们使用一般桌面应用软件的习惯不同<WBR>，在多数的应用软件中，即使是需要等待处理的程序<WBR>，也会先把处理完的结果先显示出来，但是在传统的网页流程设计中<WBR>，这是很难达到的。传统的网页流程设计是<BR>synchronous 的，而 AJAX 是 Asynchronous，这就是为什么 AJAX<BR>的全名是： Asynchronous javascript And XML ( Synchronous /<BR>Asynchronous 的概念就好像是写 network socket<BR>程序时，synchronous / asynchronous IO，或是 blocking /<BR>none-blocking IO 的概念类似)。<BR><BR>AJAX<BR>并不是新的技术，早在这个名词出来以前，此类的技术就已经被广泛<WBR>运用了，后来由<BR>Adaptive Path 这家公司取了 AJAX<BR>这个名词来代表此类的技术。所以在这家公司的网站上可以找到一篇<WBR>由<BR>Jesse James Garrett 所写的 Ajax: A New Approach to Web Applications<BR>文章，可以帮助大家了解 AJAX<BR>的定义以及技术层次的问题，这篇文章部分也被 Jacky's<BR>blog 翻译成中文。其实说穿了，AJAX 就是运用 javascript<BR>在背景偷偷帮你去跟服务器要资料，最后再由 javascript<BR>或 DOM 来帮你呈现结果，因为所有动作都是由 javascript<BR>代劳，所以省去了网页重载的麻烦，使用者也感受不到等待的痛苦<WBR>，让使用<BR>Web Service 更像是在操作桌面软件。<BR><BR>但是， AJAX 真的那么实用吗？网络上也有不少 blog<BR>在批评 AJAX：<BR><BR><BR>Ajax: 99% Bad<BR><BR>嘟嘟老窝's AJAX的七宗罪<BR>这篇文章讲得很好，说中了 AJAX 的麻烦所在。<BR><BR>Ajax：剩下什么呢？<BR><BR><BR>AJAX 存在的目的跟 Flash 有点雷同，都是要改进 Web UI<BR>的呈现方式，但是既然不同于传统的 WebUI<BR>呈现，便会出现一些不兼容性，例如不利于搜寻引擎做<BR>index，以及造成一个没有 history 及 backforward<BR>的网页浏览，这都不一定是使用者想要的，并不是所有的网页都适合<WBR>使用<BR>AJAX 技术来改进 UI<BR>呈现，在贸然转移前还是有必要多思考。<BR><BR>其它 AJAX Demo<BR><BR><BR>Spell Check<BR><BR>Upload progress bar<BR>这个 demo 可说是最能显示出 AJAX 强大的 Demo<BR>了，很有趣，一定要看看。<BR><BR>Google Instant<BR>这个 meta-search engine 会由 javascript 在背景去 google<BR>搜寻你的关键词，所以也不需要经过页面重载。<BR><BR>Rico 的 AJAX Implementation 的 Demo<BR>一定要玩看看他的 Weather Widget。</DIV></DIV></TD></TR></TBODY></TABLE></TD></TR></TBODY></TABLE>
<H3 style="MARGIN-TOP: 3em">Ajax 简介 </H3>
<P>AJAX全称为“Asynchronous JavaScript and XML”（异步JavaScript和XML），是指一种创建交互式网页应用的网页开发技术。它有机地包含了以下几种技术：<BR><BR>Ajax（Asynchronous JavaScript + XML）的定义<BR><BR>基于web标准（standards-based presentation）<A href="http://zh.wikipedia.org/wiki/XHTML">XHTML</A>+ <A href="http://zh.wikipedia.org/wiki/CSS">CSS</A>的表示； <BR>使用 <A href="http://zh.wikipedia.org/wiki/DOM">DOM（Document Object Model）</A>进行动态显示及交互； <BR>使用 <A href="http://zh.wikipedia.org/wiki/XML">XML</A> 和 <A href="http://zh.wikipedia.org/wiki/XSLT">XSLT</A> 进行数据交换及相关操作； <BR>使用 <A href="http://zh.wikipedia.org/wiki/XMLHttpRequest">XMLHttpRequest</A> 进行异步数据查询、检索； <BR><BR>传统的web应用允许用户填写表单(form)，当提交表单时就向web服务器发送一个请求。服务器接收并处理传来的表单，然后返回一个新的网页。这个做法浪费了许多带宽，因为在前后两个页面中的大部分HTML代码往往是相同的。由于每次应用的交互都需要向服务器发送请求，应用的响应时间就依赖于服务器的响应时间。这导致了用户界面的响应比本地应用慢得多。<BR><BR>与此不同，AJAX应用可以仅向服务器发送并取回必需的数据，它使用SOAP或其它一些基于XML的web service接口，并在客户端采用JavaScript处理来自服务器的响应。因为在服务器和浏览器之间交换的数据大量减少，结果我们就能看到响应更快的应用。同时很多的处理工作可以在发出请求的客户端机器上完成，所以Web服务器的处理时间也减少了。<BR><BR>使用Ajax的最大优点就是能在不刷新整个页面的前提下维护数据。这使得Web应用程序更为迅捷地响应用户交互，并避免了在网络上发送那些没有改变的信息。<BR><BR>Ajax不需要任何浏览器插件，但需要用户允许JavaScript在浏览器上执行。就像DHTML应用程序那样，Ajax应用程序必须在众多不同的浏览器和平台上经过严格的测试。随着Ajax的成熟，一些简化Ajax使用方法的程序库也相继问世。同样，也出现了另一种辅助程序设计的技术，为那些不支持JavaScript的用户提供替代功能。<BR><BR>对应用Ajax最主要的批评就是，它可能破坏浏览器后退按钮的正常行为（参见Jakob Nielsen's的《1999 Top-10 New Mistakes of Web Design》）。在动态更新页面的情况下，用户无法回到前一个页面状态，因为浏览器仅能记忆历史记录中的静态页面。一个被完整读入的页面与一个已经被动态修改过的页面之间的差别非常微妙；用户通常会希望单击后退按钮能够取消他们的前一次操作，但是在Ajax应用程序中，这将无法实现。开发者们想出了种种办法来解决这个问题，大多数都是在用户单击后退按钮访问历史记录时，通过创建或使用一个隐藏的IFRAME来重现页面上的变更。（例如，当用户在Google Maps中单击后退时，它在一个隐藏的IFRAME中进行搜索，然后将搜索结果反映到Ajax元素上，以便将应用程序状态恢复到当时的状态。）<BR><BR>一个相关的观点认为，使用动态页面更新使得用户难于将某个特定的状态保存到收藏夹中。该问题的解决方案也已出现，大部分都使用URL片断标识符（通常被称为锚点，即URL中#后面的部分）来保持跟踪，允许用户回到指定的某个应用程序状态。（许多浏览器允许JavaScript动态更新锚点，这使得Ajax应用程序能够在更新显示内容的同时更新锚点。）这些解决方案也同时解决了许多关于不支持后退按钮的争论。<BR><BR>进行Ajax开发时，网络延迟??即用户发出请求到服务器发出响应之间的间隔??需要慎重考虑。不给予用户明确的回应[3]，没有恰当的预读数据[4]，或者对XMLHttpRequest的不恰当处理[5]，都会使用户感到延迟，这是用户不希望看到的，也是他们无法理解的。[6]通常的解决方案是，使用一个可视化的组件来告诉用户系统正在进行后台操作并且正在读取数据和内容。<BR><BR></P><img src ="http://www.cnitblog.com/piaoye12345/aggbug/4849.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/piaoye12345/" target="_blank">萌芽的叶子</a> 2005-11-23 17:02 <a href="http://www.cnitblog.com/piaoye12345/archive/2005/11/23/4849.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Start AJAX</title><link>http://www.cnitblog.com/piaoye12345/archive/2005/11/23/4847.html</link><dc:creator>萌芽的叶子</dc:creator><author>萌芽的叶子</author><pubDate>Wed, 23 Nov 2005 08:43:00 GMT</pubDate><guid>http://www.cnitblog.com/piaoye12345/archive/2005/11/23/4847.html</guid><wfw:comment>http://www.cnitblog.com/piaoye12345/comments/4847.html</wfw:comment><comments>http://www.cnitblog.com/piaoye12345/archive/2005/11/23/4847.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.cnitblog.com/piaoye12345/comments/commentRss/4847.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/piaoye12345/services/trackbacks/4847.html</trackback:ping><description><![CDATA[<H2 class=post-title>Start AJAX</H2>
<DIV class=post-body>
<P>最近开始研究<ACRONYM title="Asynchronous JavaScript and XML">AJAX</ACRONYM>（Asynchronous JavaScript and XML），很幸运google到了这篇发表在<A href="http://developer.mozilla.org/"><FONT color=#6c8c37>Devmo</FONT></A>上的<A href="http://developer.mozilla.org/en/docs/AJAX:Getting_Started"><FONT color=#6c8c37>AJAX: Getting Started</FONT></A>。现把这篇简洁易懂的文章翻译如下，与大家共享，希望能对大家有所帮助！</P>
<P>这篇文章会使你对AJAX有一个基本了解，并给出两个容易上手的例子。</P>
<H3>目录</H3>
<P>
<OL>
<LI><A href="http://www.marchbox.com/blog/post/start_ajax.html#what-s-ajax"><FONT color=#009193>什么是AJAX？</FONT></A> 
<LI><A href="http://www.marchbox.com/blog/post/start_ajax.html#http-request"><FONT color=#009193>第一步：如何发出一个HTTP请求</FONT></A> 
<LI><A href="http://www.marchbox.com/blog/post/start_ajax.html#server-response"><FONT color=#009193>第二步：处理服务器的响应</FONT></A> 
<LI><A href="http://www.marchbox.com/blog/post/start_ajax.html#simple-example"><FONT color=#009193>第三步：一个简单的例子</FONT></A> 
<LI><A href="http://www.marchbox.com/blog/post/start_ajax.html#xml-response"><FONT color=#009193>第四步：与<ACRONYM title="Extensible Markup Language">XML</ACRONYM>响应协同工作</FONT></A></LI></OL>
<P><FONT color=#009193></FONT></P>
<H3 id=what-s-ajax name="what-s-ajax">什么是AJAX</H3>
<P>AJAX是一个新的合成术语，隐含了两个已经存在多年的JavaScript特性，但是直到最近，随着一些诸如Gmail、Google Suggest以及Google Maps的轰动，才被许多网络开发者所注意到。</P>
<P>我们所讨论的两个JavaScript的特性是你能够： 
<UL>
<LI>向服务器发出请求而不需重新加载任何页面 
<LI>解析XML文档并且与之协同工作</LI></UL>
<P></P>
<P>AJAX是一个缩写，<STRONG>A</STRONG>是指<EM>"asynchronous"</EM>（异步的），它表示你可以在向服务器发出一个HTTP请求后，边做其他的事情，边等待服务器的响应。<STRONG>JA</STRONG>表示<EM>"JavaScript"</EM>，<STRONG>X</STRONG>表示<EM>"XML"</EM>（可扩展标记语言）。</P>
<H3 id=http-request name="http-request">第一步：如何发出一个HTTP请求</H3>
<P>为了用JavaScript向服务器发出一个HTTP请求，你需要一个类的实例来提供给你这种功能。这个类原本在IE里被作为一个ActiveX对象提出，叫<CODE>XMLHTTP</CODE>。然后，Mozilla、Safari以及一些其他的浏览器相继跟随，出现了一个<CODE>XMLHttpRequest</CODE>类，其支持微软的ActiveX对象原本的方法和属性。</P>
<P>所以，为了能够跨浏览器地创建这个类的对象，你需要这样：<PRE><CODE>if (window.XMLHttpRequest) { // Mozilla, Safari,<BR>http_request = new XMLHttpRequest();<BR>} else if (window.ActiveXObject) { // IE<BR>http_request = new ActiveXObject("Microsoft.XMLHTTP");<BR>}</CODE></PRE>（以上例子中的代码，是一个用来构建XMLHTTP实例的简单版本，实际使用时的例子请参见本文的第三步） 
<P></P>
<P>如果服务器端的响应中没有包含XML的mime-type报头（header），有些版本的Mozilla浏览器可能不会处理。所以，为了安全起见，你可以用一个特殊的方法来给服务器端发出的响应强加上这个报头，以防其不是<CODE>text/xml</CODE>类型。<PRE><CODE>http_request = new XMLHttpRequest();<BR>http_request.overrideMimeType('text/xml');</CODE></PRE>
<P></P>
<P>下一步就是你来决定在服务器对你的请求作出响应后，你准备做什么。这一阶段，你只需要告诉HTTP请求对象（HTTP request object）用哪一个JavaScript函数来处理这一响应。这一步用设置该对象<CODE>onreadystatechange</CODE>属性为相应的JavaScript函数名来实现：<PRE><CODE>http_request.onreadystatechange = nameOfTheFunction;</CODE></PRE>
<P></P>
<P>注意，在函数名后面没有括号。另外如下定义处理响应的函数：<PRE><CODE>http_request.onreadystatechange = function(){<BR>// 处理响应<BR>};</CODE></PRE>
<P></P>
<P>接下来，既然你已经声明了在接到响应后干什么，你就需要去发出请求。你需要调用HTTP请求类的<CODE>open()</CODE>和<CODE>send()</CODE>方法：<PRE><CODE>http_request.open('GET', 'http://www.example.org/some.file', true);<BR>http_request.send(null);</CODE></PRE>
<UL>
<LI><CODE>open()</CODE>方法的第一个参数是HTTP请求的方式——GET、POST、HEAD或者任何其它你想使用的，你的服务器支持的方式。方式的名称要大写，否则有些浏览器（如Firefox）可能就不会处理请求。可以去 <A title=http://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html href="http://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html"><FONT color=#6c8c37>W3C specs</FONT></A>获取更多的你可以使用的HTTP请求方式的信息。 
<LI>第二个参数是你所请求页面的URL。 
<LI>第三个参数是用来设置请求是否为异步的。如果是<CODE>TRUE</CODE>，则在服务器尚未返回响应的时候，JavaScript的函数会继续执行。这也就是AJAX中的A的含义。</LI></UL>
<P></P>
<P><CODE>send()</CODE>方法的参数可以使任何你希望传递给服务器的数据，数据应该为如下格式的查询串：<PRE><CODE>name=value&amp;anothername=othervalue&amp;so=on</CODE></PRE>
<P></P>
<H3 id=server-response name="server-response">第二步：处理服务器响应</H3>
<P>记住，当你向服务器发出了一个请求，你也就发出了一个被设计用来处理响应的JavaScript函数的名字。</P>
<P><CODE>http_request.onreadystatechange = nameOfTheFunction;</CODE></P>
<P>我们来看看这个函数都应该做些什么。首先，其需要检查请求的状态，如果状态的值为4，那么就意味着全部的服务器响应都已接受完毕，你可以继续来处理了。<PRE><CODE>if (http_request.readyState == 4) {<BR>// 一切就绪，相映已接受完成<BR>} else {<BR>//尚未就绪<BR>}</CODE></PRE><CODE>readyState</CODE>全部值的列表如下： 
<UL>
<LI>0（未初始化/uninitialized） 
<LI>1（正在加载/loading） 
<LI>2（加载完毕/loaded） 
<LI>3（交互/interactive） 
<LI>4（完成/complete）</LI></UL>(<A title="http://msdn.microsoft.com/workshop/author/dhtml/reference/properties/readystate 1.asp" href="http://msdn.microsoft.com/workshop/author/dhtml/reference/properties/readystate_1.asp"><FONT color=#6c8c37>来源</FONT></A>) 
<P></P>
<P>下一步是检查HTTP服务器响应的情况代码。所有可能的代码都被列在了<A title=http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html href="http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html"><FONT color=#6c8c37>W3C的网站</FONT></A>上。目前，我们只对<CODE>200 OK</CODE>响应感兴趣。<PRE><CODE>if (http_request.status == 200) {<BR>// 棒极了！<BR>} else {<BR>// 请求出了些问题，<BR>// 比如响应可能是404(Not Found)，未找到<BR>// 或者500，内部服务器错误<BR>}</CODE></PRE>
<P></P>
<P>在你检查完请求的状态和HTTP响应情况后，你就可以自己决定对服务器发送给你的数据作什么样的处理了。你有两种途径来访问这些数据： 
<UL>
<LI><CODE>http_request.responseText</CODE>将会把服务器的响应作为一个文本串返回 
<LI><CODE>http_request.responseXML</CODE>将把响应作为一个<CODE>XMLDocument</CODE>对象返回，你可以用JavaScript的文档对象模型（DOM）的函数来处理</LI></UL>
<P></P>
<H3 id=simple-example name="simple-example">第三步：一个简单的例子</H3>
<P>我现在来做一个简单的HTTP请求。我们的JavaScript脚本将会请求一个HTML文档，<CODE>test.html</CODE>，其包含了一段文本——“这是一个测试。”——然后我们会<CODE>alert() test.html</CODE>的内容。</P><PRE><CODE>&lt;script type="text/javascript" language="javascript"&gt;<BR>var http_request = false;<BR><BR>function makeRequest(url) {<BR><BR>http_request = false;<BR><BR>if (window.XMLHttpRequest) { // Mozilla, Safari,...<BR><BR>http_request = new XMLHttpRequest();<BR>if (http_request.overrideMimeType) {<BR>http_request.overrideMimeType('text/xml');<BR>}<BR>} else if (window.ActiveXObject) { // IE<BR>try {<BR>http_request = new ActiveXObject("Msxml2.XMLHTTP");<BR>} catch (e) {<BR>try {<BR>http_request = new ActiveXObject("Microsoft.XMLHTTP");<BR>} catch (e) {}<BR>}<BR>}<BR><BR>if (!http_request) {<BR>alert('Giving up&nbsp;:( Cannot create an XMLHTTP instance');<BR>return false;<BR>}<BR>http_request.onreadystatechange = alertContents;<BR>http_request.open('GET', url, true);<BR>http_request.send(null);<BR><BR>}<BR><BR>function alertContents() {<BR><BR>if (http_request.readyState == 4) {<BR>if (http_request.status == 200) {<BR>alert(http_request.responseText);<BR>} else {<BR>alert('There was a problem with the request.');<BR>}<BR>}<BR><BR>}<BR>&lt;/script&gt;<BR><BR>&lt;span<BR>style="cursor: pointer; text-decoration: underline"<BR>onclick="makeRequest('test.html')"&gt;<BR>发出请求<BR>&lt;/span&gt;</CODE></PRE>
<P>在这个例子中： 
<UL>
<LI>用户在浏览器里点击“发出请求”（make a request）； 
<LI>这会调用<CODE>makeRequest()</CODE>函数，并且附有参数<CODE>test.html</CODE>，一个自阿同一目录下的HTML文档的名字。 
<LI>请求被发出，然后（<CODE>onreadystatechange</CODE>）操作被传递给<CODE>alertContents()</CODE>； 
<LI><CODE>alertContents()</CODE>检查响应是否被接收和是否状态为“OK”，然后<CODE>alert() test.html</CODE>文件的内容。</LI></UL>
<P></P>
<P>你可以在<A title="http://www.w3clubs.com/mozdev/httprequest test.html" href="http://www.w3clubs.com/mozdev/httprequest_test.html"><FONT color=#6c8c37>这里</FONT></A>测试这个例子，并且可以在<A title=http://www.w3clubs.com/mozdev/test.html href="http://www.w3clubs.com/mozdev/test.html"><FONT color=#6c8c37>这里</FONT></A>看见测试文件。</P>
<H3 id=xml-response name="xml-response">与XML响应协同工作</H3>
<P>在上个例子中，在HTTP响应被接收完毕后，我们和使用了请求对象的<CODE>responseText</CODE>属性，其包含了<CODE>test.html</CODE>文件的内容。现在，让我们试试<CODE>responseXML</CODE>属性。</P>
<P>让我们现在就创建一个有效的XML文档，这个文档稍后会被我们请求。文档（test.xml）包括：<PRE><CODE>&lt;?xml version="1.0"&nbsp;encoding="utf-8"&nbsp;?&gt;<BR>&lt;root&gt;<BR>这是个测试.<BR>&lt;/root&gt;</CODE></PRE>我们只需要在脚本中用下面的内容替换请求行：<PRE><CODE>...<BR>onclick="makeRequest('test.xml)"&gt;<BR>...</CODE></PRE>然后在<CODE>alertContents()</CODE>里把<CODE>alert()</CODE>行替换成<CODE>alert(http_request.responseText);</CODE>，并且，在其上方写下：<PRE><CODE>var xmldoc = http_request.responseXML;<BR>var root_node = xmldoc.getElementsByTagName('root').item(0);<BR>alert(root_node.firstChild.data);</CODE></PRE>
<P></P>
<P>这样，我们获取了<CODE>responseXML</CODE>中的<CODE>XMLDocument</CODE>对象，并且用DOM方法来访问了XML文档中所包含的某些内容。你可以在<A title=http://www.w3clubs.com/mozdev/test.xml href="http://www.w3clubs.com/mozdev/test.xml"><FONT color=#6c8c37>这里</FONT></A>浏览到<CODE>test.xml</CODE>，更新后的脚本可以在<A title="http://www.w3clubs.com/mozdev/httprequest test xml.html" href="http://www.w3clubs.com/mozdev/httprequest_test_xml.html"><FONT color=#6c8c37>这里</FONT></A>得到。</P>
<P>可以去<A title=http://www.mozilla.org/docs/dom/ href="http://www.mozilla.org/docs/dom/"><FONT color=#6c8c37>Mozilla's DOM implementation</FONT></A>获取更多的DOM方法。</P></DIV>
<H5 class=post-tags>Tags: <A href="http://www.marchbox.com/blog/catalog.asp?tags=AJAX"><FONT color=#009193>AJAX</FONT></A>&nbsp;&nbsp;<A href="http://www.marchbox.com/blog/catalog.asp?tags=XML"><FONT color=#009193>XML</FONT></A>&nbsp;&nbsp;<A href="http://www.marchbox.com/blog/catalog.asp?tags=JavaScript"><FONT color=#009193>JavaScript</FONT></A>&nbsp;&nbsp;<A href="http://www.marchbox.com/blog/catalog.asp?tags=%E7%BF%BB%E8%AF%91"><FONT color=#009193>翻译</FONT></A>&nbsp;&nbsp;<A href="http://www.marchbox.com/blog/catalog.asp?tags=%E7%A0%94%E7%A9%B6"><FONT color=#009193>研究</FONT></A>&nbsp;&nbsp;<A href="http://www.marchbox.com/blog/catalog.asp?tags=Mozilla"><FONT color=#009193>Mozilla</FONT></A>&nbsp;&nbsp;</H5><img src ="http://www.cnitblog.com/piaoye12345/aggbug/4847.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/piaoye12345/" target="_blank">萌芽的叶子</a> 2005-11-23 16:43 <a href="http://www.cnitblog.com/piaoye12345/archive/2005/11/23/4847.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Ajax(Asynchronous JavaScript and XML)</title><link>http://www.cnitblog.com/piaoye12345/archive/2005/11/23/4846.html</link><dc:creator>萌芽的叶子</dc:creator><author>萌芽的叶子</author><pubDate>Wed, 23 Nov 2005 08:40:00 GMT</pubDate><guid>http://www.cnitblog.com/piaoye12345/archive/2005/11/23/4846.html</guid><wfw:comment>http://www.cnitblog.com/piaoye12345/comments/4846.html</wfw:comment><comments>http://www.cnitblog.com/piaoye12345/archive/2005/11/23/4846.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/piaoye12345/comments/commentRss/4846.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/piaoye12345/services/trackbacks/4846.html</trackback:ping><description><![CDATA[<P>今天接触一个新东西，听说可以任意拖动，和windows电脑一样拖动文件夹一样，就收集一些资料放这里<BR></P>
<DIV class=title>Ajax内部交流文档</DIV>
<DIV style="TEXT-ALIGN: right">创建日期：2005年04月04日<BR>最后修改：2005年04月05日<BR>创建人：<A href="http://www.dragonson.com/guestbook/index.asp" target=_blank>Amour GUO</A>(Waymangood)<BR><SPAN style="COLOR: #f00">引用请保持文章完整性并注明出处</SPAN> 
<DIV class=headline>一、使用Ajax的主要原因</DIV>
<DIV class="content f14">　　<B>1、通过适当的Ajax应用达到更好的用户体验；</B><BR>　　<B>2、把以前的一些服务器负担的工作转嫁到客户端，利于客户端闲置的处理能力来处理，减轻服务器和带宽的负担，从而达到节约ISP的空间及带宽租用成本的目的。</B><BR></DIV>
<DIV class=headline>二、引用</DIV>
<DIV class=content><B>Ajax这个概念的最早提出者<A href="http://www.adaptivepath.com/publications/essays/archives/000385.php" target=_blank>Jesse James Garrett</A>认为：</B><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 height=566 alt=图2－1 src="http://www.dragonson.com/doc/images/ajax-fig1.png" width=591><BR>图2－1 <BR><BR><IMG height=598 alt=图2－2 src="http://www.dragonson.com/doc/images/ajax-fig2_small.png" width=475><BR>图2－2 </DIV></DIV>
<DIV class=headline>三、概述</DIV>
<DIV class=content>　　虽然Garrent列出了7条Ajax的构成技术，但个人认为，所谓的Ajax其核心只有JavaScript、XMLHTTPRequest和DOM，如果所用数据格式为XML的话，还可以再加上XML这一项(Ajax从服务器端返回的数据可以是XML格式，也可以是文本等其他格式)。<BR>　　在旧的交互方式中,由用户触发一个HTTP请求到服务器,服务器对其进行处理后再返回一个新的HTHL页到客户端,每当服务器处理客户端提交的请求时,客户都只能空闲等待,并且哪怕只是一次很小的交互、只需从服务器端得到很简单的一个数据,都要返回一个完整的HTML页,而用户每次都要浪费时间和带宽去重新读取整个页面。<BR>　　而使用Ajax后用户从感觉上几乎所有的操作都会很快响应没有页面重载（白屏）的等待。<BR>　　<B>1、XMLHTTPRequest</B><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 class=blkBorder>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 class=blkBorder>/**<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 class=tdAjax cellSpacing=1 width="80%" bgColor=#cccccc>
<TBODY>
<TR>
<TD><B>方法</B></TD>
<TD><B>描述</B></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 class=tdAjax cellSpacing=1 width="80%" bgColor=#cccccc>
<TBODY>
<TR>
<TD><B>属性</B></TD>
<TD><B>描述</B></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>　　<B>2、JavaScript</B><BR>　　JavaScript是一在浏览器中大量使用的编程语言，，他以前一直被贬低为一门糟糕的语言（他确实在使用上比较枯燥），以在常被用来作一些用来炫耀的小玩意和恶作剧或是单调琐碎的表单验证。但事实是，他是一门真正的编程语言，有着自已的标准并在各种浏览器中被广泛支持。<BR>　　<B>3、DOM</B><BR>　　Document Object Model。<BR>　　DOM是给 HTML 和 XML 文件使用的一组 API。它提供了文件的结构表述，让你可以改变其中的內容及可见物。其本质是建立网页与 Script 或程序语言沟通的桥梁。<BR>　　所有WEB开发人员可操作及建立文件的属性、方法及事件都以对象来展现（例如，document 就代表“文件本身“这个对像，table 对象则代表 HTML 的表格对象等等）。这些对象可以由当今大多数的浏览器以 Script 来取用。<BR>　　一个用HTML或XHTML构建的网页也可以看作是一组结构化的数据，这些数据被封在DOM（Document Object Model）中，DOM提供了网页中各个对象的读写的支持。<BR>　　<B>4、XML</B><BR>　　可扩展的标记语言（Extensible Markup Language）具有一种开放的、可扩展的、可自描述的语言结构，它已经成为网上数据和文档传输的标准。它是用来描述数据结构的一种语言，就正如他的名字一样。他使对某些结构化数据的定义更加容易，并且可以通过他和其他应用程序交换数据。<BR>　　<B>5、综合</B><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来说，可以说是损失巨大的。而AJAX可以所为客户端和服务器的中间层，来处理客户端的请求，并根据需要向服务器端发送请求，用什么就取什么、用多少就取多少，就不会有数据的冗余和浪费，减少了数据下载总量，而且更新页面时不用重载全部内容，只更新需要更新的那部分即可，相对于纯后台处理并重载的方式缩短了用户等待时间，也把对资源的浪费降到最低，基于标准化的并被广泛支持和技术，并且不需要插件或下载小程序，所以Ajax对于用户和ISP来说是双盈的。<BR>　　Ajax使WEB中的界面与应用分离（也可以说是数据与呈现分离），而在以前两者是没有清晰的界限的，数据与呈现分离的分离，有利于分工合作、减少非技术人员对页面的修改造成的WEB应用程序错误、提高效率、也更加适用于现在的发布系统。也可以把以前的一些服务器负担的工作转嫁到客户端，利于客户端闲置的处理能力来处理。<BR></DIV>
<DIV class=headline>四、应用</DIV>
<DIV class=content>　　Ajax理念的出现，揭开了无刷新更新页面时代的序幕，并有代替传统web开发中采用form(表单)递交方式更新web页面的趋势，可以算是一个里程碑。但Ajax都不是适用于所有地方的，它的适用范围是由它的特性所决定的。<BR>　　举个应用的例子，是关于级联菜单方面的Ajax应用。<BR>　　我们以前的对级联菜单的处理是这样的：<BR>　　为了避免每次对菜单的操作引起的重载页面，不采用每次调用后台的方式，而是一次性将级联菜单的所有数据全部读取出来并写入数组，然后根据用户的操作用JavaScript来控制它的子集项目的呈现，这样虽然解决了操作响应速度、不重载页面以及避免向服务器频繁发送请求的问题，但是如果用户不对菜单进行操作或只对菜单中的一部分进行操作的话，那读取的数据中的一部分就会成为冗余数据而浪费用户的资源，特别是在菜单结构复杂、数据量大的情况下（比如菜单有很多级、每一级菜又有上百个项目），这种弊端就更为突出。<BR>　　如果在此案中应用Ajax后，结果就会有所改观：<BR>　　在初始化页面时我们只读出它的第一级的所有数据并显示，在用户操作一级菜单其中一项时，会通过Ajax向后台请求当前一级项目所属的二级子菜单的所有数据，如果再继续请求已经呈现的二级菜单中的一项时，再向后面请求所操作二级菜单项对应的所有三级菜单的所有数据，以此类推……这样，用什么就取什么、用多少就取多少，就不会有数据的冗余和浪费，减少了数据下载总量，而且更新页面时不用重载全部内容，只更新需要更新的那部分即可，相对于后台处理并重载的方式缩短了用户等待时间，也把对资源的浪费降到最低。<BR>　　此外，Ajax由于可以调用外部数据，也可以实现数据聚合的功能（当然要有相应授权），比如微软刚刚在3月15日发布的在线RSS阅读器BETA版；还可以利于一些开放的数据，开发自已的一些应用程序，比如用Amazon的数据作的一些新颖的图书搜索应用。<BR>　　总之，Ajax适用于交互较多，频繁读数据，数据分类良好的WEB应用。<BR></DIV>
<DIV class=headline>五、Ajax的优势</DIV>
<DIV class=content>　　<B>1、减轻服务器的负担。因为Ajax的根本理念是“按需取数据”，所以最大可能在减少了冗余请求和响影对服务器造成的负担；</B><BR>　　<B>2、无刷新更新页面，减少用户实际和心理等待时间；</B><BR>　　首先，“按需取数据”的模式减少了数据的实际读取量，打个很形象的比方，如果说重载的方式是从一个终点回到原点再到另一个终点的话，那么Ajax就是以一个终点为基点到达另一个终点；<BR></B>
<DIV align=center><IMG height=117 alt=重载方式 src="http://www.dragonson.com/doc/images/ajax_00.gif" width=244><BR>图5－1 <BR><BR><IMG height=59 alt=Ajax方式 src="http://www.dragonson.com/doc/images/ajax_01.gif" width=244> <BR>图5－2 </DIV>　　其次，即使要读取比较大的数据，也不用像RELOAD一样出现白屏的情况，由于Ajax是用XMLHTTP发送请求得到服务端应答数据，在不重新载入整个页面的情况下用Javascript操作DOM最终更新页面的，所以在读取数据的过程中，用户所面对的也不是白屏，而是原来的页面状态（或者可以加一个LOADING的提示框让用户了解数据读取的状态），只有当接收到全部数据后才更新相应部分的内容，而这种更新也是瞬间的，用户几乎感觉不到。总之用户是很敏感的，他们能感觉到你对他们的体贴，虽然不太可能立竿见影的效果，但会在用户的心中一点一滴的积累他们对网站的依赖。<BR>　　<B>3、更好的用户体验；</B><BR>　　<B>4、也可以把以前的一些服务器负担的工作转嫁到客户端，利于客户端闲置的处理能力来处理，减轻服务器和带宽的负担，节约空间和带宽租用成本；</B><BR>　　<B>5、Ajax由于可以调用外部数据；</B><BR>　　<B>6、基于标准化的并被广泛支持和技术，并且不需要插件或下载小程序；</B><BR>　　<B>7、Ajax使WEB中的界面与应用分离（也可以说是数据与呈现分离）；</B><BR>　　<B>8、对于用户和ISP来说是双盈的。</B><BR></DIV>
<DIV class=headline>六、Ajax的问题</DIV>
<DIV class=content>　　1、一些手持设备（如手机、PDA等）现在还不能很好的支持Ajax；<BR>　　2、用JavaScript作的Ajax引擎，JavaScript的兼容性和DeBug都是让人头痛的事；<BR>　　3、Ajax的无刷新重载，由于页面的变化没有刷新重载那么明显，所以容易给用户带来困扰――用户不太清楚现在的数据是新的还是已经更新过的；现有的解决有：在相关位置提示、数据更新的区域设计得比较明显、数据更新后给用户提示等；<BR>　　4、对流媒体的支持没有FLASH、Java Applet好；<BR></DIV></DIV><img src ="http://www.cnitblog.com/piaoye12345/aggbug/4846.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/piaoye12345/" target="_blank">萌芽的叶子</a> 2005-11-23 16:40 <a href="http://www.cnitblog.com/piaoye12345/archive/2005/11/23/4846.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>当浏览器不支持XSL时用javascript</title><link>http://www.cnitblog.com/piaoye12345/archive/2005/11/22/4805.html</link><dc:creator>萌芽的叶子</dc:creator><author>萌芽的叶子</author><pubDate>Tue, 22 Nov 2005 06:55:00 GMT</pubDate><guid>http://www.cnitblog.com/piaoye12345/archive/2005/11/22/4805.html</guid><wfw:comment>http://www.cnitblog.com/piaoye12345/comments/4805.html</wfw:comment><comments>http://www.cnitblog.com/piaoye12345/archive/2005/11/22/4805.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/piaoye12345/comments/commentRss/4805.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/piaoye12345/services/trackbacks/4805.html</trackback:ping><description><![CDATA[客户端XSL <BR>　　如果浏览器支持XML,，就可以用XSL在浏览器中将文档转换成HTML。 <BR><BR>一个JavaScript的解决方法 <BR>　　在前文中，我们解释了如何用XSL将一个文档从XML转换成HTML。窍门就是向XML文件中增加一个XSL样式表，然后让浏览器来进行转换。即使这种方法能奏效，在XML文件中包含一个样式表引用也并非令人满意的方法，并且在不支持XSL的浏览器上这种方法还不能奏效。 <BR><BR>　　一个更通用的方法应该是用一个JavaScript来进行从XML到HTML的转换。使用一个JavaScript，就更有以下可能性： <BR><BR>　　允许JavaScript进行浏览器细节测试； <BR><BR>　　根据浏览器和用户需求使用不同的样式表。 <BR><BR>　　这就是XSL的美妙之处。XSL设计目的之一就是使数据从一个格式转换成另一个格式成为可能，从而支持不同的浏览器和不同的用户需求。 <BR><BR>　　客户端XSL转换将成为未来浏览器工作任务的一个主要部分，我们还将看到专业化浏览器市场的成长，比如Braille、 发声网络、网络打印机、手持PC、移动电话等。 <BR><BR>XML文件和XSL文件 <BR>　　现在重新来看看前面章节中的XML文档： <BR><BR>　　&lt;?xml version="1.0"?&gt; <BR><BR>　　&lt;CATALOG&gt; <BR><BR>　　 &lt;CD&gt; <BR><BR>　　　　&lt;TITLE&gt;Empire Burlesque&lt;/TITLE&gt; <BR><BR>　　　　&lt;ARTIST&gt;Bob Dylan&lt;/ARTIST&gt; <BR><BR>　　　　&lt;COUNTRY&gt;USA&lt;/COUNTRY&gt; <BR><BR>　　　　&lt;COMPANY&gt;Columbia&lt;/COMPANY&gt; <BR><BR>　　　　&lt;PRICE&gt;10.90&lt;/PRICE&gt; <BR><BR>　　　　&lt;YEAR&gt;1985&lt;/YEAR&gt; <BR><BR>　　 &lt;/CD&gt; <BR><BR>　　. <BR><BR>　　. <BR><BR>　　. <BR><BR>　　还有附带的XSL样式表： <BR><BR>　　&lt;?xml version='1.0'?&gt; <BR><BR>　　&lt;xsl:stylesheet xmlns:xsl="http://www.w3.org/TR/WD-xsl"&gt; <BR><BR>　　&lt;xsl:template match="/"&gt; <BR><BR>　　 &lt;html&gt; <BR><BR>　　 &lt;body&gt; <BR><BR>　　　　&lt;table border="2" bgcolor="yellow"&gt; <BR><BR>　　　　 &lt;tr&gt; <BR><BR>　　　　　　&lt;th&gt;Title&lt;/th&gt; <BR><BR>　　　　　　&lt;th&gt;Artist&lt;/th&gt; <BR><BR>　　　　 &lt;/tr&gt; <BR><BR>　　　　 &lt;xsl:for-each select="CATALOG/CD"&gt; <BR><BR>　　　　 &lt;tr&gt; <BR><BR>　　　　　　&lt;td&gt;&lt;xsl:value-of select="TITLE"/&gt;&lt;/td&gt; <BR><BR>　　　　　　&lt;td&gt;&lt;xsl:value-of select="ARTIST"/&gt;&lt;/td&gt; <BR><BR>　　　　 &lt;/tr&gt; <BR><BR>　　　　 &lt;/xsl:for-each&gt; <BR><BR>　　　　&lt;/table&gt; <BR><BR>　　 &lt;/body&gt; <BR><BR>　　 &lt;/html&gt; <BR><BR>　　&lt;/xsl:template&gt; <BR><BR>　　&lt;/xsl:stylesheet&gt; <BR><BR>　　要确保XML文件没有对XSL文件的引用，XSL文件也没有对XML文件的引用。注意：上面的句子说明一个XML文件可以用许多不同的XSL文件进行转换。 <BR><BR>在浏览器中将XML转换到HTML <BR>　　以下是在客户机上将XML文件转换成HTML所需要的源代码，很简单： <BR><BR>　　&lt;html&gt; <BR><BR>　　&lt;body&gt; <BR><BR>　　&lt;script language="javascript"&gt; <BR><BR>　　// Load XML <BR><BR>　　var xml = new ActiveXObject("Microsoft.XMLDOM") <BR><BR>　　xml.async = false <BR><BR>　　xml.load("cd_catalog.xml") <BR><BR>　　// Load the XSL <BR><BR>　　var xsl = new ActiveXObject("Microsoft.XMLDOM") <BR><BR>　　xsl.async = false <BR><BR>　　xsl.load("cd_catalog.xsl") <BR><BR>　　// Transform <BR><BR>　　document.write(xml.transformNode(xsl)) <BR><BR>　　&lt;/script&gt; <BR><BR>　　&lt;/body&gt; <BR><BR>　　&lt;/html&gt; <BR><BR>如果使用的是Internet Explorer 5.0 或更高版本，请点击这里查看结果。 <BR>　　代码的第一块创建了Microsoft XML 解析器(XMLDOM)的一个例示，并将XML文档加载到内存中。代码的第二块创建解析器的另一个例示，并将XSL文档加载到内存中。代码的最后一行用XSL文档转换XML文档，将结果写入HTML 文档中。 <BR><BR>服务器端XSL <BR>　　由于不是所有的浏览器都支持XML和XSL，因此就有了一个在服务器上将XML转换成HTML的方法。 <BR><BR>一个跨浏览器的解决方法 <BR>　　在前面的章节中，我们解释了如何用XSL在浏览器中将XML文档转换成HTML，窍门就是让JavaScript使用一个XML解析器来进行转换。但是当浏览器不支持XML解析器时，这种方法是不奏效的。要使XML数据对所有浏览器都可用，我们就必须在服务器上转换XML文档，并将它作为纯HTML发送到浏览器。 <BR><BR>　　这是XSL的另一个美妙之处。XSL的设计目的之一是使得在服务器上将数据从一种格式转换成另一种格式成为可能，并将可读数据返回到所有未来的浏览器中。 <BR><BR>　　在服务器上进行XSL转换正在成为未来Internet信息服务器工作任务的一个主要部分，同时我们将看到专用浏览器市场的发展，如：Braille、有声网络、网络打印机、手持PC、移动电话等。 <BR><BR>XML文件和XSL文件 <BR>　　现在来重新看看前面章节中的XML文档： <BR><BR>　　&lt;?xml version="1.0"?&gt; <BR><BR>　　&lt;CATALOG&gt; <BR><BR>　　 &lt;CD&gt; <BR><BR>　　　　&lt;TITLE&gt;Empire Burlesque&lt;/TITLE&gt; <BR><BR>　　　　&lt;ARTIST&gt;Bob Dylan&lt;/ARTIST&gt; <BR><BR>　　　　&lt;COUNTRY&gt;USA&lt;/COUNTRY&gt; <BR><BR>　　　　&lt;COMPANY&gt;Columbia&lt;/COMPANY&gt; <BR><BR>　　　　&lt;PRICE&gt;10.90&lt;/PRICE&gt; <BR><BR>　　　　&lt;YEAR&gt;1985&lt;/YEAR&gt; <BR><BR>　　 &lt;/CD&gt; <BR><BR>　　. <BR><BR>　　. <BR><BR>　　. <BR><BR>如果使用的是Internet Explorer 5.0或更高版本，可以点击这里查看XML文件。 <BR>　　再看看伴随的XSL样式表： <BR><BR>　　&lt;?xml version='1.0'?&gt; <BR><BR>　　&lt;xsl:stylesheet xmlns:xsl="http://www.w3.org/TR/WD-xsl"&gt; <BR><BR>　　&lt;xsl:template match="/"&gt; <BR><BR>　　 &lt;html&gt; <BR><BR>　　 &lt;body&gt; <BR><BR>　　　　&lt;table border="2" bgcolor="yellow"&gt; <BR><BR>　　　　 &lt;tr&gt; <BR><BR>　　　　　　&lt;th&gt;Title&lt;/th&gt; <BR><BR>　　　　　　&lt;th&gt;Artist&lt;/th&gt; <BR><BR>　　　　 &lt;/tr&gt; <BR><BR>　　　　 &lt;xsl:for-each select="CATALOG/CD"&gt; <BR><BR>　　　　 &lt;tr&gt; <BR><BR>　　　　　　&lt;td&gt;&lt;xsl:value-of select="TITLE"/&gt;&lt;/td&gt; <BR><BR>　　　　　　&lt;td&gt;&lt;xsl:value-of select="ARTIST"/&gt;&lt;/td&gt; <BR><BR>　　　　 &lt;/tr&gt; <BR><BR>　　　　 &lt;/xsl:for-each&gt; <BR><BR>　　　　&lt;/table&gt; <BR><BR>　　 &lt;/body&gt; <BR><BR>　　 &lt;/html&gt; <BR><BR>　　&lt;/xsl:template&gt; <BR><BR>　　&lt;/xsl:stylesheet&gt; <BR><BR>如果使用的是Internet Explorer 5.0或更高版本，可以点击这里查看XSL文件。 <BR>　　以上XSL文档的语法在前面章节中已经解释过了，因此这里不再做解释。但是要确保XML文件没有对XSL文件的引用，XSL文件也没有对XML文件的引用。同时请注意：上面的句子表明一个服务器上的XML文件可以用许多不同的XSL文件进行转换。 <BR><BR>在服务器端将XML转换成HTML <BR>　　以下是在服务器上转换XML文件所需要的简单源代码： <BR><BR>　　&lt;% <BR><BR>　　'Load the XML <BR><BR>　　set xml = Server.CreateObject("Microsoft.XMLDOM") <BR><BR>　　xml.async = false <BR><BR>　　xml.load(Server.MapPath("cd_catalog.xml")) <BR><BR>　　'Load the XSL <BR><BR>　　set xsl = Server.CreateObject("Microsoft.XMLDOM") <BR><img src ="http://www.cnitblog.com/piaoye12345/aggbug/4805.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/piaoye12345/" target="_blank">萌芽的叶子</a> 2005-11-22 14:55 <a href="http://www.cnitblog.com/piaoye12345/archive/2005/11/22/4805.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>用XML数据岛创建上下文菜单</title><link>http://www.cnitblog.com/piaoye12345/archive/2005/11/21/4770.html</link><dc:creator>萌芽的叶子</dc:creator><author>萌芽的叶子</author><pubDate>Mon, 21 Nov 2005 08:10:00 GMT</pubDate><guid>http://www.cnitblog.com/piaoye12345/archive/2005/11/21/4770.html</guid><wfw:comment>http://www.cnitblog.com/piaoye12345/comments/4770.html</wfw:comment><comments>http://www.cnitblog.com/piaoye12345/archive/2005/11/21/4770.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/piaoye12345/comments/commentRss/4770.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/piaoye12345/services/trackbacks/4770.html</trackback:ping><description><![CDATA[上下文菜单就是用户在页面上单击右键时所显示的一组命令。微软的MSDN有一个简单的例子说明了怎样建立自定义菜单。这里，我们将通过XML的数据岛来快速创建自定义的上下文菜单。XML数据岛就是存在于HTML文档中的XML数据的一部分。通过XML文档对象模型[XML document object model (DOM)]，我们可以轻松地参考和引用XML里的内容。我们这里利用XML数据岛来存储上下文菜单的多个定义，其中的每一个定义都可以和文档中的任一元素相联系。在没有定义的地方，将显示默认的菜单。 <BR>Internet Explorer 5.0首次提出对上下文菜单和数据岛的支持，我们的例子在除Internet Explorer 5.0及以上的浏览器里将自动被忽略。因此，如果你使用的浏览器不是Internet Explorer 5.0及以上的版本，你将看不到任何效果，只能看到浏览器的默认菜单。如果你使用的是Internet Explorer 5.0及以上的浏览器，你可以在页面上点击鼠标右键来看效果。注意：点击图象和文字将显示不同的菜单。下面我们进行分析： <BR><BR>第一步：定义菜单 <BR><BR>定义菜单是在文档XML数据岛里的进行的，你只需简单地在HTML文档的HEAD部分包含XML文件即可。例如：可以定义如下： <BR><BR>&lt;xml id="contextDef"&gt; <BR>&lt;xmldata&gt; <BR>&lt;contextmenu id="demo"&gt; <BR>&lt;item id="viewsource" value="查看源文件"/&gt; <BR>&lt;item id="back" value="返回上页"/&gt; <BR>&lt;/contextmenu&gt; <BR>&lt;contextmenu id="demob"&gt; <BR>&lt;item id="menu1" value="菜单项１" /&gt; <BR>&lt;item id="menu2" value="菜单项２" /&gt; <BR>&lt;/contextmenu&gt; <BR>&lt;/xmldata&gt; <BR>&lt;/xml&gt; <BR><BR>在这里，带ID属性的&lt;xml&gt;根节点和&lt;xmldata&gt;节点是必须的[注意：在XML里大小写是敏感的]。一个contextmenu节点和它所包含的多个item节点定义了一个菜单。如果你要定义多个菜单，你只需定义多个contextmenu节点即可。contextmenu节点的id属性和页面中的相应元素相关联，item节点的id属性标明哪一个菜单项被我们选取。值得注意的是：在整个XML文档里，所有的ID属性不能重名。item节点的value值就是要在菜单里要显示的文字。 <BR><BR>第二步：和HTML里的元素相关联 <BR><BR>在上面的XML数据岛里，我们定义了两个菜单demo和demob，要想和HTML里的元素相关联，只需简单地把contextmenu的ID值和HTML元素的contextmenu属性相连接即可。 <BR>&lt;P contextmenu="demo"&gt;这个段落显示demo菜单的内容&lt;/P&gt; <BR>&lt;IMG SRC="usedemob.gif" contextmenu="demob"&gt; <BR><BR>第三步：编写点击菜单项的执行的操作 <BR><BR>当我们单击菜单的每一个选项时，函数fnFireContext就被调用，并把代表所选菜单的一个对象参数传过来。为了处理单击的事件，只需编写简单的switch语句，根据不同的ID值执行不同的操作。例如： <BR><BR>function fnFireContext(oItem) { <BR>switch (oItem.menuid) { <BR>case "viewsource": <BR>location.href = "view-source:" + location.href <BR>break; <BR>case "back": <BR>history.back() <BR>break; <BR>default: <BR>alert("您选的是:\n" + oItem.menuid + "\nText: " + <BR>oItem.innerText) <BR>} <BR>} <BR><BR>你可以根据自己的需要进行更改鼠标单击事件的操作。 <BR><BR>第四步：定义菜单外观 <BR><BR>定义外观只需使用样式单即可，下面我们给出完整的例子，你完全可以拷贝、粘贴来看到本例子的效果！！[注意：浏览器必需是IE5+]。 <BR><BR>&lt;html&gt; <BR>&lt;head&gt; <BR>&lt;meta http-equiv="Content-Type" content="text/html; charset=gb2312"&gt; <BR><BR>&lt;style&gt; <BR>.menu{ cursor: hand; <BR>display: none; <BR>position: absolute; <BR>top: 0; left: 0; <BR>overflow: hidden; <BR>background-color: "#CFCFCF"; <BR>border: "1 solid"; <BR>border-top-color: "#EFEFEF"; <BR>border-left-color: "#EFEFEF"; <BR>border-right-color: "#505050"; <BR>border-bottom-color: "#505050"; <BR>font: 10pt 宋体; <BR>margin:0pt;padding: 2pt <BR>} <BR><BR>.menu SPAN {width: 100%; cursor: hand; padding-left: 10pt} <BR>.menu SPAN.selected {background: navy; color:white; cursor: hand} <BR>&lt;/style&gt; <BR><BR>&lt;xml id="contextDef"&gt; <BR>&lt;xmldata&gt; <BR>&lt;contextmenu id="demo"&gt; <BR>&lt;item id="viewsource" value="查看源文件"/&gt; <BR>&lt;item id="back" value="后退……"/&gt; <BR>&lt;item id="meng" value="访问【孟宪会之精彩世界】"/&gt; <BR>&lt;item id="calculate" value="执行 JavaScript 代码"/&gt; <BR>&lt;/contextmenu&gt; <BR>&lt;contextmenu id="demob"&gt; <BR>&lt;item id="菜单项例子1" value="菜单项例子1" /&gt; <BR>&lt;item id="菜单项例子2" value="菜单项例子2" /&gt; <BR>&lt;/contextmenu&gt; <BR>&lt;/xmldata&gt; <BR>&lt;/xml&gt; <BR><BR>&lt;SCRIPT&gt; <BR><BR>// 定义全局变量 <BR>var bContextKey=false; <BR><BR>function fnGetContextID(el) { <BR>while (el!=null) { <BR>if (el.contextmenu) return el.contextmenu <BR>el = el.parentElement <BR>} <BR>return "" <BR>} <BR><BR>function fnDetermine(){ <BR>oWorkItem=event.srcElement; <BR><BR>//键盘上的菜单键被按下时。 <BR>if(bContextKey==true){ <BR><BR>//如果菜单的“状态”为“false” <BR>if(oContextMenu.getAttribute("status")=="false"){ <BR><BR>//捕获鼠标事件，以便和页面交互。 <BR>oContextMenu.setCapture(); <BR><BR>//根据鼠标位置，确定菜单位置。 <BR>oContextMenu.style.top=event.clientY + document.body.scrollTop + <BR>1; <BR>oContextMenu.style.left=event.clientX + document.body.scrollLeft + <BR>1; <BR>oContextMenu.innerHTML=""; <BR><BR>//设定菜单的“状态”为“true” <BR>var sContext = fnGetContextID(event.srcElement) <BR>if (sContext!="") { <BR>fnPopulate(sContext) <BR>oContextMenu.setAttribute("status","true"); <BR>event.returnValue=false; <BR>} <BR>else <BR>event.returnValue=true <BR>} <BR>} <BR>else{ <BR><BR>// 如果键盘菜单键没有按下，并且菜单的“状态”为“true”。 <BR>if(oContextMenu.getAttribute("status")=="true"){ <BR>if((oWorkItem.parentElement.id=="oContextMenu") &amp;&amp; <BR>(oWorkItem.getAttribute("component")=="menuitem")){ <BR>fnFireContext(oWorkItem) <BR>} <BR><BR>// 当鼠标离开菜单或单击菜单项后，重设菜单（隐藏） <BR><BR>oContextMenu.style.display="none"; <BR>oContextMenu.setAttribute("status","false"); <BR>oContextMenu.releaseCapture(); <BR>oContextMenu.innerHTML=""; <BR>event.returnValue=false; <BR>} <BR>} <BR>} <BR><BR><BR>function fnPopulate(sID) { <BR>var str="" <BR>var elMenuRoot = <BR>document.all.contextDef.XMLDocument.childNodes(0).selectSingle <BR>Node('contextmenu[@id="' + sID + '"]') <BR>if (elMenuRoot) { <BR>for(var i=0;i&lt;elMenuRoot.childNodes.length;i++) <BR>str+='&lt;span component="menuitem" menuid="' + <BR>elMenuRoot.childNodes[i].getAttribute("id") + <BR>'" id=oMenuItem' + i + '&gt;' + <BR>elMenuRoot.childNodes[i].getAttribute("value") + <BR>"&lt;/SPAN&gt;&lt;BR&gt;" <BR>oContextMenu.innerHTML=str; <BR>oContextMenu.style.display="block"; <BR>oContextMenu.style.pixelHeight = oContextMenu.scrollHeight <BR>} <BR>} <BR><BR>function fnChirpOn(){ <BR>if((event.clientX&gt;0) &amp;&amp;(event.clientY&gt;0) <BR>&amp;&amp;(event.clientX&lt;document.body.offsetWidth) <BR>&amp;&amp;(event.clientY&lt;document.body.offsetHeight)){ <BR>oWorkItem=event.srcElement; <BR>if(oWorkItem.getAttribute("component")=="menuitem"){ <BR>oWorkItem.className = "selected" <BR>} <BR>} <BR>} <BR>function fnChirpOff(){ <BR>if((event.clientX&gt;0) &amp;&amp; (event.clientY&gt;0) &amp;&amp; <BR>(event.clientX&lt;document.body.offsetWidth) &amp;&amp; <BR>(event.clientY&lt;document.body.offsetHeight)){ <BR>oWorkItem=event.srcElement; <BR>if(oWorkItem.getAttribute("component")=="menuitem"){ <BR>oWorkItem.className = "" <BR>} <BR>} <BR>} <BR><BR>function fnInit(){ <BR>if (oContextMenu) { <BR>oContextMenu.style.width=180; <BR>oContextMenu.style.height=document.body.offsetHeight/2; <BR>oContextMenu.style.zIndex=2; <BR><BR>//设置菜单样式 <BR>document.oncontextmenu=fnSuppress; <BR>} <BR>} <BR><BR>function fnInContext(el) { <BR>while (el!=null) { <BR>if (el.id=="oContextMenu") return true <BR>el = el.offsetParent <BR>} <BR>return false <BR>} <BR><BR>function fnSuppress(){ <BR>if (!(fnInContext(event.srcElement))) { <BR>oContextMenu.style.display="none"; <BR>oContextMenu.setAttribute("status","false"); <BR>oContextMenu.releaseCapture(); <BR>bContextKey=true; <BR>} <BR><BR>fnDetermine(); <BR>bContextKey=false; <BR>} <BR><BR>function javameng(){ <BR>window.open("http://lucky.myrice.com","_blank","width=400,height= <BR>400,top=20,left=20") <BR>} <BR><BR>function fnFireContext(oItem) { <BR><BR>// 自定义上下文菜单项的功能 <BR>switch (oItem.menuid) { <BR>case "viewsource": <BR>location.href = "view-source:" + location.href <BR>break; <BR>case "back": <BR>history.back() <BR>break; <BR>case "meng": <BR>location.href="http://lucky.myrice.com" <BR>break; <BR>case "calculate": <BR>javameng() <BR>break; <BR>default: <BR>alert("你点击的菜单项是:\n\n\n" + oItem.menuid +"啊！！！") <BR>} <BR>} <BR>&lt;/SCRIPT&gt; <BR><BR>&lt;BODY onload="fnInit()" onclick="fnDetermine()" bgcolor="#ccffcc"&gt; <BR>&lt;div status="false" onmouseover="fnChirpOn()" onmouseout="fnChirpOff()" id="oContextMenu" class="menu"&gt;&lt;/div&gt;这里放你任意的其他的东西！ ...&lt;br&gt;... 这里放你任意的其他的东西！ ...&lt;br&gt;... 这里放你任意的其他的东西！ ...&lt;br&gt;&lt;br&gt; <BR>&lt;P contextmenu="demo"&gt;这里是利用上下文菜单的里子！你把鼠标移动到这里，然后单击鼠标又键，可以看到菜单内容！&lt;br&gt;这里是利用上下文菜单的里子！你把鼠标移动到这里，然后单击鼠标又键，可以看到菜单内容！&lt;br&gt;这里是利用上下文菜单的里子！ <BR>你把鼠标移动到这里，然后单击鼠标又键，可以看到菜单内容！&lt;br&gt;这里是利用上下文菜单的里子！你把鼠标移动到这里，然后单击鼠标又键，可以看到菜单内容！&lt;br&gt;这里是利用上下文菜单的里子！你把鼠标移动到这里，然后单击鼠标又键，可以看到菜 <BR>单内容！&lt;br&gt;&lt;/p&gt;&lt;p&gt;你也可以把鼠标放到下面的图象上面，点击又键！&lt;p&gt; <BR>&lt;center&gt;&lt;IMG SRC="http://lucky.myrice.com/javabk1.jpg"　 <BR>contextmenu="demob"&gt; <BR>&lt;/body&gt; <BR>&lt;/html&gt; <BR><BR>必须说明的是：你还可以自己定义菜单的无效[即变灰]的操作，也可以进一步定义更下一级的子菜单。 <BR><BR><img src ="http://www.cnitblog.com/piaoye12345/aggbug/4770.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/piaoye12345/" target="_blank">萌芽的叶子</a> 2005-11-21 16:10 <a href="http://www.cnitblog.com/piaoye12345/archive/2005/11/21/4770.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>向你的XML增加一个导航脚本</title><link>http://www.cnitblog.com/piaoye12345/archive/2005/11/21/4762.html</link><dc:creator>萌芽的叶子</dc:creator><author>萌芽的叶子</author><pubDate>Mon, 21 Nov 2005 05:55:00 GMT</pubDate><guid>http://www.cnitblog.com/piaoye12345/archive/2005/11/21/4762.html</guid><wfw:comment>http://www.cnitblog.com/piaoye12345/comments/4762.html</wfw:comment><comments>http://www.cnitblog.com/piaoye12345/archive/2005/11/21/4762.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cnitblog.com/piaoye12345/comments/commentRss/4762.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/piaoye12345/services/trackbacks/4762.html</trackback:ping><description><![CDATA[导航必须由一个脚本来实现。要向XML数据岛中增加导航，创建一个脚本，调用数据岛的movenext() 和 moveprevious()方法。 <BR><BR>　　 &lt; script language="JavaScript"&gt; <BR>　　 function movenext() <BR>　　 { <BR>　　 x=xmldso.recordset <BR>　　 if (x.absoluteposition &lt; x.recordcount) <BR>　　 { <BR>　　 x.movenext() <BR>　　 } <BR>　　 } <BR>　　 function moveprevious() <BR>　　 { <BR>　　 x=xmldso.recordset <BR>　　 if (x.absoluteposition &gt; 1) <BR>　　 { <BR>　　 x.moveprevious() <BR>　　 } <BR>　　 } <BR>　　 &lt; /script&gt; <BR><BR>　　 如果你有Internet Explorer 5.0或更高版本，点击这里可以看到如何在XML记录中航行。 <BR><BR>合并起来 <BR><BR>　　 用一点点创造力你就能创建一个完整的应用程序。 如果你使用在这一页中所学到的东西和一点点想象力，你就可以轻易地将这个发展成一个完整的应用程序。如果你运行的是Internet Explorer 5.0 或更高版本，点击这里可以看到如何为这个应用程序增加一些色彩。 <BR><BR>　　 XML的 HTTP请求 <BR><BR>　　 可以用一个HTTP请求从服务器请求XML数据。 <BR><BR>　　 浏览器请求 <BR><BR>　　 从浏览器进行一个HTTP请求，可以从服务器请求XML： <BR><BR>　　 var objHTTP = new ActiveXObject("Microsoft.XMLHTTP") <BR>　　 objHTTP.Open('GET','httprequest.asp',false) <BR>　　 objHTTP.Send() <BR><BR>　　 要查看这个请求的结果，你可以在浏览器中显示： <BR>　　 document.all['A1'].innerText= objHTTP.status <BR>　　 document.all['A2'].innerText= objHTTP.statusText <BR>　　 document.all['A3'].innerText= objHTTP.responseText <BR><BR>用JavaScript来自己试试看 <BR>用VBScript来自己试试看 <BR><BR>　　 与服务器通讯 <BR><BR>　　 你可以用HTTP 请求与服务器进行“通讯”：用XML与服务器通讯。在这个例子中，用这个ASP代码在服务器上“伪造”响应： <BR><BR>　　 &lt; % <BR>　　 Response.ContentType="text/xml" <BR>　　 txt="&lt; answer&gt;&lt; text&gt;12 Years&lt; /text&gt;&lt; /answer&gt;" <BR>　　 response.write(txt) <BR>　　 %&gt; <BR><BR>　　 所以，不管问了什么问题，答案都是12年。在实际中，你可以写一些代码来分析问题并作出正确的回答。 <BR><img src ="http://www.cnitblog.com/piaoye12345/aggbug/4762.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/piaoye12345/" target="_blank">萌芽的叶子</a> 2005-11-21 13:55 <a href="http://www.cnitblog.com/piaoye12345/archive/2005/11/21/4762.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Xml 的几种调用方法</title><link>http://www.cnitblog.com/piaoye12345/archive/2005/11/21/4761.html</link><dc:creator>萌芽的叶子</dc:creator><author>萌芽的叶子</author><pubDate>Mon, 21 Nov 2005 05:26:00 GMT</pubDate><guid>http://www.cnitblog.com/piaoye12345/archive/2005/11/21/4761.html</guid><wfw:comment>http://www.cnitblog.com/piaoye12345/comments/4761.html</wfw:comment><comments>http://www.cnitblog.com/piaoye12345/archive/2005/11/21/4761.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/piaoye12345/comments/commentRss/4761.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/piaoye12345/services/trackbacks/4761.html</trackback:ping><description><![CDATA[用ASP生成XML <BR><BR><BR><BR>　　 XML可以在没有安装任何XML软件的服务器上生成。要从你的服务器上生成一个XML响应 - 只需要写出以下代码，并将它作为一个ASP文件保存在你的web服务器上： <BR><BR><BR><BR>　　 &lt; % <BR>　　 Response.ContentType="text/xml" <BR><BR><BR>　　 Response.Write("&lt; ?xml version='1.0' ?&gt;") <BR>　　 Response.Write("&lt; note&gt;") <BR>　　 Response.Write("&lt; from&gt;Jani&lt; /from&gt;") <BR>　　 Response.Write("&lt; to&gt;Tove&lt; /to&gt;") <BR>　　 Response.Write("&lt; message&gt;Remember me this weekend&lt; /message&gt;") <BR>　　 Response.Write("&lt; /note&gt;") <BR>　　 %&gt; <BR><BR>　　 注意：响应的内容类型必须设置为XML。点击这里可看到如何从服务器返回ASP文件。(ASP代表活动的服务器页面。如果你不知道如何写ASP，可以在W3Schools' ASP School上学习) <BR><BR><BR><BR>　　 从一个数据库获得XML <BR><BR><BR><BR>　　 XML可以从没有安装任何XML软件的数据库中生成。前面的例子中的XML响应可以很容易地修改成从一个数据库中获取它的数据。要从数据库中生成一个XML数据库响应，只需要写出以下代码并将其保存为一个ASP 文件： <BR><BR><BR><BR>　　 &lt; % <BR>　　 Response.ContentType = "text/xml" <BR><BR><BR>　　 set conn=Server.CreateObject("ADODB.Connection") <BR>　　 conn.provider="Microsoft.Jet.OLEDB.4.0;" <BR>　　 conn.open server.mappath("../ado/database.mdb") <BR>　　 sql="select fname, lname from tblGuestBook" <BR>　　 set rs = Conn.Execute(sql) <BR>　　 rs.MoveFirst() <BR><BR><BR>　　 response.write("&lt; ?xml version='1.0' ?&gt;") <BR>　　 response.write("&lt; guestbook&gt;") <BR>　　 while (not rs.EOF) <BR>　　 response.write("&lt; guest&gt;") <BR>　　 response.write("&lt; fname&gt;" &amp; rs("fname") &amp; "&lt; /fname&gt;") <BR>　　 response.write("&lt; lname&gt;" &amp; rs("lname") &amp; "&lt; /lname&gt;") <BR>　　 response.write("&lt; /guest&gt;") <BR>　　 rs.MoveNext() <BR>　　 wend <BR>　　 rs.close() <BR>　　 conn.close() <BR><BR><BR>　　 response.write("&lt; /guestbook&gt;") <BR>　　 %&gt; <BR><BR>　　 你可以自己试试看这个页面的实际数据库输出。上面的例子使用了带有ADO的ASP。如果你不知道如何使用ADO, 你可以在W3Schools' ADO School中学习。 <BR><BR><img src ="http://www.cnitblog.com/piaoye12345/aggbug/4761.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/piaoye12345/" target="_blank">萌芽的叶子</a> 2005-11-21 13:26 <a href="http://www.cnitblog.com/piaoye12345/archive/2005/11/21/4761.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>XML属性</title><link>http://www.cnitblog.com/piaoye12345/archive/2005/11/14/4467.html</link><dc:creator>萌芽的叶子</dc:creator><author>萌芽的叶子</author><pubDate>Mon, 14 Nov 2005 09:05:00 GMT</pubDate><guid>http://www.cnitblog.com/piaoye12345/archive/2005/11/14/4467.html</guid><wfw:comment>http://www.cnitblog.com/piaoye12345/comments/4467.html</wfw:comment><comments>http://www.cnitblog.com/piaoye12345/archive/2005/11/14/4467.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/piaoye12345/comments/commentRss/4467.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/piaoye12345/services/trackbacks/4467.html</trackback:ping><description><![CDATA[<H2>XML属性</H2>
<P><B>XML元素可以拥有属性。</B></P>
<P>你一定还记得这样的HTML代码吧: &lt;IMG SRC="computer.gif"&gt;。src是img元素的属性，提供了关于img元素的额外信息。</P>
<P>在HTML中 (在XML中也一样)元素的属性提供了元素的额外信息。</P>
<TABLE class=ex cellSpacing=0 width="100%" border=1>
<TBODY>
<TR>
<TD><PRE>&lt;img src="computer.gif"&gt;
&lt;a href="demo.asp"&gt;</PRE></TD></TR></TBODY></TABLE>
<P>书信提供的信息通常不是数据的一部分。在下面的例子中，类型和数据毫不相关，但对于操作这个元素的软件来说却相当重要。</P>
<TABLE class=ex cellSpacing=0 width="100%" border=1>
<TBODY>
<TR>
<TD><PRE>&lt;file type="gif"&gt;computer.gif&lt;/file&gt;</PRE></TD></TR></TBODY></TABLE><BR>
<HR>

<H2>引用风格"female" 还是 'female'?</H2>
<P>属性值必须用引号引着。单引号、双引号都可以使用。例如一个人的性别，person元素可以这样写：</P>
<TABLE class=ex cellSpacing=0 width="100%" border=1>
<TBODY>
<TR>
<TD><PRE>&lt;person sex="female"&gt;</PRE></TD></TR></TBODY></TABLE>
<P>也可以这样写: </P>
<TABLE class=ex cellSpacing=0 width="100%" border=1>
<TBODY>
<TR>
<TD><PRE>&lt;person sex='female'&gt;</PRE></TD></TR></TBODY></TABLE>
<P>上面的两种写法在一般情况下是没有区别的，使用双引号的应用更普遍一些。但是在某些特殊的情况下就必须使用单引号，比如下面的例子：</P>
<TABLE class=ex cellSpacing=0 width="100%" border=1>
<TBODY>
<TR>
<TD><PRE>&lt;gangster name='George "Shotgun" Ziegler'&gt;</PRE></TD></TR></TBODY></TABLE>&nbsp; 
<HR>

<H2>使用子元素还是使用属性</H2>
<P><B>数据既可以存储在子元素中也可以存储在属性中。</B></P>
<P>请看下面的例子:</P>
<TABLE class=ex cellSpacing=0 width="100%" border=1>
<TBODY>
<TR>
<TD><PRE>&lt;person sex="female"&gt;
&lt;firstname&gt;Anna&lt;/firstname&gt;
&lt;lastname&gt;Smith&lt;/lastname&gt;
&lt;/person&gt;</PRE></TD></TR></TBODY></TABLE><BR>
<TABLE class=ex cellSpacing=0 width="100%" border=1>
<TBODY>
<TR>
<TD><PRE>&lt;person&gt;
&lt;sex&gt;female&lt;/sex&gt;
&lt;firstname&gt;Anna&lt;/firstname&gt;
&lt;lastname&gt;Smith&lt;/lastname&gt;
&lt;/person&gt;</PRE></TD></TR></TBODY></TABLE>
<P>在第一个例子中，sex是一个属性，在第二个例子中，sex则是一个子元素。这两个例子都提供了相同的信息。</P>
<P>什么时候用属性，什么时候用子元素没有一个现成的规则可以遵循。我的经验是属性在HTML中可能相当便利，但在XML中，你最好避免使用。</P>
<HR>

<H2>我喜欢的风格</H2>
<P><B>我更愿意把数据存储到子元素中。</B></P>
<P>下面的三个XML文档包含了相同的信息：</P>
<P>第一个例子使用了data属性：</P>
<TABLE class=ex cellSpacing=0 width="100%" border=1>
<TBODY>
<TR>
<TD><PRE>&lt;note date="12/11/99"&gt;
&lt;to&gt;Tove&lt;/to&gt;
&lt;from&gt;Jani&lt;/from&gt;
&lt;heading&gt;Reminder&lt;/heading&gt;
&lt;body&gt;Don't forget me this weekend!&lt;/body&gt;
&lt;/note&gt;</PRE></TD></TR></TBODY></TABLE>
<P>第二个例子使用了data元素:</P>
<TABLE class=ex cellSpacing=0 width="100%" border=1>
<TBODY>
<TR>
<TD><PRE>&lt;note&gt;
&lt;date&gt;12/11/99&lt;/date&gt;
&lt;to&gt;Tove&lt;/to&gt;
&lt;from&gt;Jani&lt;/from&gt;
&lt;heading&gt;Reminder&lt;/heading&gt;
&lt;body&gt;Don't forget me this weekend!&lt;/body&gt;
&lt;/note&gt;</PRE></TD></TR></TBODY></TABLE>
<P>第三个例子使用了扩展的data元素: (这就是我推荐的样式):</P>
<TABLE class=ex cellSpacing=0 width="100%" border=1>
<TBODY>
<TR>
<TD><PRE>&lt;note&gt;
&lt;date&gt;
&lt;day&gt;12&lt;/day&gt;
&lt;month&gt;11&lt;/month&gt;
&lt;year&gt;99&lt;/year&gt;
&lt;/date&gt;
&lt;to&gt;Tove&lt;/to&gt;
&lt;from&gt;Jani&lt;/from&gt;
&lt;heading&gt;Reminder&lt;/heading&gt;
&lt;body&gt;Don't forget me this weekend!&lt;/body&gt;
&lt;/note&gt; </PRE></TD></TR></TBODY></TABLE><BR>
<HR>

<H2>避免使用属性？</H2>
<P><B>应该避免使用属性么？</B></P>
<P>这里有一些使用属性引发的问题： </P>
<UL>
<LI>属性不能包含多个值（子元素可以）。 
<LI>属性不容易扩展。 
<LI>属性不能够描述结构（子元素可以）。 
<LI>属性很难被程序代码处理。 
<LI>属性值很难通过DTD进行测试。 </LI></UL>
<P>如果使用属性来存储数据，那么所编写的XML文档一定很难阅读和操作。尽量使用元素来描述数据，仅使用属性来描述那些与数据关系不大的额外信息。</P>
<P>不要象下面的例子那样（如果你那么做了说明你还没有明白上面的观点）。</P>
<TABLE class=ex cellSpacing=0 width="100%" border=1>
<TBODY>
<TR>
<TD><PRE>&lt;note day="12" month="11" year="99"
to="Tove" from="Jani" heading="Reminder" 
body="Don't forget me this weekend!"&gt;
&lt;/note&gt; </PRE></TD></TR></TBODY></TABLE><BR>
<HR>

<H2>属性规则的例外</H2>
<P><B>规则总是有例外的。</B></P>
<P>我的关于属性的规则也有一个例外：</P>
<P>有些时候应该为一个元素设计一个ID引用，通过这个ID可以引用存取特定的XML元素，就象HTML中的name和id属性一样。请看下面的例子：</P>
<TABLE class=ex cellSpacing=0 width="100%" border=1>
<TBODY>
<TR>
<TD><PRE>&lt;messages&gt;
&lt;note ID="501"&gt;
&lt;to&gt;Tove&lt;/to&gt;
&lt;from&gt;Jani&lt;/from&gt;
&lt;heading&gt;Reminder&lt;/heading&gt;
&lt;body&gt;Don't forget me this weekend!&lt;/body&gt;
&lt;/note&gt;
&lt;note ID="502"&gt;
&lt;to&gt;Jani&lt;/to&gt;
&lt;from&gt;Tove&lt;/from&gt;
&lt;heading&gt;Re: Reminder&lt;/heading&gt;
&lt;body&gt;I will not!&lt;/body&gt;
&lt;/note&gt; 
&lt;/messages&gt;</PRE></TD></TR></TBODY></TABLE>
<P>在上面的例子中，ID属性就相当于一个计数器，或者是一个唯一的标识符，在XML文档中标识不同的便条信息，他不是便条信息的一部分。</P>
<P>我们所要尽力向读者说明的是：元数据（与数据有关的数据）应该以属性的方式存储，而数据本身应该以元素的形式存储。</P><img src ="http://www.cnitblog.com/piaoye12345/aggbug/4467.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/piaoye12345/" target="_blank">萌芽的叶子</a> 2005-11-14 17:05 <a href="http://www.cnitblog.com/piaoye12345/archive/2005/11/14/4467.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>