<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>我想网 &#187; Ajax</title>
	<atom:link href="http://www.iwanna.cn/topics/ui/javascript/ajax/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.iwanna.cn</link>
	<description></description>
	<lastBuildDate>Mon, 26 Dec 2011 05:46:16 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.1</generator>
		<item>
		<title>跨域资源共享的10种方式</title>
		<link>http://www.iwanna.cn/archives/2011/02/07/6315/</link>
		<comments>http://www.iwanna.cn/archives/2011/02/07/6315/#comments</comments>
		<pubDate>Mon, 07 Feb 2011 14:18:08 +0000</pubDate>
		<dc:creator>seasun</dc:creator>
				<category><![CDATA[Ajax]]></category>
		<category><![CDATA[JavaScript]]></category>

		<guid isPermaLink="false">http://www.iwanna.cn/?p=6315</guid>
		<description><![CDATA[在客户端编程语言中，如javascript和ActionScript，同源策略是一个很重要的安全理念，它在保证数据的安全性方面有着重要的意义。同源策略规定跨域之间的脚本是隔离的，一个域的脚本不能访问和操作另外一个域的绝大部分属性和方法。那么什么叫相同域，什么叫不同的域呢？ 同源策略 在客户端编程语言中，如javascript和 ActionScript，同源策略是一个很重要的安全理念，它在保证数据的安全性方面有着重要的意义。同源策略规定跨域之间的脚本是隔离的，一个域的脚 本不能访问和操作另外一个域的绝大部分属性和方法。那么什么叫相同域，什么叫不同的域呢？当两个域具有相同的协议(如http), 相同的端口(如80)，相同的host（如www.example.org)，那么我们就可以认为它们是相同的域。比如 http://www.example.org/index.html和http://www.example.org/sub/index.html是同域，而http://www.example.org, https://www.example.org, http://www.example.org:8080, http://sub.example.org中的任何两个都将构成跨域。同源策略还应该对一些特殊情况做处理，比如限制file协议下脚本的访问权限。 本地的HTML文件在浏览器中是通过file协议打开的，如果脚本能通过file协议访问到硬盘上其它任意文件，就会出现安全隐患，目前IE8还有这样的 隐患。 受到同源策略的影响，跨域资源共享就会受到制约。但是随着人们的实践和浏览器的进步，目前在跨域请求的技巧上，有很多宝贵经验的沉淀和积累。这里我把跨域资源共享分成两种，一种是单向的数据请求，还有一种是双向的消息通信。接下来我将罗列出常见的一些跨域方式，以下跨域实例的源代码可以从这里获得。 单向跨域 JSONP JSONP (JSON with Padding)是一个简单高效的跨域方式，HTML中的script标签可以加载并执行其他域的javascript，于是我们可以通过script标记来动态加载其他域的资源。 例如我要从域A的页面pageA加载域B的数据，那么在域B的页面pageB中我以JavaScript的形式声明pageA需要的数据，然后在 pageA中用script标签把pageB加载进来，那么pageB中的脚本就会得以执行。JSONP在此基础上加入了回调函数，pageB加载完之后 会执行pageA中定义的函数，所需要的数据会以参数的形式传递给该函数。JSONP易于实现，但是也会存在一些安全隐患，如果第三方的脚本随意地执行， 那么它就可以篡改页面内容，截获敏感数据。但是在受信任的双方传递数据，JSONP是非常合适的选择。 flash URLLoader flash有自己的一套安全策略，服务器可以通过crossdomain.xml文件来声明能被哪些域的SWF文件访问，SWF也可以通过API来确定自身能被哪些域的SWF加载。当跨域访问资源时，例如从域www.a.com请求域www.b.com上的数据，我们可以借助flash来 发送HTTP请求。首先，修改域www.b.com上的crossdomain.xml(一般存放在根目录，如果没有需要手动创建) ，把www.a.com加入到白名单。其次，通过Flash URLLoader发送HTTP请求，最后，通过Flash API把响应结果传递给JavaScript。Flash URLLoader是一种很普遍的跨域解决方案，不过需要支持iOS的话，这个方案就无能为力了。 Access Control Access Control是比较超越的跨域方式，目前只在很少的浏览器中得以支持，这些浏览器可以发送一个跨域的HTTP请求（Firefox, Google Chrome等通过XMLHTTPRequest实现，IE8下通过XDomainRequest实现），请求的响应必须包含一个Access- Control-Allow-Origin的HTTP响应头，该响应头声明了请求域的可访问权限。例如www.a.com对www.b.com下的 asset.php发送了一个跨域的HTTP请求，那么asset.php必须加入如下的响应头： header("Access-Control-Allow-Origin: http://www.a.com"); window.name window 对象的name属性是一个很特别的属性，当该window的location变化，然后重新加载，它的name属性可以依然保持不变。那么我们可以在页面 A中用iframe加载其他域的页面B，而页面B中用JavaScript把需要传递的数据赋值给window.name，iframe加载完成之后，页 面A修改iframe的地址，将其变成同域的一个地址，然后就可以读出window.name的值了。这个方式非常适合单向的数据请求，而且协议简单、安 全。不会像JSONP那样不做限制地执行外部脚本。 server proxy 在数据提供方没有提供对JSONP协议或者 window.name协议的支持，也没有对其它域开放访问权限时，我们可以通过server proxy的方式来抓取数据。例如当www.a.com域下的页面需要请求www.b.com下的资源文件asset.txt时，直接发送一个指向 www.b.com/asset.txt的Ajax请求肯定是会被浏览器阻止。这时，我们在www.a.com下配一个代理，然后把Ajax请求绑定到这个代理路径下，例如www.a.com/proxy/, 然后这个代理发送HTTP请求访问www.b.com下的asset.txt，跨域的HTTP请求是在服务器端进行的，客户端并没有产生跨域的Ajax请求。这个跨域方式不需要和目标资源签订协议，带有侵略性，另外需要注意的是实践中应该对这个代理实施一定程度的保护，比如限制他人使用或者使用频率。 双向跨域 [...]]]></description>
			<content:encoded><![CDATA[<p>在客户端编程语言中，如javascript和ActionScript，同源策略是一个很重要的安全理念，它在保证数据的安全性方面有着重要的意义。同源策略规定跨域之间的脚本是隔离的，一个域的脚本不能访问和操作另外一个域的绝大部分属性和方法。那么什么叫相同域，什么叫不同的域呢？</p>
<h3>同源策略</h3>
<p>在客户端编程语言中，如javascript和 ActionScript，同源策略是一个很重要的安全理念，它在保证数据的安全性方面有着重要的意义。同源策略规定跨域之间的脚本是隔离的，一个域的脚 本不能访问和操作另外一个域的绝大部分属性和方法。那么什么叫相同域，什么叫不同的域呢？当两个域具有相同的协议(如http),   相同的端口(如80)，相同的host（如www.example.org)，那么我们就可以认为它们是相同的域。比如 http://www.example.org/index.html和http://www.example.org/sub/index.html是同域，而http://www.example.org,  https://www.example.org,  http://www.example.org:8080,   http://sub.example.org中的任何两个都将构成跨域。同源策略还应该对一些特殊情况做处理，比如限制file协议下脚本的访问权限。 本地的HTML文件在浏览器中是通过file协议打开的，如果脚本能通过file协议访问到硬盘上其它任意文件，就会出现安全隐患，目前IE8还有这样的 隐患。<br />
<span id="more-6315"></span><br />
受到同源策略的影响，跨域资源共享就会受到制约。但是随着人们的实践和浏览器的进步，目前在跨域请求的技巧上，有很多宝贵经验的沉淀和积累。这里我把跨域资源共享分成两种，一种是单向的数据请求，还有一种是双向的消息通信。接下来我将罗列出常见的一些跨域方式，以下跨域实例的源代码可以从<a href="http://github.com/colorhook/crossdomain" target="_blank">这里获得</a>。</p>
<h3>单向跨域</h3>
<h4>JSONP</h4>
<p>JSONP (<a href="http://www.iwanna.cn/tags/json/" class="st_tag internal_tag" rel="tag" title="标签 Json 下的日志">JSON</a> with  Padding)是一个简单高效的跨域方式，HTML中的script标签可以加载并执行其他域的javascript，于是我们可以通过script标记来动态加载其他域的资源。 例如我要从域A的页面pageA加载域B的数据，那么在域B的页面pageB中我以JavaScript的形式声明pageA需要的数据，然后在 pageA中用script标签把pageB加载进来，那么pageB中的脚本就会得以执行。JSONP在此基础上加入了回调函数，pageB加载完之后 会执行pageA中定义的函数，所需要的数据会以参数的形式传递给该函数。JSONP易于实现，但是也会存在一些安全隐患，如果第三方的脚本随意地执行， 那么它就可以篡改页面内容，截获敏感数据。但是在受信任的双方传递数据，JSONP是非常合适的选择。</p>
<h4><a href="http://www.iwanna.cn/tags/flash/" class="st_tag internal_tag" rel="tag" title="标签 Flash 下的日志">flash</a> URLLoader</h4>
<p>flash有自己的一套安全策略，服务器可以通过crossdomain.xml文件来声明能被哪些域的SWF文件访问，SWF也可以通过API来确定自身能被哪些域的SWF加载。当跨域访问资源时，例如从域www.a.com请求域www.b.com上的数据，我们可以借助flash来 发送HTTP请求。首先，修改域www.b.com上的crossdomain.xml(一般存放在根目录，如果没有需要手动创建)   ，把www.a.com加入到白名单。其次，通过Flash URLLoader发送HTTP请求，最后，通过Flash   API把响应结果传递给JavaScript。Flash  URLLoader是一种很普遍的跨域解决方案，不过需要支持iOS的话，这个方案就无能为力了。</p>
<h4>Access Control</h4>
<p>Access  Control是比较超越的跨域方式，目前只在很少的浏览器中得以支持，这些浏览器可以发送一个跨域的HTTP请求（Firefox, <a href="http://www.iwanna.cn/tags/google/" class="st_tag internal_tag" rel="tag" title="标签 Google 下的日志">Google</a>    Chrome等通过XMLHTTPRequest实现，IE8下通过XDomainRequest实现），请求的响应必须包含一个Access- Control-Allow-Origin的HTTP响应头，该响应头声明了请求域的可访问权限。例如www.a.com对www.b.com下的 asset.php发送了一个跨域的HTTP请求，那么asset.php必须加入如下的响应头：</p>
<div>
<div>
<pre>header("Access-Control-Allow-Origin: http://www.a.com");</pre>
</div>
</div>
<h4>window.name</h4>
<p>window 对象的name属性是一个很特别的属性，当该window的location变化，然后重新加载，它的name属性可以依然保持不变。那么我们可以在页面 A中用iframe加载其他域的页面B，而页面B中用JavaScript把需要传递的数据赋值给window.name，iframe加载完成之后，页 面A修改iframe的地址，将其变成同域的一个地址，然后就可以读出window.name的值了。这个方式非常适合单向的数据请求，而且协议简单、安 全。不会像JSONP那样不做限制地执行外部脚本。</p>
<h4>server proxy</h4>
<p>在数据提供方没有提供对JSONP协议或者 window.name协议的支持，也没有对其它域开放访问权限时，我们可以通过server   proxy的方式来抓取数据。例如当www.a.com域下的页面需要请求www.b.com下的资源文件asset.txt时，直接发送一个指向 www.b.com/asset.txt的Ajax请求肯定是会被浏览器阻止。这时，我们在www.a.com下配一个代理，然后把Ajax请求绑定到这个代理路径下，例如www.a.com/proxy/,  然后这个代理发送HTTP请求访问www.b.com下的asset.txt，跨域的HTTP请求是在服务器端进行的，客户端并没有产生跨域的Ajax请求。这个跨域方式不需要和目标资源签订协议，带有侵略性，另外需要注意的是实践中应该对这个代理实施一定程度的保护，比如限制他人使用或者使用频率。</p>
<h3>双向跨域</h3>
<h4>document.domain</h4>
<p>通 过修改document的domain属性，我们可以在域和子域或者不同的子域之间通信。同域策略认为域和子域隶属于不同的域，比如www.a.com和 sub.a.com是不同的域，这时，我们无法在www.a.com下的页面中调用sub.a.com中定义的JavaScript方法。但是当我们把它 们document的domain属性都修改为a.com，浏览器就会认为它们处于同一个域下，那么我们就可以互相调用对方的method来通信了。</p>
<h4>FIM – Fragment Identitier Messaging</h4>
<p>不 同的域之间，JavaScript只能做很有限的访问和操作，其实我们利用这些有限的访问权限就可以达到跨域通信的目的了。FIM (Fragment   Identitier   Messaging)就是在这个大前提下被发明的。父窗口可以对iframe进行URL读写，iframe也可以读写父窗口的URL，URL有一部分被称 为frag，就是#号及其后面的字符，它一般用于浏览器锚点定位，Server端并不关心这部分，应该说HTTP请求过程中不会携带frag，所以这部分 的修改不会产生HTTP请求，但是会产生浏览器历史记录。FIM的原理就是改变URL的frag部分来进行双向通信。每个window通过改变其他 window的location来发送消息，并通过监听自己的URL的变化来接收消息。这个方式的通信会造成一些不必要的浏览器历史记录，而且有些浏览器 不支持onhashchange事件，需要轮询来获知URL的改变，最后，URL在浏览器下有长度限制，这个制约了每次传送的数据量。</p>
<h4>Flash LocalConnection</h4>
<p>页 面上的双向通信也可以通过Flash来解决，Flash   API中有LocalConnection这个类，该类允许两个SWF之间通过进程通信，这时SWF可以播放在独立的Flash   Player或者AIR中，也可以嵌在HTML页面或者是PDF中。遵循这个通信原则，我们可以在不同域的HTML页面各自嵌套一个SWF来达到相互传递 数据的目的了。SWF通过LocalConnection交换数据是很快的，但是每次的数据量有40kb的大小限制。用这种方式来跨域通信过于复杂，而且 需要了2个SWF文件，实用性不强。</p>
<h4>window.postMessage</h4>
<p>window.postMessage是HTML5定义的一个<a href="http://dev.w3.org/html5/postmsg/" target="_blank">很新的方法</a>，这个方法可以很方便地跨window通信。由于它是一个很新的方法，所以在很旧和比较旧的浏览器中都无法使用。</p>
<h4>Cross Frame</h4>
<p>Cross    Frame是FIM的一个变种，它借助了一个空白的iframe，不会产生多余的浏览器历史记录，也不需要轮询URL的改变，在可用性和性能上都做了很大 的改观。它的基本原理大致是这样的，假设在域www.a.com上有页面A.html和一个空白代理页面proxyA.<a href="http://www.iwanna.cn/tags/html/" class="st_tag internal_tag" rel="tag" title="标签 HTML 下的日志">html</a>,   另一个域www.b.com上有个页面B.html和一个空白代理页面proxyB.<a href="http://www.iwanna.cn/tags/html/" class="st_tag internal_tag" rel="tag" title="标签 HTML 下的日志">html</a>，A.html需要向B.html中发送消息时，页面会创建 一个隐藏的iframe,  iframe的src指向proxyB.html并把message作为URL   frag，由于B.html和proxyB.html是同域，所以在iframe加载完成之后，B.html可以获得iframe的URL，然后解析出 message，并移除该iframe。当B.html需要向A.html发送消息时，原理一样。Cross   Frame是很好的双向通信方式，而且安全高效，但是它在Opera中无法使用，不过在Opera下面我们可以使用更简单的 window.postMessage来代替。</p>
<h3>总结</h3>
<p>跨域的方法很多，不同的应用场景我们都可以找到一个最合适的解决方 案。比如单向的数据请求，我们应该优先选择JSONP或者window.name，双向通信我们采取Cross Frame，在未与数据提供方没有达成通信协议的情况下我们也可以用server proxy的方式来抓取数据。</p>
<hr />
<p>© <a href="http://www.iwanna.cn">我想网</a> Akon 所有 , 2011. |
<a href="http://www.iwanna.cn/archives/2011/02/07/6315/">永久链接</a> |
<a href="http://www.iwanna.cn/archives/2011/02/07/6315/#comments">没有评论</a> |
提交到
<a rel="nofollow" target="_blank" href="http://www.google.com/reader/view/feed/http://www.iwanna.cn/archives/2011/02/07/6315/">Google Reader</a>
<a rel="nofollow" target="_blank" href="http://www.xianguo.com/subscribe.php?url=http://www.iwanna.cn/archives/2011/02/07/6315/">鲜果</a>
<a rel="nofollow" target="_blank" href="http://www.zhuaxia.com/add_channel.php?url=http://www.iwanna.cn/archives/2011/02/07/6315/">抓虾</a>
<hr />
<script type="text/javascript"><!--
google_ad_client = "pub-2057344547305288";
/* 336x280,iwanna feed,created 10/3/10 */
google_ad_slot = "9738886183";
google_ad_width = 336;
google_ad_height = 280;
//-->
</script>
<script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script>
<hr />
</p>
<p><small>Feed enhanced by <a href='http://planetozh.com/blog/my-projects/wordpress-plugin-better-feed-rss/'>Better Feed</a> from  <a href='http://planetozh.com/blog/'>Ozh</a></small></p>
]]></content:encoded>
			<wfw:commentRss>http://www.iwanna.cn/archives/2011/02/07/6315/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>HTML, JavaScript,CSS简述</title>
		<link>http://www.iwanna.cn/archives/2010/12/01/5981/</link>
		<comments>http://www.iwanna.cn/archives/2010/12/01/5981/#comments</comments>
		<pubDate>Wed, 01 Dec 2010 13:39:16 +0000</pubDate>
		<dc:creator>seasun</dc:creator>
				<category><![CDATA[Ajax]]></category>
		<category><![CDATA[CSS]]></category>
		<category><![CDATA[HTML]]></category>
		<category><![CDATA[JavaScript]]></category>

		<guid isPermaLink="false">http://www.iwanna.cn/?p=5981</guid>
		<description><![CDATA[HTML, JavaScript,CSS 等等，这可不是你妈口中的AJAX Web pages are written in HTML, the web programming language that tells browsers how to lay out and present content on a web page. In other words, HTML provides the basic building blocks for the web. For a long time, those building blocks were pretty simple and static: lines of text, links [...]]]></description>
			<content:encoded><![CDATA[<h3><a href="http://www.iwanna.cn/tags/html/" class="st_tag internal_tag" rel="tag" title="标签 HTML 下的日志">HTML</a>, <a href="http://www.iwanna.cn/tags/javascript/" class="st_tag internal_tag" rel="tag" title="标签 JavaScript 下的日志">JavaScript</a>,<a href="http://www.iwanna.cn/tags/css/" class="st_tag internal_tag" rel="tag" title="标签 CSS 下的日志">CSS</a> 等等，这可不是你妈口中的AJAX</h3>
<blockquote style="display:none;"><p><a href="http://www.iwanna.cn/tags/web/" class="st_tag internal_tag" rel="tag" title="标签 Web 下的日志">Web</a> pages  are written in HTML, the <a href="http://www.iwanna.cn/tags/web/" class="st_tag internal_tag" rel="tag" title="标签 Web 下的日志">web</a> programming language that tells browsers  how to lay out and present content on a <a href="http://www.iwanna.cn/tags/web/" class="st_tag internal_tag" rel="tag" title="标签 Web 下的日志">web</a> page. In other words, HTML  provides the basic building blocks for the <a href="http://www.iwanna.cn/tags/web/" class="st_tag internal_tag" rel="tag" title="标签 Web 下的日志">web</a>. For a long time, those  building blocks were pretty simple and static: lines of text, links and  images.</p></blockquote>
<p>众所周知，网页是用超文本标记语言（HTML）编写的，这种网页编程语言告诉浏览器怎样在网页中输出并 展现内容。换句话说，HTML就是网页这个建筑的一砖一瓦。长期以来，这些“砖瓦“都相当简单而且是静态的：仅有几行文字，或一些链接，或几张图片。</p>
<blockquote style="display:none;"><p>Today, the web goes beyond just text, links, and images. We  expect to be able to play online chess or seamlessly scroll around a  map of our neighborhood, without waiting for the entire page to reload  for every chess move or every map scroll.</p></blockquote>
<p>而今，网页中远不止文本，链接 和图片了。我们期望能够在线下象棋时，每走一步不必等待网页重新加载，或者查看一下我们周边的地图时，每拖到一下网页也不用重新刷新。</p>
<blockquote style="display:none;"><p>The  idea of such dynamic web pages began with the invention of the  scripting language JavaScript. JavaScript support in major web browsers  meant that web pages could incorporate more meaningful real- time  interactions. For example, if you’ve filled out an online form and hit  the “submit” button, the web page can use JavaScript to check your  entries in real-time and alert you almost instantly if you had filled  out the form wrongly.</p></blockquote>
<p>这些动态网页的创意开始与于脚本语言JavaScript的出现。主要的 网页浏览器都支持JavaScript，这就意味着网页能够加入一些更有意义的实时互动。例如，当你在线填一些表格时，点击“提交“按钮，网页可以调用 JavaScript代码来实时检查表格是否填错，如果有错误，网页马上就能提示你。<br />
<span id="more-5981"></span></p>
<blockquote style="display:none;"><p>But the  dynamic web as we know it today truly came to life when XHR (XML Http  Request) was introduced into JavaScript, and first used in web  applications like Microsoft Outlook for the Web, Gmail and <a href="http://www.iwanna.cn/tags/google/" class="st_tag internal_tag" rel="tag" title="标签 Google 下的日志">Google</a> Maps.  XHR enabled individual parts of a web page &#8212; a game, a map, a video, a  little survey &#8212; to be altered without needing to reload the entire  page. As a result, web apps are faster and more responsive.</p></blockquote>
<p>但今天我们所熟知的动态网页，是当XHR(XML Http  Request)引入到JavaScript后才生机焕发，也是首次应用在像微软网页版Outlook，Gmail和Google地图这样的网页程序中。 XHR可以单独改变网页中的独立元素而无需重新加载整个网页，像网页中的游戏，地图，视频，或是个小调查。因此，网络应用程序运行地更快，更及时。</p>
<blockquote style="display:none;"><p>Web pages have also become more expressive with the  introduction of CSS (Cascading Style Sheets). CSS gives programmers an  easy, efficient way to define a web page’s layout and beautify the page  with design elements like colors, rounded corners, gradients, and  animation.</p></blockquote>
<p>CSS（层叠样式表）的应用也使得网页显示更为生动。CSS给网页程序员提供了一个简单，有效的 方式来定义网页的布局，可以使用颜色，圆角，渐变和动画等设计元素来美化网页。</p>
<blockquote style="display:none;"><p>Web programmers  often refer to this potent combination of JavaScript, XHR, CSS and  several other web technologies as <a href="http://www.iwanna.cn/tags/ajax/" class="st_tag internal_tag" rel="tag" title="标签 Ajax 下的日志">AJAX</a> (Asynchronous JavaScript and  XML). HTML has also continued to evolve as more features and  improvements are incorporated into new versions of the HTML standard.</p></blockquote>
<p>网页程序员通常把JavaScript, XHR, CSS 和其他诸如AJAX  （异步JavaScript和XML）等网页技术结合，形成一个强有力的组合。随着增加的更多功能和改进整合在一起，HTML  也继续发展出一个新的标准版本。</p>
<blockquote style="display:none;"><p>Today’s web has evolved from the ongoing  efforts of all the technologists, thinkers, coders and organizations  who create these web technologies and ensure that they’re supported in  web browsers like Internet Explorer, Firefox, Safari and Google Chrome.  This interaction between web technologies and browsers has made the web  an open and friendly construction platform for web developers, who then  bring to life many useful and fun web applications that we use daily.</p></blockquote>
<p>今天，网页在全体技术专家，思想家，程序员和一些组织的不懈努力下不断发展，这些组织不但创造了网页技术，而且要确保这些技术能被诸如 IE，Firefox, Safari和Google  Chrome等浏览器中支持。网页技术专家和浏览器之间的相互关系，对网页开发者来说，使得网页成为既开放又友好的制作平台，他们给我们的生活带来更多有 用而且有趣的网页应用程序。</p>
<hr />
<p>© <a href="http://www.iwanna.cn">我想网</a> Akon 所有 , 2010. |
<a href="http://www.iwanna.cn/archives/2010/12/01/5981/">永久链接</a> |
<a href="http://www.iwanna.cn/archives/2010/12/01/5981/#comments">没有评论</a> |
提交到
<a rel="nofollow" target="_blank" href="http://www.google.com/reader/view/feed/http://www.iwanna.cn/archives/2010/12/01/5981/">Google Reader</a>
<a rel="nofollow" target="_blank" href="http://www.xianguo.com/subscribe.php?url=http://www.iwanna.cn/archives/2010/12/01/5981/">鲜果</a>
<a rel="nofollow" target="_blank" href="http://www.zhuaxia.com/add_channel.php?url=http://www.iwanna.cn/archives/2010/12/01/5981/">抓虾</a>
<hr />
<script type="text/javascript"><!--
google_ad_client = "pub-2057344547305288";
/* 336x280,iwanna feed,created 10/3/10 */
google_ad_slot = "9738886183";
google_ad_width = 336;
google_ad_height = 280;
//-->
</script>
<script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script>
<hr />
</p>
<p><small>Feed enhanced by <a href='http://planetozh.com/blog/my-projects/wordpress-plugin-better-feed-rss/'>Better Feed</a> from  <a href='http://planetozh.com/blog/'>Ozh</a></small></p>
]]></content:encoded>
			<wfw:commentRss>http://www.iwanna.cn/archives/2010/12/01/5981/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>10个强大的Ajax jQuery文件上传程序</title>
		<link>http://www.iwanna.cn/archives/2010/11/07/5734/</link>
		<comments>http://www.iwanna.cn/archives/2010/11/07/5734/#comments</comments>
		<pubDate>Sun, 07 Nov 2010 15:55:03 +0000</pubDate>
		<dc:creator>seasun</dc:creator>
				<category><![CDATA[Ajax]]></category>
		<category><![CDATA[JQuery]]></category>

		<guid isPermaLink="false">http://www.iwanna.cn/?p=5734</guid>
		<description><![CDATA[上传文件和图片是许多网站的一个常用功能，无论是让注册用户上传一个个人资料图片还是上传文件共享，都离不开上传程序，虽然有很多种实现方法，但要 让上传看起来更酷一点，如显示剩余时间，同时上传多个文件，以及使用拖放式操作，或上传功能更稳定一点，也许你就没招了，没关系，本文就为你介绍10个功 能强大，易于使用的Ajax jQuery文件上传程序，注意有些除了使用Ajax jQuery外，还结合了其它技术，如Flash。 1、 Valums AJAX Uploader 2、 Plupload 3、 Uploadify 4、AJAX Multiple File Upload Form using jQuery 5、jQuery AJAX File Upload 6、jQuery Upload Progress 7、jQuery Multiple File Upload Plugin 8、Digitalarld Swiff AJAX Uploader 9、jQUploader 10、AJAX File Upload © 我想网 Akon 所有 , 2010. &#124; 永久链接 &#124; 没有评论 &#124; 提交到 Google Reader 鲜果 [...]]]></description>
			<content:encoded><![CDATA[<p>上传文件和图片是许多网站的一个常用功能，无论是让注册用户上传一个个人资料图片还是上传文件共享，都离不开上传程序，虽然有很多种实现方法，但要 让上传看起来更酷一点，如显示剩余时间，同时上传多个文件，以及使用拖放式操作，或上传功能更稳定一点，也许你就没招了，没关系，本文就为你介绍10个功 能强大，易于使用的Ajax jQuery文件上传程序，注意有些除了使用Ajax jQuery外，还结合了其它技术，如Flash。</p>
<p><strong><a href="http://valums.com/ajax-upload/" target="_blank">1、 Valums AJAX Uploader</a></strong></p>
<p><a href="http://images.uheed.com/iwanna/2010/11/07/ajax-jquery/clip_image002.jpg"><img title="clip_image002" src="http://images.uheed.com/iwanna/2010/11/07/ajax-jquery/clip_image002_thumb.jpg" border="0" alt="10个强大的Ajax jQuery文件上传程序 | iwanna.cn 我想网 002" width="244" height="124" /></a><br />
<span id="more-5734"></span><br />
<strong> </strong></p>
<p><strong><a href="http://www.plupload.com/" target="_blank">2、 Plupload</a></strong></p>
<p><a href="http://images.uheed.com/iwanna/2010/11/07/ajax-jquery/clip_image004.jpg"><img title="clip_image004" src="http://images.uheed.com/iwanna/2010/11/07/ajax-jquery/clip_image004_thumb.jpg" border="0" alt="10个强大的Ajax jQuery文件上传程序 | iwanna.cn 我想网 004" width="244" height="124" /></a></p>
<p><strong><a href="http://www.uploadify.com/" target="_blank">3、 Uploadify</a></strong></p>
<p><a href="http://images.uheed.com/iwanna/2010/11/07/ajax-jquery/clip_image006.jpg"><img title="clip_image006" src="http://images.uheed.com/iwanna/2010/11/07/ajax-jquery/clip_image006_thumb.jpg" border="0" alt="10个强大的Ajax jQuery文件上传程序 | iwanna.cn 我想网 006" width="244" height="124" /></a></p>
<p><strong><a href="http://webdeveloperplus.com/jquery/ajax-multiple-file-upload-form-using-jquery/" target="_blank">4、AJAX Multiple File Upload Form using jQuery</a></strong></p>
<p><a href="http://images.uheed.com/iwanna/2010/11/07/ajax-jquery/clip_image008.jpg"><img title="clip_image008" src="http://images.uheed.com/iwanna/2010/11/07/ajax-jquery/clip_image008_thumb.jpg" border="0" alt="10个强大的Ajax jQuery文件上传程序 | iwanna.cn 我想网 008" width="244" height="178" /></a></p>
<p><strong><a href="http://cool-javascripts.com/jquery/jquery-ajax-file-upload.html" target="_blank">5、jQuery AJAX File Upload</a></strong></p>
<p><a href="http://images.uheed.com/iwanna/2010/11/07/ajax-jquery/clip_image010.jpg"><img title="clip_image010" src="http://images.uheed.com/iwanna/2010/11/07/ajax-jquery/clip_image010_thumb.jpg" border="0" alt="10个强大的Ajax jQuery文件上传程序 | iwanna.cn 我想网 010" width="244" height="82" /></a></p>
<p><strong><a href="http://nixbox.com/demos/jquery-uploadprogress.php" target="_blank">6、jQuery Upload Progress</a></strong></p>
<p><a href="http://images.uheed.com/iwanna/2010/11/07/ajax-jquery/clip_image012.jpg"><img title="clip_image012" src="http://images.uheed.com/iwanna/2010/11/07/ajax-jquery/clip_image012_thumb.jpg" border="0" alt="10个强大的Ajax jQuery文件上传程序 | iwanna.cn 我想网 012" width="244" height="124" /></a></p>
<p><strong><a href="http://www.fyneworks.com/jquery/multiple-file-upload/#" target="_blank">7、jQuery Multiple File Upload Plugin</a></strong></p>
<p><a href="http://images.uheed.com/iwanna/2010/11/07/ajax-jquery/clip_image014.jpg"><img title="clip_image014" src="http://images.uheed.com/iwanna/2010/11/07/ajax-jquery/clip_image014_thumb.jpg" border="0" alt="10个强大的Ajax jQuery文件上传程序 | iwanna.cn 我想网 014" width="244" height="124" /></a></p>
<p><strong><a href="http://digitarald.de/project/fancyupload/3-0/showcase/photoqueue/" target="_blank">8、Digitalarld Swiff AJAX Uploader</a></strong></p>
<p><a href="http://images.uheed.com/iwanna/2010/11/07/ajax-jquery/clip_image016.jpg"><img title="clip_image016" src="http://images.uheed.com/iwanna/2010/11/07/ajax-jquery/clip_image016_thumb.jpg" border="0" alt="10个强大的Ajax jQuery文件上传程序 | iwanna.cn 我想网 016" width="244" height="124" /></a></p>
<p><strong><a href="http://pixeline.be/experiments/jqUploader/test.php" target="_blank">9、jQUploader</a></strong></p>
<p><a href="http://images.uheed.com/iwanna/2010/11/07/ajax-jquery/clip_image018.jpg"><img title="clip_image018" src="http://images.uheed.com/iwanna/2010/11/07/ajax-jquery/clip_image018_thumb.jpg" border="0" alt="10个强大的Ajax jQuery文件上传程序 | iwanna.cn 我想网 018" width="244" height="124" /></a></p>
<p><strong><a href="http://www.phpletter.com/Demo/AjaxFileUpload-Demo/" target="_blank">10、AJAX File Upload</a></strong></p>
<p><a href="http://images.uheed.com/iwanna/2010/11/07/ajax-jquery/clip_image020.jpg"><img title="clip_image020" src="http://images.uheed.com/iwanna/2010/11/07/ajax-jquery/clip_image020_thumb.jpg" border="0" alt="10个强大的Ajax jQuery文件上传程序 | iwanna.cn 我想网 020" width="244" height="124" /></a></p>
<hr />
<p>© <a href="http://www.iwanna.cn">我想网</a> Akon 所有 , 2010. |
<a href="http://www.iwanna.cn/archives/2010/11/07/5734/">永久链接</a> |
<a href="http://www.iwanna.cn/archives/2010/11/07/5734/#comments">没有评论</a> |
提交到
<a rel="nofollow" target="_blank" href="http://www.google.com/reader/view/feed/http://www.iwanna.cn/archives/2010/11/07/5734/">Google Reader</a>
<a rel="nofollow" target="_blank" href="http://www.xianguo.com/subscribe.php?url=http://www.iwanna.cn/archives/2010/11/07/5734/">鲜果</a>
<a rel="nofollow" target="_blank" href="http://www.zhuaxia.com/add_channel.php?url=http://www.iwanna.cn/archives/2010/11/07/5734/">抓虾</a>
<hr />
<script type="text/javascript"><!--
google_ad_client = "pub-2057344547305288";
/* 336x280,iwanna feed,created 10/3/10 */
google_ad_slot = "9738886183";
google_ad_width = 336;
google_ad_height = 280;
//-->
</script>
<script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script>
<hr />
</p>
<p><small>Feed enhanced by <a href='http://planetozh.com/blog/my-projects/wordpress-plugin-better-feed-rss/'>Better Feed</a> from  <a href='http://planetozh.com/blog/'>Ozh</a></small></p>
]]></content:encoded>
			<wfw:commentRss>http://www.iwanna.cn/archives/2010/11/07/5734/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>开发移动 Web Ajax 应用</title>
		<link>http://www.iwanna.cn/archives/2010/08/12/4919/</link>
		<comments>http://www.iwanna.cn/archives/2010/08/12/4919/#comments</comments>
		<pubDate>Thu, 12 Aug 2010 15:44:27 +0000</pubDate>
		<dc:creator>seasun</dc:creator>
				<category><![CDATA[Ajax]]></category>
		<category><![CDATA[WEB]]></category>
		<category><![CDATA[Web]]></category>

		<guid isPermaLink="false">http://www.iwanna.cn/?p=4919</guid>
		<description><![CDATA[本文阐述如何开发一个运行在 Apple iPhone 以及基于 Android 的智能手机上的移动 Web 应用。 开发这些设备上的移动 Web 应用，我们不能使用平常的桌面浏览器，至少不能完全只使用桌面浏览器。 我们还需要模拟器或实际的设备。对于 iPhone 来说，我们需要使用 iPhone 模拟器。它是 iPhone SDK 的一部分。本文所使用的是 iPhone SDK 3.1。类似地，我们也需要使用 Android SDK。它包含了一个 Android Virtual Device 管理器，这个管理器可以用来创建运行各个 Android 版本的 Android 模拟器。 其中本文使用的是 Android SDK 2.1。本文所用到的大部分代码是 JavaScript 代码，以及一些 HTML 和 CSS。 此外，应用还有一个使用 Java™ 实现的服务器端。这并不是强制性要求的，和其它的 Web 应用一样， 我们可以自己选择使用任意的服务器端技术。我们需要使用 Java 1.6 来运行本文所开发的应用。 另外我们还需要使用 Jersey，它是 JAX-RS 的参考实现，以及所有相关的 Java [...]]]></description>
			<content:encoded><![CDATA[<p>本文阐述如何开发一个运行在 Apple iPhone 以及基于 Android 的智能手机上的移动 <a href="http://www.iwanna.cn/tags/web/" class="st_tag internal_tag" rel="tag" title="标签 Web 下的日志">Web</a> 应用。 开发这些设备上的移动  <a href="http://www.iwanna.cn/tags/web/" class="st_tag internal_tag" rel="tag" title="标签 Web 下的日志">Web</a> 应用，我们不能使用平常的桌面浏览器，至少不能完全只使用桌面浏览器。 我们还需要模拟器或实际的设备。对于 iPhone 来说，我们需要使用  iPhone 模拟器。它是 iPhone SDK 的一部分。本文所使用的是 iPhone SDK 3.1。类似地，我们也需要使用  Android SDK。它包含了一个 Android Virtual Device 管理器，这个管理器可以用来创建运行各个 Android  版本的 Android 模拟器。 其中本文使用的是 Android SDK 2.1。本文所用到的大部分代码是 <a href="http://www.iwanna.cn/tags/javascript/" class="st_tag internal_tag" rel="tag" title="标签 JavaScript 下的日志">JavaScript</a>  代码，以及一些 <a href="http://www.iwanna.cn/tags/html/" class="st_tag internal_tag" rel="tag" title="标签 HTML 下的日志">HTML</a> 和 <a href="http://www.iwanna.cn/tags/css/" class="st_tag internal_tag" rel="tag" title="标签 CSS 下的日志">CSS</a>。 此外，应用还有一个使用 Java™ 实现的服务器端。这并不是强制性要求的，和其它的 <a href="http://www.iwanna.cn/tags/web/" class="st_tag internal_tag" rel="tag" title="标签 Web 下的日志">Web</a> 应用一样，  我们可以自己选择使用任意的服务器端技术。我们需要使用 Java 1.6 来运行本文所开发的应用。 另外我们还需要使用 Jersey，它是  JAX-RS 的参考实现，以及所有相关的 Java Archive (JAR) 文件（见 参考资料）。<br />
<span id="more-4919"></span><br />
手机浏览器与 WebKit</p>
<p>移动设备很多年就有 Web 浏览器了。然而，由于 Web 开发人员必须处理跨浏览器支持问题，  因此开发浏览器应用一直是很困难的。开发人员需要花费很多的时间来实现 HTML、JavaScript 和 CSS  在不同版本的浏览器上运行完全一致，如 Internet Explorer、Mozilla Firefox、Safari 等。  而桌面浏览器的问题几乎与手机浏览器中的问题如出一辙。不同版本的手机浏览器也是多得惊人。  每个设备制造商都拥有各自的浏览器，甚至来自相同厂商的设备在操作系统、屏幕大小等方面都有很大的差别。 有些浏览器只支持  WAP，而有一些则支持部分的 HTML，还有一些完全支持 HTML，但不支持 JavaScript。</p>
<p>幸好，现在情况已经大不相同了。到 2010 年 1 月，美国有超过 80% 的移动互联网流量都是通过 iPhone 或 Android  手机产生的。这两种操作系统不仅都是使用 WebKit 进行 HTML/CSS 渲染， 而且它们都是一样积极地使用 HTML 5 标准所采用的  JavaScript 引擎。没错。 移动领域的主流浏览器现在都使用了开放标准。这是 Web 开发人员所遇到的最好时机。</p>
<p>浏览器之间还是存在差别的，即使是不同版本的 iPhone 和 Android 也不例外。 其中 Android 浏览器差别最大。在 2.0  之前版本的 Android 上，Android 浏览器使用的是私有的 <a href="http://www.iwanna.cn/tags/google/" class="st_tag internal_tag" rel="tag" title="标签 Google 下的日志">Google</a> Gears 技术。虽然 Gears  有很多优秀的创新技术，现在已经包含在 HTML 5 标准中了。 然而，这意味着在很长的一段时间里，Android 浏览器是不支持其中一些  HTML 5 标准的， 但是我们还是能够使用 Gears 来实现一部分功能。本文的所有代码都是基于 HTML 5 标准并且是可以正常运行在  Android 2.0+ 或 iPhone 3.0+ 上的。 既然我们已经拥有了这些现代的基于 WebKit  的浏览器，接下来让我们来看看一些这些设备上的 <a href="http://www.iwanna.cn/tags/ajax/" class="st_tag internal_tag" rel="tag" title="标签 Ajax 下的日志">Ajax</a>。</p>
<p>手机浏览器上的 Ajax</p>
<p>像桌面 Web 应用一样，在移动 Web 应用上创建引人注目的用户体验的关键通常就是使用 Ajax。当然， 用户体验并不是使用 Ajax  的唯一原因；其中还可能涉及到速度和效率的原因。而后者恰恰是在移动 Web 应用上使用 Ajax  的更重要的原因所在，因为移动网络的延迟更大，而浏览器本身也受到处理器速度、 内存和缓存大小的限制。幸好，由于只需要关注于基于标准的浏览器，因此  Ajax 则恰好是许多因此变得更简单的技术之一。在详细讨论这个问题之前， 让我们先快速地了解一下本文所开发的应用所使用的后台服务器。</p>
<p>在开始之前，我们需要下载必要的 JAR 文件，其中包括 Jersey、Xerces、Rome 和 Google App Engine  SDK (见 参考资料)。然后将它们安装到下面的文件夹中：WebKitBlog&gt;war&gt;WEB-INF&gt;lib。  我们可以从这里 下载 应用的其它源代码。</p>
<p>WebKit 博客</p>
<p>本文的移动 Web 应用是一个简单的阅读移动 Web 开发新闻的应用。虽然目前它只是简单地从官方 WebKit 博客抓取 RSS  源，但是它可以经过简单地修改来收集多个 RSS 源。这个应用是一个普通的 Java Web 应用，它可以部署到任何一个 Java  应用服务器上。所有代码见清单 1。</p>
<p>清单 1. Feed 类</p>
<p>@Path(”/feed”)</p>
<p>public class Feed {</p>
<p>String surfinSafari = “<a href="http://webkit.org/blog/feed/">http://webkit.org/blog/feed/</a>“;</p>
<p>@GET @Produces(”application/<a href="http://www.iwanna.cn/tags/json/" class="st_tag internal_tag" rel="tag" title="标签 Json 下的日志">json</a>”)</p>
<p>public News getNews(@DefaultValue(”0″) @QueryParam(”after”) long  after)</p>
<p>throws Exception{</p>
<p>URL feedUrl = new URL(surfinSafari);</p>
<p>SyndFeedInput input = new SyndFeedInput();</p>
<p>SyndFeed feed = input.build(new XmlReader(feedUrl));</p>
<p>List&lt;Item&gt; entries = new  ArrayList&lt;Item&gt;(feed.getEntries().size());</p>
<p>for (Object obj : feed.getEntries()){</p>
<p>SyndEntry entry = (SyndEntry) obj;</p>
<p>if (entry.getPublishedDate().getTime() &gt; after){</p>
<p>Item item = new Item(entry.getTitle(),  entry.getLink(),</p>
<p>entry.getDescription().getValue(),</p>
<p>entry.getPublishedDate().getTime());</p>
<p>entries.add(item);</p>
<p>}</p>
<p>}</p>
<p>return new News(feed.getTitle(), entries);</p>
<p>}</p>
<p>}</p>
<p>这个类使用 Java 的 JAX-RS 创建一个 RESTful 服务。@Path 注释表示了服务的终端，即服务的相对 URL 是  /feed。@GET 表示这个服务支持 HTTP GET。@Produces 声明这个服务将生成 JSON 格式的数据。这是一个简单的以  JSON 格式序列化数据的方法。 方法 getNews 接收一个名为 after 的参数， 即获取一个特定日期之后的实体。这里也使用  JAX-RS 注释来将参数 after 绑定到查询字符参数 after 上。如果没有赋值，它会使用默认值 0。</p>
<p>到这里，我只阐述了 清单 1 中创建服务寻址和数据序列化的代码所用到的 JAX-RS 注释。该方法的主体实际上大部分依赖于处理 RSS 的  Rome 包。它只是下载最新的 RSS 源， 然后将它转换成我们应用所需要的数据，这里的数据就是 Item 和 News  这两类。其中唯一复杂的部分是文章的发表日期被转化为一个 long 值，并用作一个 ID。这是一个非常有用的 ID，  因为我们可以用它来进行排序，我们将在后面使用到。News 类如清单 2 所示。</p>
<p>清单 2. News 类</p>
<p>@XmlRootElement</p>
<p>public class News {</p>
<p>private String title;</p>
<p>private List&lt;Item&gt; entries;</p>
<p>// constructors, getters/setters omitted for brevity</p>
<p>}</p>
<p>注意 News 类使用了 JAXB 注释 @XmlRootElement。 这个应用中不使用 XML，但是 JAX-RS 使用 JAXB  完成自动的序列化/反序列化。这个类只有一个标题属性和一组 Item。 Item 类如清单 3 所示。</p>
<p>清单 3. Item 类</p>
<p>@XmlType</p>
<p>public class Item {</p>
<p>private String title;</p>
<p>private String link;</p>
<p>private String description;</p>
<p>private Long id;</p>
<p>// constructors, getters/setters omitted for brevity</p>
<p>}</p>
<p>这个类包含的就是我们在 Web 应用中显示的内容。类似于 News 类， 它也使用 JAXB 注释，这样 JAX-RS 可以将它序列化成  JSON。这部分代码的最后一部分是配置 Web 应用的，以使请求能指向 JAX-RS。为了达到这个目的，我们需要编辑应用的 web.xml  文件， 如清单 4 所示。</p>
<p>清单 4. web.xml 配置文件</p>
<p>&lt;?xml version=”1.0″ encoding=”utf-8″?&gt;</p>
<p>&lt;web-app xmlns:xsi=”<a href="http://www.w3.org/2001/XMLSchema-instance">http://www.w3.org/2001/XMLSchema-instance</a>”</p>
<p>xmlns=”<a href="http://java.sun.com/xml/ns/javaee">http://java.sun.com/xml/ns/javaee</a>”</p>
<p>xmlns:web=”<a href="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd</a>”</p>
<p>xsi:schemaLocation=”<a href="http://java.sun.com/xml/ns/javaee">http://java.sun.com/xml/ns/javaee</a></p>
<p><a href="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd</a>”</p>
<p>version=”2.5″&gt;</p>
<p>&lt;servlet&gt;</p>
<p>&lt;servlet-name&gt;WebKit Blog Servlet&lt;/servlet-name&gt;</p>
<p>&lt;servlet-class&gt;com.sun.jersey.spi.container.servlet.</p>
<p>ServletContainer&lt;/servlet-class&gt;</p>
<p>&lt;init-param&gt;</p>
<p>&lt;param-name&gt;com.sun.jersey.config.property.packages&lt;/param-name&gt;</p>
<p>&lt;param-value&gt;org.developerworks.mobile&lt;/param-value&gt;</p>
<p>&lt;/init-param&gt;</p>
<p>&lt;load-on-startup&gt;1&lt;/load-on-startup&gt;</p>
<p>&lt;/servlet&gt;</p>
<p>&lt;servlet-mapping&gt;</p>
<p>&lt;servlet-name&gt;WebKit Blog Servlet&lt;/servlet-name&gt;</p>
<p>&lt;url-pattern&gt;/resources/*&lt;/url-pattern&gt;</p>
<p>&lt;/servlet-mapping&gt;</p>
<p>&lt;session-config&gt;</p>
<p>&lt;session-timeout&gt;30&lt;/session-timeout&gt;</p>
<p>&lt;/session-config&gt;</p>
<p>&lt;!– Default page to serve –&gt;</p>
<p>&lt;welcome-file-list&gt;</p>
<p>&lt;welcome-file&gt;index.html&lt;/welcome-file&gt;</p>
<p>&lt;/welcome-file-list&gt;</p>
<p>&lt;mime-mapping&gt;</p>
<p>&lt;extension&gt;mf&lt;/extension&gt;</p>
<p>&lt;mime-type&gt;text/cache-manifest&lt;/mime-type&gt;</p>
<p>&lt;/mime-mapping&gt;</p>
<p>&lt;/web-app&gt;</p>
<p>这是最典型的 web.xml 代码。我们可以看到 servlet 声明，应用使用了 JAX-RS 的参考实现 Jersey。  Servlet 的初始化参数指示 Jersey 扫描 org.developerworks.mobile  包中被标记为处理服务请求的类。同时，任何映射到 /resources/ 的请求都将映射到 Jersey servlet。  这里最后需要注意的是文件最后的 mime-mapping 部分。这是 MANIFEST 文件的 MIME 类型， 也是我后面将讨论到的脱机  Web 应用的一个关键。既然我们已经了解了 Web 应用将使用到的后台服务， 接下来我们将了解它使用到的前台。</p>
<p>Ajax 构建的用户接口</p>
<p>清单 4 中我们可以看到应用有一个标准的 index.html 文件。这是应用的入口点，如清单 5 所示。</p>
<p>清单 5. index.html 文件</p>
<p>&lt;!DOCTYPE HTML PUBLIC “-//W3C//DTD HTML 4.01 Transitional//EN”&gt;</p>
<p>&lt;html manifest=”application.mf”&gt;</p>
<p>&lt;head&gt;</p>
<p>&lt;meta http-equiv=”content-type” content=”text/html;  charset=UTF-8″&gt;</p>
<p>&lt;title&gt;WebKit News&lt;/title&gt;</p>
<p>&lt;meta name = “viewport” content = “width = device-width”/&gt;</p>
<p>&lt;script type=”text/javascript”  src=”index.js”&gt;&lt;/script&gt;</p>
<p>&lt;/head&gt;</p>
<p>&lt;body onload=”loadEntries()”&gt;</p>
<p>&lt;h1 id=”title”&gt;Recent News About WebKit&lt;/h1&gt;&lt;img</p>
<p>id=”loader” src=”loading.gif”/&gt;</p>
<p>&lt;/body&gt;</p>
<p>&lt;/html&gt;</p>
<p>这是一个非常简单的 Web 页面，但是其中有许多值得注意的方面。首先，在文件头部我设置了视区。  它指示浏览器放大内容，使内容在设备上良好显示。在 UI 代码方面，这里只有一个标题和表示正在加载的图片。 剩下的部分就是  JavaScript。文件 index.js 中的 loadEntries 函数会发送一个 Ajax 请求加载数据。这个函数如清单 6 所示。</p>
<p>清单 6. loadEntries 函数</p>
<p>function loadEntries(){</p>
<p>if (!window.JSON){</p>
<p>var head = document.getElementsByTagName(”head”)[0];</p>
<p>var jsScript = document.createElement(”script”);</p>
<p>jsScript.setAttribute(”src”, “json2.js”);</p>
<p>jsScript.setAttribute(”type”,”text/javascript”);</p>
<p>head.appendChild(jsScript);</p>
<p>}</p>
<p>var xhr = new XMLHttpRequest();</p>
<p>xhr.onreadystatechange = function(){</p>
<p>if (this.readyState == 4 &amp;&amp;this.status == 200){</p>
<p>var theFeed = JSON.parse(this.responseText);</p>
<p>var i = 0;</p>
<p>if (theFeed.entries){</p>
<p>var len = theFeed.entries.length;</p>
<p>for (i=0;i&lt;len;i++){</p>
<p>addEntry(theFeed.entries[len - 1 -i],  true);</p>
<p>}</p>
<p>}</p>
<p>var body =  document.getElementsByTagName(”body”)[0];</p>
<p>body.removeChild($(”loader”));</p>
<p>}</p>
<p>};</p>
<p>var urlStr = “/resources/feed”;</p>
<p>xhr.open(”GET”, urlStr);</p>
<p>xhr.send();</p>
<p>}</p>
<p>在这个函数的开始部分，我进行了一些功能检查。大多数浏览器支持内置的解析和序列化 JSON 的函数。 这与 json.org 上的 JSON  库是相同的。然而，如果没有这个函数，我们需要在页面上包含这个文件， 然后我们就有相同的功能了。</p>
<p>另外，这是非常简单的 Ajax 代码。我们不需要担心 Internet Explorer 不支持，所以我们可以直接创建一个  XMLHttpRequest。我们可以设置它的 onreadystatechange  属性为一个函数，在本例中将创建一个闭包。当响应从服务器返回（readyState = 4）且处理过程没有发生问题（status = 200  OK）时，我们就使用 JSON.parse 函数来解析 JSON 响应。对于来自源的每一个记录执行 addEntry 函数。  这个函数为每一个记录创建 UI 元素。如清单 7 所示。</p>
<p>清单 7. addEntry 函数</p>
<p>function addEntry(e, prepend){</p>
<p>var eDiv = document.createElement(”div”);</p>
<p>eDiv.setAttribute(”class”, “item”);</p>
<p>var link = document.createElement(”a”);</p>
<p>link.setAttribute(”href”, e["link"]);</p>
<p>var title = document.createTextNode(e["title"]);</p>
<p>link.appendChild(title);</p>
<p>eDiv.appendChild(link);</p>
<p>var button = document.createElement(”input”);</p>
<p>button.setAttribute(”type”, “button”);</p>
<p>button.setAttribute(”value”, “Show”);</p>
<p>button.setAttribute(”id”, “button” + e["id"]);</p>
<p>button.setAttribute(”onclick”, “showDescription(’” + e["id"] +  “‘)”);</p>
<p>eDiv.appendChild(button);</p>
<p>var dDiv = document.createElement(”div”);</p>
<p>dDiv.setAttribute(”id”, e["id"]);</p>
<p>dDiv.setAttribute(”class”, “description”);</p>
<p>dDiv.setAttribute(”style”, “display:none”);</p>
<p>dDiv.innerHTML = e["description"];</p>
<p>eDiv.appendChild(dDiv);</p>
<p>var body = document.getElementsByTagName(”body”)[0];</p>
<p>if (!prepend &amp;&amp; body.childNodes.length &gt; 1){</p>
<p>body.appendChild(eDiv);</p>
<p>} else {</p>
<p>body.insertBefore(eDiv, body.childNodes.item(2));</p>
<p>}</p>
<p>}</p>
<p>这个函数里执行的都是标准的 DOM 操作。唯一复杂的方面是记录可以附加在后面或插到前面， 或者添加到顶部或底部。在前面的 清单 6  中，函数的最后一个操作是删除正在加载的图片。 这其中包括基本的 Ajax 函数，我们可以根据用例选择使用。然而，应用需要从服务器下载许多数据，  然后再解析。对于移动 Web 应用，我们可以有更好的方式，我们可以使用本地缓存。</p>
<p>使用本地存储进行缓存</p>
<p>本地存储属于 HTML 5 规范，并且得到广泛的支持。它有一个简单的 name – value 存储机制， 而其中 name 和  value 都是字符串。所以将记录保存到本地存储是很简单的，如清单 8 所示。</p>
<p>清单 8. 保存到本地存储</p>
<p>function saveLocal(entry){</p>
<p>if (!window.localStorage){</p>
<p>return;</p>
<p>}</p>
<p>localStorage.setItem(entry["id"], JSON.stringify(entry));</p>
<p>}</p>
<p>同样，这里做了一些浏览器功能检查，按照 HTML 5 规范，首先检查 window 对象是否有 localStorage 属性。  如果有，那么我们就可以使用记录的 id 作为存储的键。 对于 value，必须使用字符串，因此我们使用 JSON.stringify  函数来将对象序列化成一个字符串。 这样，我们只需要一个从本地存储读取所有数据的函数。如清单 9 所示。</p>
<p>清单 9. 从本地存储加载数据</p>
<p>function loadLocal(){</p>
<p>if (!window.localStorage){</p>
<p>return [];</p>
<p>}</p>
<p>var i = 0;</p>
<p>var e = {};</p>
<p>var id = 0;</p>
<p>var entries = [];</p>
<p>for (i=0; i&lt; localStorage.length; i++){</p>
<p>id = localStorage.key(i);</p>
<p>e = JSON.parse(localStorage.getItem(id));</p>
<p>entries[entries.length] = e;</p>
<p>}</p>
<p>entries.sort(function(a,b) {</p>
<p>return b.id – a.id;</p>
<p>});</p>
<p>return entries;</p>
<p>}</p>
<p>同样，这个函数从检查本地存储是否可用开始。接着，它遍历本地存储中的所有数据。 对于存储中的每一个值，我们再次使用 JSON.parse  函数来将字符串解析成为一个对象。  接着，我们需要对记录进行排序，因为它们从本地存储返回的顺序是不一定的。这里进行了一个降序排序，最新记录在最前面。  最后，我们就有了本地存储的保存和加载函数，我们需要将它们整合到 loadEntries 函数中， 如清单 10 所示。</p>
<p>清单 10. 添加缓存到 loadEntries 函数</p>
<p>function loadEntries(){</p>
<p>// check for JSON object</p>
<p>var localEntries = loadLocal();</p>
<p>var newest = 0;</p>
<p>if (localEntries.length &gt; 0){</p>
<p>newest = localEntries[0].id;</p>
<p>}</p>
<p>var i = 0;</p>
<p>for (i=0;i&lt;localEntries.length;i++){</p>
<p>addEntry(localEntries[i]);</p>
<p>}</p>
<p>var xhr = new XMLHttpRequest();</p>
<p>xhr.onreadystatechange = function(){</p>
<p>if (this.readyState == 4 &amp;&amp; this.status == 200){</p>
<p>var theFeed = JSON.parse(this.responseText);</p>
<p>var i = 0;</p>
<p>if (theFeed.entries){</p>
<p>var len = theFeed.entries.length;</p>
<p>for (i=0;i&lt;len;i++){</p>
<p>addEntry(theFeed.entries[len - 1 -i],  true);</p>
<p>saveLocal(theFeed.entries[len - 1  -i]);</p>
<p>}</p>
<p>}</p>
<p>var body =  document.getElementsByTagName(”body”)[0];</p>
<p>body.removeChild($(”loader”));</p>
<p>}</p>
<p>};</p>
<p>var urlStr = “/resources/feed?after=” + newest;</p>
<p>xhr.open(”GET”, urlStr);</p>
<p>xhr.send();</p>
<p>}</p>
<p>这里的主要区别是我们首先加载本地数据。接着确定其中最新的记录，然后在我们连接服务器时使用这个参数，  服务器将只会返回不在本地存储的记录。最后，当我获得新的记录后，在回调函数中我们需要调用 saveLocal  函数来将它们保存到本地缓存中。在新的记录存储到本地后，现在我们就可以启用 Web 应用的完全脱机访问。</p>
<p>脱机访问</p>
<p>使应用以脱机方式工作通常被视为移动 Web 应用开发的圣杯。虽然它可能很复杂， 但是许多 HTML 5  的新特性对它进行了简化。我们需要做的第一件事是确定什么东西需要脱机访问， 然后将它们列在应用的 MANIFEST 中，如清单 11 所示。</p>
<p>清单 11. 应用的 MANIFEST</p>
<p>CACHE MANIFEST</p>
<p>index.html</p>
<p>index.js</p>
<p>json2.js</p>
<p>loading.gif</p>
<p>对于这样简单的应用，它的 MANIFEST 也是非常简单的。它只包含全部的静态文件：HTML、JavaScript 和图片（以及  CSS）。 其中重要的一点是这个文件要用 MIME 类型 text/cache-manifest 挂载 —— 正如我们在 清单 4 的  web.xml 文件中设置的那样。最后，在 清单 5 中， 我们可以看到最外层的 html 元素有一个属性 manifest， 它指向 清单  11 中的 MANIFEST 文件。最后我们需要做的是对 loadEntries 函数进行最后的修改，如清单 12 所示。</p>
<p>清单 12. 脱机检查</p>
<p>function loadEntries(){</p>
<p>// load local</p>
<p>// …</p>
<p>// check if online</p>
<p>if (navigator.onLine){</p>
<p>var xhr = new XMLHttpRequest();</p>
<p>xhr.onreadystatechange = function(){</p>
<p>if (this.readyState == 4 &amp;&amp; this.status == 200){</p>
<p>var theFeed = JSON.parse(this.responseText);</p>
<p>var i = 0;</p>
<p>if (theFeed.entries){</p>
<p>var len = theFeed.entries.length;</p>
<p>for (i=0;i&lt;len;i++){</p>
<p>addEntry(theFeed.entries[len - 1  -i], true);</p>
<p>saveLocal(theFeed.entries[len - 1  -i]);</p>
<p>}</p>
<p>}</p>
<p>var body =  document.getElementsByTagName(”body”)[0];</p>
<p>body.removeChild($(”loader”));</p>
<p>}</p>
<p>};</p>
<p>var urlStr = “/resources/feed?after=” + newest;</p>
<p>xhr.open(”GET”, urlStr);</p>
<p>xhr.send();</p>
<p>}</p>
<p>}</p>
<p>检查 navigator 对象（window.navigator）的 onLine  属性就可以确定当前是否是脱机的。如果是脱机的，应用就不会请求服务器获取新的记录，而只显示所有本地记录。 现在，我们有了一个支持脱机的完整的移动  Web 应用。</p>
<p>结束语</p>
<p>移动 Web 应用是当前一个很热的话题。它们是一种为许多不同设备的用户提供服务的方法。 它们利用浏览器之间最高层次的标准化，这是 Web  开发人员最愿意看到的。在本文中， 我们了解了开发一个基于 Ajax 的移动 Web 应用所需要的重要技术。而且，通过 Ajax，  我们能够利用手机浏览器的最前沿技术。通过浏览本文中的示例代码， 我们知道在页面被请求时我们可以在服务器上生成所有的 HTML。然而，通过将所有  UI 放在客户端和使用 Ajax 从服务器获取数据，我们可以简单地将数据缓存到客户端， 甚至实现应用的脱机工作方式。</p>
<hr />
<p>© <a href="http://www.iwanna.cn">我想网</a> Akon 所有 , 2010. |
<a href="http://www.iwanna.cn/archives/2010/08/12/4919/">永久链接</a> |
<a href="http://www.iwanna.cn/archives/2010/08/12/4919/#comments">没有评论</a> |
提交到
<a rel="nofollow" target="_blank" href="http://www.google.com/reader/view/feed/http://www.iwanna.cn/archives/2010/08/12/4919/">Google Reader</a>
<a rel="nofollow" target="_blank" href="http://www.xianguo.com/subscribe.php?url=http://www.iwanna.cn/archives/2010/08/12/4919/">鲜果</a>
<a rel="nofollow" target="_blank" href="http://www.zhuaxia.com/add_channel.php?url=http://www.iwanna.cn/archives/2010/08/12/4919/">抓虾</a>
<hr />
<script type="text/javascript"><!--
google_ad_client = "pub-2057344547305288";
/* 336x280,iwanna feed,created 10/3/10 */
google_ad_slot = "9738886183";
google_ad_width = 336;
google_ad_height = 280;
//-->
</script>
<script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script>
<hr />
</p>
<p><small>Feed enhanced by <a href='http://planetozh.com/blog/my-projects/wordpress-plugin-better-feed-rss/'>Better Feed</a> from  <a href='http://planetozh.com/blog/'>Ozh</a></small></p>
]]></content:encoded>
			<wfw:commentRss>http://www.iwanna.cn/archives/2010/08/12/4919/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>jQuery中的AJAX全局事件详解</title>
		<link>http://www.iwanna.cn/archives/2010/08/10/4888/</link>
		<comments>http://www.iwanna.cn/archives/2010/08/10/4888/#comments</comments>
		<pubDate>Tue, 10 Aug 2010 04:57:34 +0000</pubDate>
		<dc:creator>seasun</dc:creator>
				<category><![CDATA[Ajax]]></category>
		<category><![CDATA[JQuery]]></category>
		<category><![CDATA[Tutorial]]></category>

		<guid isPermaLink="false">http://www.iwanna.cn/?p=4888</guid>
		<description><![CDATA[jQuery在AJAX方面是非常强大和方便的，以下是jQuery进行AJAX请求时方法模板： $.ajax({ type: &#8220;get&#8221;, url: &#8220;&#8221;, data : {}, beforeSend : function(){ }, success : function(data){ }, complete : function(){ } }); 关于$.ajax()方法的使用，不是明河写这篇文章的目的，今天明河主要讲解当进行AJAX请求时整个完整的事件流程。 jquery的AJAX方法的全部全局事件： ajaxStart：ajax请求开始前 ajaxSend：ajax请求时 ajaxSuccess：ajax获取数据后 ajaxComplete：ajax请求完成时 ajaxError：ajax请求发生错误后 ajaxStop：ajax请求停止后 当你使用jquery的ajax方法,不管是$.ajax()、$.get()、$.load()、$.getJSON()等都会默认触发全局事件，只是通常不绑定全局事件，但实际上这些全局事件非常有用处。 ajax方法的全局事件的用处 ajax全局事件，有个典型的应用场合： 你的页面存在多个甚至为数不少的ajax请求，但是这些ajax请求都有相同的消息机制。ajax请求开始前显示一个提示框，提示“正在读取数据“；ajax请求成功时提示框显示“数据获取成功”；ajax请求结束后隐藏提示框。 不使用全局事件的做法是： 给$.ajax()加上beforeSend、success、complete回调函数，在回调函数中加上处理提示框。 使用全局事件的做法是： $(document).ajaxStart(onStart) .ajaxComplete(onComplete) .ajaxSuccess(onSuccess); function onStart(event) { //&#8230;.. } function onComplete(event, xhr, settings) { //&#8230;.. } function onSuccess(event, xhr, [...]]]></description>
			<content:encoded><![CDATA[<p>jQuery在AJAX方面是非常强大和方便的，以下是jQuery进行AJAX请求时方法模板：</p>
<ol>
<li>$.<a href="http://www.iwanna.cn/tags/ajax/" class="st_tag internal_tag" rel="tag" title="标签 Ajax 下的日志">ajax</a>({</li>
<li> type: &#8220;get&#8221;,</li>
<li> url: &#8220;&#8221;,</li>
<li> data : {},</li>
<li> beforeSend : function(){</li>
<li></li>
<li> },</li>
<li> success : function(data){</li>
<li></li>
<li> },</li>
<li> complete : function(){</li>
<li></li>
<li> }</li>
<li> });</li>
</ol>
<p><span id="more-4888"></span><br />
关于$.ajax()方法的使用，不是明河写这篇文章的目的，今天明河主要讲解当进行AJAX请求时整个完整的事件流程。</p>
<h4>jquery的AJAX方法的全部全局事件：</h4>
<ul>
<li>ajaxStart：ajax请求开始前</li>
<li>ajaxSend：ajax请求时</li>
<li>ajaxSuccess：ajax获取数据后</li>
<li>ajaxComplete：ajax请求完成时</li>
<li>ajaxError：ajax请求发生错误后</li>
<li>ajaxStop：ajax请求停止后</li>
</ul>
<p>当你使用jquery的ajax方法,不管是$.ajax()、$.get()、$.load()、$.getJSON()等都会默认触发全局事件，只是通常不绑定全局事件，但实际上这些全局事件非常有用处。</p>
<h4>ajax方法的全局事件的用处</h4>
<p>ajax全局事件，有个典型的应用场合：<br />
你的页面存在多个甚至为数不少的ajax请求，但是这些ajax请求都有相同的消息机制。ajax请求开始前显示一个提示框，提示“正在读取数据“；ajax请求成功时提示框显示“数据获取成功”；ajax请求结束后隐藏提示框。<br />
<strong>不使用全局事件的做法是：</strong><br />
给$.ajax()加上beforeSend、success、complete回调函数，在回调函数中加上处理提示框。<br />
<strong>使用全局事件的做法是：</strong></p>
<ol>
<li>$(document).ajaxStart(onStart)</li>
<li> .ajaxComplete(onComplete)</li>
<li> .ajaxSuccess(onSuccess);</li>
<li></li>
<li> function onStart(event) {</li>
<li> //&#8230;..</li>
<li> }</li>
<li> function onComplete(event, xhr, settings) {</li>
<li> //&#8230;..</li>
<li> }</li>
<li> function onSuccess(event, xhr, settings) {</li>
<li> //&#8230;..</li>
<li> }</li>
</ol>
<h4>ajax方法完整事件流</h4>
<p>为了更直观的说明，明河使用Axure画了二个流程图，画的不好还请见谅，O(∩_∩)O<br />
<a href="http://www.iwanna.cn/" alt="我想网" target="_blank"><img title="ajax-events-1" src="http://images.uheed.com/iwanna/2010/08/10/ajax-events-1.png" alt="" width="601" height="277" /></a><br />
<a href="http://www.iwanna.cn/" alt="我想网" target="_blank"><img title="ajax-events-2" src="http://images.uheed.com/iwanna/2010/08/10/ajax-events-2.png" alt="" width="600" height="281" /></a></p>
<h4>AJAX方法完整事件流演示</h4>
<p>为了让朋友更容易理解整个事件流，明河做了以下demo。</p>
<ul>
<li class="l"><a href="http://www.iwanna.cn/examples/js/jqueryAjax/" class="btn-view-demo" target="_blank">查看示例</a></li>
<li class="l"><a href="http://www.iwanna.cn/examples/js/jqueryAjax/jqueryAjax.rar" title="jQuery中的AJAX方面的方法所触发的完整事件流演示" class="btn-download">点此下载</a></li>
</ul>
<hr />
<p>© <a href="http://www.iwanna.cn">我想网</a> Akon 所有 , 2010. |
<a href="http://www.iwanna.cn/archives/2010/08/10/4888/">永久链接</a> |
<a href="http://www.iwanna.cn/archives/2010/08/10/4888/#comments">没有评论</a> |
提交到
<a rel="nofollow" target="_blank" href="http://www.google.com/reader/view/feed/http://www.iwanna.cn/archives/2010/08/10/4888/">Google Reader</a>
<a rel="nofollow" target="_blank" href="http://www.xianguo.com/subscribe.php?url=http://www.iwanna.cn/archives/2010/08/10/4888/">鲜果</a>
<a rel="nofollow" target="_blank" href="http://www.zhuaxia.com/add_channel.php?url=http://www.iwanna.cn/archives/2010/08/10/4888/">抓虾</a>
<hr />
<script type="text/javascript"><!--
google_ad_client = "pub-2057344547305288";
/* 336x280,iwanna feed,created 10/3/10 */
google_ad_slot = "9738886183";
google_ad_width = 336;
google_ad_height = 280;
//-->
</script>
<script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script>
<hr />
</p>
<p><small>Feed enhanced by <a href='http://planetozh.com/blog/my-projects/wordpress-plugin-better-feed-rss/'>Better Feed</a> from  <a href='http://planetozh.com/blog/'>Ozh</a></small></p>
]]></content:encoded>
			<wfw:commentRss>http://www.iwanna.cn/archives/2010/08/10/4888/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>使用框架建立富联网应用</title>
		<link>http://www.iwanna.cn/archives/2010/07/27/4752/</link>
		<comments>http://www.iwanna.cn/archives/2010/07/27/4752/#comments</comments>
		<pubDate>Tue, 27 Jul 2010 13:41:38 +0000</pubDate>
		<dc:creator>seasun</dc:creator>
				<category><![CDATA[Adobe]]></category>
		<category><![CDATA[Ajax]]></category>
		<category><![CDATA[Flash]]></category>
		<category><![CDATA[Flex]]></category>
		<category><![CDATA[HTML]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[JQuery]]></category>
		<category><![CDATA[MooTools]]></category>
		<category><![CDATA[Technology]]></category>
		<category><![CDATA[YUI]]></category>
		<category><![CDATA[RIA]]></category>
		<category><![CDATA[Silverlight]]></category>

		<guid isPermaLink="false">http://www.iwanna.cn/?p=4752</guid>
		<description><![CDATA[JavaScript库，ICEfaces，Adobe Flash，微软Silverlight，现在还有HTML5，全球性的网络支配地位的竞争已经进入了崭新的时代——一个富网络应用（简称RIA，中文也 有叫富互联网应用）的时代。本文目的是界定什么是RIA，解释为何网络已经开始向RIA靠拢，探索今天已经存在的不同RIA框架，对每个框架作出一些优点和缺点的概述，并讨论这些新技术在未来将是怎么样的生存态。 RIA是何物? 所谓RIA，或者说富网络网应用，就是指可以像桌面程序一样操作的网络应用。 在RIA冒出来之前，大多数的网络应用都是静态的页面构建的。 Sumo Paint 是一个基于Flash的RIA, 具有像Photoshop一样的图形编辑功能。 跟桌面应用程序不同，任何一个网页的互动往往需要重新加载一个全新的页面。而桌面应用程序，在另一方面，有很多更好的用户交互性，因为所有处理都是在用户的机器本身，所以能给以更加无缝的用户体验。 因此，软件开发商开始问自己，“我们产品应该是一个桌面应用程序还是一个Web应用程序呢？” 这一直是一个公平的问题，因为这两种类型的应用程序都具有各自优点和缺点。 桌面应用程序具有流畅的用户交互性，但软件是售出去的，会遇到发布和更新的问题。 Web应用程序，另一方面，很容易从网上获得，摆脱相关的软件发布和更新的问题，但在用户交互性体验非常差。 因此，怎么样才能两全其美呢？ RIA就是两全其美。RIA通过网络发布，有非常丰富的用户交互。得益于Ajax的出现，一个无需刷新就可以发送服务器请求的网络应用的方法，新技术出现，加入了RIA的运动。 基于这些技术出现了一些框架，帮助开发人员构建和部署富网络应用程序，如JavaScript库，ICEfaces，Adobe Flash 4（Flex 3前身），微软Silverlight，以及HTML5的。 让我们来一个个探讨RIA的框架。 网络应用的JavaScript库 JavaScript库，例如 jQuery和MooTools 是首批技术之一，可以真正的帮助部署流畅和互动的富网络应用。它们提供通过杠杆客户端脚本来处理前端接口功能的RIA框架。它们是一些基本的 Javascript文件，由一些有用的，经过跨浏览器测试功能的集成。可以使用Ajax，以及处理普通的基于用户驱动事件的交互，如显示和隐藏内容。 目前最流行的有jQuery（尤其是使用jQuery UI），MooTools，YIU（雅虎用户界面库），以及EXTJS。这些库包括RIA组件，如网格，图表和复杂的表单元素，以及处理Ajax的工具。最引人入胜的是，大部分网络开发的JavaScript库都是开源的。 如果你不想购买一个集成开发环境（IDE），但仍希望在自己的网站绚丽而专业的RIA功能，JavaScript库是一个很不错的选择。 使用JavaScript库的网站有Google，Digg，雅虎，亚马逊，微软，Twitter，以及Best Buy。 ICEfaces ICEfaces是标准的JavaServer Faces（JSF）的框架的扩展，旨在去除方程中的JavaScript从而简化程序员的工作流程。换句话说，ICEfaces通过Java应用接口为你处理了所有的JavaScript/Ajax。通过删除这些自定义JavaScript函数的复杂引入，大大简化了创建富网络应用的任务。 如果你的团队主要成员是Java开发人员，或者如果你的网络应用程序不需要其它ICEfaces没有的复杂组件，又或者如果你的网络应用程序是事件驱动的，那么使用ICEfaces是很好的选择。如果你的网路应用是事件驱动的，请确定你已经了解ICEfaces不提供真正的“服务器推”技术的，HTML5，Flash Builder 4和Silverlight都支持的。不过，相应地ICEfaces使用长轮询的方法来模拟服务器推技术。 使用ICEfaces的网站有波音，美国航空航天局，联合太平洋公司，T-Mobile，以及美国银行。 Adobe Flash Builder 4 Flash已经出现了很长一段时间，但是用使用Flash来构建整个网络应用十分麻烦，直到Flex的引进，这是Flash的一个扩展，提供RIA网络组 件。 Adobe Flash Builder 4最令人兴奋的是它的跨平台和跨浏览器特性，允许程序在所有的操作系统和所有的浏览器上以同样的方式运行。相比于JavaScript，浏览器有不同的 JavaScript引擎管理和处理的代码，而Adobe的Flash只有一个引擎，用户通过Adobe Flash浏览器插件来安装（通常的情况是他们有了）。 Flash Builder 4 应用之所以能如此，因为它们已经嵌入到HTML页面，这意味着浏览器本身并没有对应用程序的性能有什么影响。这意味着你如果你乐意， [...]]]></description>
			<content:encoded><![CDATA[<p><strong>JavaScript库，ICEfaces，<a href="http://www.iwanna.cn/tags/adobe/" class="st_tag internal_tag" rel="tag" title="标签 Adobe 下的日志">Adobe</a>  <a href="http://www.iwanna.cn/tags/flash/" class="st_tag internal_tag" rel="tag" title="标签 Flash 下的日志">Flash</a>，微软Silverlight，现在还有HTML5，全球性的网络支配地位的竞争已经进入了崭新的时代——一个富网络应用（简称RIA，中文也 有叫富互联网应用）的时代。</strong>本文目的是界定什么是RIA，解释为何网络已经开始向RIA靠拢，探索今天已经存在的不同RIA框架，对每个框架作出一些优点和缺点的概述，并讨论这些新技术在未来将是怎么样的生存态。<br />
<a href="http://sixrevisions.com/web-development/building-rich-internet-applications-with-frameworks/"><img src="http://images.uheed.com/iwanna/2010/07/27/13151901685270962.png" alt="Building Rich Internet Applications with Frameworks" width="550" height="200" /></a><br />
<span id="more-4752"></span><br />
<strong>RIA是何物?</strong></p>
<p>所谓RIA，或者说富网络网应用，就是指可以像桌面程序一样操作的网络应用。 在RIA冒出来之前，大多数的网络应用都是静态的页面构建的。<br />
<a href="http://www.iwanna.cn/" target="_blank"><img src="http://images.uheed.com/iwanna/2010/07/27/1315421675113898.png" alt="What's an RIA?" width="550" height="420" /></a><br />
<a href="http://www.sumopaint.com/app/">Sumo Paint</a> 是一个基于Flash的RIA,  具有像Photoshop一样的图形编辑功能。</p>
<p>跟桌面应用程序不同，任何一个网页的互动往往需要重新加载一个全新的页面。而桌面应用程序，在另一方面，有很多更好的用户交互性，因为所有处理都是在用户的机器本身，所以能给以更加无缝的用户体验。</p>
<p>因此，软件开发商开始问自己，“我们产品应该是一个桌面应用程序还是一个Web应用程序呢？”</p>
<p>这一直是一个公平的问题，因为这两种类型的应用程序都具有各自优点和缺点。</p>
<p>桌面应用程序具有流畅的用户交互性，但软件是售出去的，会遇到发布和更新的问题。</p>
<p>Web应用程序，另一方面，很容易从网上获得，摆脱相关的软件发布和更新的问题，但在用户交互性体验非常差。</p>
<p>因此，怎么样才能两全其美呢？</p>
<p>RIA就是两全其美。RIA通过网络发布，有非常丰富的用户交互。得益于Ajax的出现，一个无需刷新就可以发送服务器请求的网络应用的方法，新技术出现，加入了RIA的运动。</p>
<p>基于这些技术出现了一些框架，帮助开发人员构建和部署富网络应用程序，如JavaScript库，ICEfaces，Adobe Flash 4（Flex 3前身），微软Silverlight，以及HTML5的。</p>
<p>让我们来一个个探讨RIA的框架。</p>
<p><strong>网络应用的JavaScript库</strong></p>
<p>JavaScript库，例如 jQuery和MooTools 是首批技术之一，可以真正的帮助部署流畅和互动的富网络应用。它们提供通过杠杆客户端脚本来处理前端接口功能的RIA框架。它们是一些基本的 Javascript文件，由一些有用的，经过跨浏览器测试功能的集成。可以使用Ajax，以及处理普通的基于用户驱动事件的交互，如显示和隐藏内容。</p>
<p>目前最流行的有jQuery（尤其是使用jQuery UI），MooTools，YIU（雅虎用户界面库），以及EXTJS。这些库包括RIA组件，如网格，图表和复杂的表单元素，以及处理Ajax的工具。最引人入胜的是，大部分网络开发的JavaScript库都是开源的。</p>
<p>如果你不想购买一个集成开发环境（IDE），但仍希望在自己的网站绚丽而专业的RIA功能，JavaScript库是一个很不错的选择。</p>
<p>使用JavaScript库的网站有Google，Digg，雅虎，亚马逊，微软，Twitter，以及Best Buy。</p>
<p><strong>ICEfaces</strong></p>
<p>ICEfaces是标准的JavaServer Faces（JSF）的框架的扩展，旨在去除方程中的JavaScript从而简化程序员的工作流程。换句话说，ICEfaces通过Java应用接口为你处理了所有的JavaScript/Ajax。通过删除这些自定义JavaScript函数的复杂引入，大大简化了创建富网络应用的任务。</p>
<p>如果你的团队主要成员是Java开发人员，或者如果你的网络应用程序不需要其它ICEfaces没有的复杂组件，又或者如果你的网络应用程序是事件驱动的，那么使用ICEfaces是很好的选择。如果你的网路应用是事件驱动的，请确定你已经了解ICEfaces不提供真正的“服务器推”技术的，<a href="http://www.iwanna.cn/tags/html/" class="st_tag internal_tag" rel="tag" title="标签 HTML 下的日志">HTML</a>5，Flash Builder 4和Silverlight都支持的。不过，相应地ICEfaces使用长轮询的方法来模拟服务器推技术。</p>
<p>使用ICEfaces的网站有波音，美国航空航天局，联合太平洋公司，T-Mobile，以及美国银行。</p>
<p><strong>Adobe Flash Builder 4</strong></p>
<p>Flash已经出现了很长一段时间，但是用使用Flash来构建整个网络应用十分麻烦，直到Flex的引进，这是Flash的一个扩展，提供RIA网络组 件。</p>
<p>Adobe Flash Builder  4最令人兴奋的是它的跨平台和跨浏览器特性，允许程序在所有的操作系统和所有的浏览器上以同样的方式运行。相比于JavaScript，浏览器有不同的 JavaScript引擎管理和处理的代码，而Adobe的Flash只有一个引擎，用户通过Adobe  Flash浏览器插件来安装（通常的情况是他们有了）。</p>
<p>Flash Builder 4  应用之所以能如此，因为它们已经嵌入到HTML页面，这意味着浏览器本身并没有对应用程序的性能有什么影响。这意味着你如果你乐意，  你还可以在IE6上运行最复杂的网络应用程序。（这当然简单，因为Flash插件/引擎经常会更新，因此只是稍微依赖于用户插件的版本）。</p>
<p>这些应用通常是伴随着服务器端处理，比如一个Java后端处理，而且需要Flash Builder 4IDE做开发。</p>
<p>如果你的团队主要是Java开发（因为搭配Java运作良好），或者你的应用程序使用事件驱动的构架，可以选择Adobe Flash Builder  4。</p>
<p>使用Flash作为网络应用程序的网站有Mint.com，Flickr和Hyundai。</p>
<p><strong><a href="http://www.iwanna.cn/tags/silverlight/" class="st_tag internal_tag" rel="tag" title="标签 Silverlight 下的日志">Silverlight</a></strong></p>
<p>Silverlight是基本上微软版本的Adobe Flex /的Adobe Flash。现在已获得了一些吸引力，但似乎并没有达到的Adobe  Flash的普及程度。</p>
<p>Silverlight应用程序明显约束于.NET的后端，因为它是微软的产品。这意味着，你不得不 Silverlight /.NET 和Adobe  Flex / [一些服务器端脚本，如PHP] 之间整合考虑。</p>
<p>如果你的网络应用需要复杂的图形，或者如果你的团队主要是.NET开发人员，又或者如果你的应用程序使用事件驱动的架构，那你可以选择 Silverlight。</p>
<p>使用Silverlight的网站，如Netflix。</p>
<p><strong>HTML5</strong></p>
<p>HTML5的是RIA运动中的最新发展。  HTML5，在本质上是HTML4，<a href="http://www.iwanna.cn/tags/javascript/" class="st_tag internal_tag" rel="tag" title="标签 JavaScript 下的日志">JavaScript</a>，CSS，Javascript代码库以及Falsh的最优合并，利用API模型成为一个单一规 范。 HTML5的是一个开放的技术，这意味着不会有单一的主管团体如Flash的Adobe或Silverlight的微软。</p>
<p>由于HTML5规范还没有完成，IE9尚未发布，要建立产品级的网络应用，你还需要等待一点点时间。</p>
<p>目前，所有主要浏览器除了IE8都支持HTML5。由于IE8的浏览器市场占据了主要部分，在IE9发布之前，HTML5实在难以成为主流。</p>
<p>一旦HTML5得到广泛支持，如果你不想购买和学习的IDE（像Flex和Silverlight框架所必需的），如果你的应用程序使用事件驱动架构，或 者如果你喜欢使用内置的HTML功能和JavaScript API 功能而不是使用第三方JavaScript库，那么使用HTML是很好的选择。</p>
<p>尽管HTML5中可以很好地处理图形，但是使用Flash和Silverlight来处理复杂图形和动画在目前仍然容易/更快的选择。</p>
<p><strong><a href="http://www.iwanna.cn/tags/ria/" class="st_tag internal_tag" rel="tag" title="标签 RIA 下的日志">RIA</a> 的未来</strong><br />
<a href="http://www.iwanna.cn/" target="_blank"><img src="http://images.uheed.com/iwanna/2010/07/27/13154422012391927.jpg" alt="使用框架建立富联网应用 | iwanna.cn 我想网" /></a></p>
<p>HTML5应用程序是互联网的未来吗？不完全是。只要那些创造性和创新性的网络开发人员还在不断的去创造一些特别的东西，就会总是出现一些新技术可以造出 些HTML5或其他任何网络技术无法完成的神奇的东西。</p>
<p>JavaScript库，ICEfaces，Flash，Silverlight和HTML5的存在首要原因是其创造力和创新性。未来的网络将会由许多 共存的技术组成，就像现在。</p>
<hr />
<p>© <a href="http://www.iwanna.cn">我想网</a> Akon 所有 , 2010. |
<a href="http://www.iwanna.cn/archives/2010/07/27/4752/">永久链接</a> |
<a href="http://www.iwanna.cn/archives/2010/07/27/4752/#comments">没有评论</a> |
提交到
<a rel="nofollow" target="_blank" href="http://www.google.com/reader/view/feed/http://www.iwanna.cn/archives/2010/07/27/4752/">Google Reader</a>
<a rel="nofollow" target="_blank" href="http://www.xianguo.com/subscribe.php?url=http://www.iwanna.cn/archives/2010/07/27/4752/">鲜果</a>
<a rel="nofollow" target="_blank" href="http://www.zhuaxia.com/add_channel.php?url=http://www.iwanna.cn/archives/2010/07/27/4752/">抓虾</a>
<hr />
<script type="text/javascript"><!--
google_ad_client = "pub-2057344547305288";
/* 336x280,iwanna feed,created 10/3/10 */
google_ad_slot = "9738886183";
google_ad_width = 336;
google_ad_height = 280;
//-->
</script>
<script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script>
<hr />
</p>
<p><small>Feed enhanced by <a href='http://planetozh.com/blog/my-projects/wordpress-plugin-better-feed-rss/'>Better Feed</a> from  <a href='http://planetozh.com/blog/'>Ozh</a></small></p>
]]></content:encoded>
			<wfw:commentRss>http://www.iwanna.cn/archives/2010/07/27/4752/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Ajax跨域访问解决方案</title>
		<link>http://www.iwanna.cn/archives/2010/07/12/4478/</link>
		<comments>http://www.iwanna.cn/archives/2010/07/12/4478/#comments</comments>
		<pubDate>Mon, 12 Jul 2010 13:54:07 +0000</pubDate>
		<dc:creator>seasun</dc:creator>
				<category><![CDATA[Ajax]]></category>
		<category><![CDATA[JavaScript]]></category>

		<guid isPermaLink="false">http://www.iwanna.cn/?p=4478</guid>
		<description><![CDATA[ajax本身实际上是通过XMLHttpRequest对象来进行数据的交互，而浏览器出于安全考虑，不允许js代码进行跨域操作，所以就诞生了很 多跨域的解决方案。当本域和子域间进行访问时最简单的就是设置document.domain，当不同域的访问，大概有下列方法： 1.web端代理的方式，即用户访问A网站时所产生的对B网站的跨域访问请求均提交到A网站的指定页面，由该页 面代替用户页面完成交互，从而返回合适的结果。 2.iframe，解决方案就是用window.location对象的hash属性，利用JS改变hash值 网页不会刷新，可以这样实现通过JS访问hash值来做到通信，大体就是AB网站各嵌入一个对方网站的iframe，然后通过连续不断的监听hash值的 变化来进行通信。比如A网站通过改变B网站iframe的hash后，B网站监听到hash的变化后就进行处理，这种方式需要开发者可以控制两个网站的代 码。 3.通过script标签来请求，原理就是在本域内的A内生成一个JS标签，它的SRC指向请求的另外一个域的 某个页面B，这个src里面通常会加一个A页面定义好的回调函数，B返回数据即可，可以直接返回调用这个回调函数，这种跨域的通信方式被称为JSONP， 此方案存在的缺陷是， script的src属性完成该调用时采取的方式时get方式，如果请求时传递的字符串过大时，可能会无法正常运行。 4.window.name，window.name是一种解决跨域数据传输的新技术，通过在iframe中加 载一个跨域的HTML文件，并且在HTML文件中设置window.name的值为需要传给接受者的数据，接收者就可以取得到window.name的值 并且返回，比较关键的是同源策略的影响对location的控制不受限制，所以需要加载一个代理的页面来让发送页面读取window.name. 5.使用flash，原理是JavaScript将数据提交给本域下的 Flash，通过 Flash 中转去访问其他域的接口，只需要其他域的根目录下有一个crossdomain.xml文件，文件中设置允许所有域名或允许本域访问即可。 了解更多，请看： http://www.phpchina.com/html/48/n-33848.html http://www.sitepen.com/blog/2008/07/22/windowname-transport/ http://www.planabc.net/2008/09/01/window_name_transport/ http://hikejun.com/demo/windowname/demo_windowname.html http://blog.s135.com/ajaxcdr/ © 我想网 Akon 所有 , 2010. &#124; 永久链接 &#124; 没有评论 &#124; 提交到 Google Reader 鲜果 抓虾 Feed enhanced by Better Feed from Ozh]]></description>
			<content:encoded><![CDATA[<p>ajax本身实际上是通过XMLHttpRequest对象来进行数据的交互，而浏览器出于安全考虑，不允许js代码进行跨域操作，所以就诞生了很 多跨域的解决方案。当本域和子域间进行访问时最简单的就是设置<strong>document.domain</strong>，当不同域的访问，大概有下列方法：</p>
<p><strong>1.web端代理的方式，</strong>即用户访问A网站时所产生的对B网站的跨域访问请求均提交到A网站的指定页面，由该页 面代替用户页面完成交互，从而返回合适的结果。</p>
<p><strong>2.iframe，</strong>解决方案就是用window.location对象的hash属性，利用JS改变hash值 网页不会刷新，可以这样实现通过JS访问hash值来做到通信，大体就是AB网站各嵌入一个对方网站的iframe，然后通过连续不断的监听hash值的 变化来进行通信。比如A网站通过改变B网站iframe的hash后，B网站监听到hash的变化后就进行处理，这种方式需要开发者可以控制两个网站的代 码。<br />
<span id="more-4478"></span><br />
<strong>3.通过script标签来请求，</strong>原理就是在本域内的A内生成一个JS标签，它的SRC指向请求的另外一个域的 某个页面B，这个src里面通常会加一个A页面定义好的回调函数，B返回数据即可，可以直接返回调用这个回调函数，这种跨域的通信方式被称为JSONP， 此方案存在的缺陷是， script的src属性完成该调用时采取的方式时get方式，如果请求时传递的字符串过大时，可能会无法正常运行。</p>
<p><strong>4.window.name，</strong>window.name是一种解决跨域数据传输的新技术，通过在iframe中加 载一个跨域的HTML文件，并且在HTML文件中设置window.name的值为需要传给接受者的数据，接收者就可以取得到window.name的值 并且返回，比较关键的是同源策略的影响对location的控制不受限制，所以需要加载一个代理的页面来让发送页面读取window.name.</p>
<p><strong>5.使用flash，</strong>原理是JavaScript将数据提交给本域下的 <a href="http://www.iwanna.cn/tags/flash/" class="st_tag internal_tag" rel="tag" title="标签 Flash 下的日志">Flash</a>，通过 <a href="http://www.iwanna.cn/tags/flash/" class="st_tag internal_tag" rel="tag" title="标签 Flash 下的日志">Flash</a>   中转去访问其他域的接口，只需要其他域的根目录下有一个crossdomain.xml文件，文件中设置允许所有域名或允许本域访问即可。</p>
<p>了解更多，请看：</p>
<p><a href="http://www.phpchina.com/html/48/n-33848.html" target="_blank">http://www.phpchina.com/html/48/n-33848.html</a></p>
<p><a href="http://www.sitepen.com/blog/2008/07/22/windowname-transport/" target="_blank">http://www.sitepen.com/blog/2008/07/22/windowname-transport/</a></p>
<p><a href="http://www.planabc.net/2008/09/01/window_name_transport/" target="_blank">http://www.planabc.net/2008/09/01/window_name_transport/</a></p>
<p><a href="http://hikejun.com/demo/windowname/demo_windowname.html" target="_blank">http://hikejun.com/demo/windowname/demo_windowname.html</a></p>
<p><a href="http://blog.s135.com/ajaxcdr/" target="_blank">http://blog.s135.com/ajaxcdr/</a></p>
<hr />
<p>© <a href="http://www.iwanna.cn">我想网</a> Akon 所有 , 2010. |
<a href="http://www.iwanna.cn/archives/2010/07/12/4478/">永久链接</a> |
<a href="http://www.iwanna.cn/archives/2010/07/12/4478/#comments">没有评论</a> |
提交到
<a rel="nofollow" target="_blank" href="http://www.google.com/reader/view/feed/http://www.iwanna.cn/archives/2010/07/12/4478/">Google Reader</a>
<a rel="nofollow" target="_blank" href="http://www.xianguo.com/subscribe.php?url=http://www.iwanna.cn/archives/2010/07/12/4478/">鲜果</a>
<a rel="nofollow" target="_blank" href="http://www.zhuaxia.com/add_channel.php?url=http://www.iwanna.cn/archives/2010/07/12/4478/">抓虾</a>
<hr />
<script type="text/javascript"><!--
google_ad_client = "pub-2057344547305288";
/* 336x280,iwanna feed,created 10/3/10 */
google_ad_slot = "9738886183";
google_ad_width = 336;
google_ad_height = 280;
//-->
</script>
<script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script>
<hr />
</p>
<p><small>Feed enhanced by <a href='http://planetozh.com/blog/my-projects/wordpress-plugin-better-feed-rss/'>Better Feed</a> from  <a href='http://planetozh.com/blog/'>Ozh</a></small></p>
]]></content:encoded>
			<wfw:commentRss>http://www.iwanna.cn/archives/2010/07/12/4478/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>10个Google 推动的 AJAX 库 API</title>
		<link>http://www.iwanna.cn/archives/2010/05/21/3284/</link>
		<comments>http://www.iwanna.cn/archives/2010/05/21/3284/#comments</comments>
		<pubDate>Fri, 21 May 2010 14:02:22 +0000</pubDate>
		<dc:creator>seasun</dc:creator>
				<category><![CDATA[Ajax]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Google]]></category>

		<guid isPermaLink="false">http://www.iwanna.cn/?p=3284</guid>
		<description><![CDATA[我们知道，Google在奉行他们一贯不作恶的行为之外，也在为互联网的发展起着不可估量的促进作用。作为一名web开发者，想必在您碰到无法解决的问题时，肯定会想到从http://code.google.com/ 去寻找解决方案，在使用的同时，不知您是否有发现，在页面的左边导航栏中标识有“开发人员资源”栏目。遵循这以导航，您会发现API 和开发人员工具链接。进去之后在Google所提供的产品中有标识AJAX菜单。如下图所示： 从图中圈出来的按钮点进去之后，您就会发现AJAX 库 API栏目。这里有Google支持的 AJAX 库 API所有栏目。 这里给大家列出的是比较常用的 AJAX 库 API 外链地址。 jquery &#60;script src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js"&#62;&#60;/script&#62; jquery UI &#60;script src="http://ajax.googleapis.com/ajax/libs/jqueryui/1.8.1/jquery-ui.min.js"&#62;&#60;/script&#62; Chrome Frame &#60;script src="http://ajax.googleapis.com/ajax/libs/chrome-frame/1.0.2/CFInstall.min.js"&#62;&#60;/script&#62; swfobject &#60;script src="http://ajax.googleapis.com/ajax/libs/swfobject/2.2/swfobject.js"&#62;&#60;/script&#62; mootools &#60;script src="http://ajax.googleapis.com/ajax/libs/mootools/1.2.4/mootools-yui-compressed.js"&#62;&#60;/script&#62; Yahoo! UI &#60;script src="http://ajax.googleapis.com/ajax/libs/yui/2.8.1/build/yuiloader/yuiloader-min.js"&#62;&#60;/script&#62; Prototype &#60;script src="http://ajax.googleapis.com/ajax/libs/prototype/1.6.1.0/prototype.js"&#62;&#60;/script&#62; Ext.JS &#60;script src="http://ajax.googleapis.com/ajax/libs/ext-core/3.1.0/ext-core.js"&#62;&#60;/script&#62; Dojo &#60;script src="http://ajax.googleapis.com/ajax/libs/dojo/1.4.3/dojo/dojo.xd.js"&#62;&#60;/script&#62; Scriptaculous &#60;script src="http://ajax.googleapis.com/ajax/libs/scriptaculous/1.8.3/scriptaculous.js"&#62;&#60;/script&#62; © 我想网 Akon 所有 , 2010. &#124; 永久链接 [...]]]></description>
			<content:encoded><![CDATA[<p>我们知道，Google在奉行他们一贯不作恶的行为之外，也在为互联网的发展起着不可估量的促进作用。作为一名web开发者，想必在您碰到无法解决的问题时，肯定会想到从<a href="http://code.google.com/">http://code.google.com/</a> 去寻找解决方案，在使用的同时，不知您是否有发现，在页面的左边导航栏中标识有“<strong>开发人员资源</strong>”栏目。遵循这以导航，您会发现<strong><a href="http://code.google.com/more/">API 和开发人员工具</a></strong>链接。进去之后在Google所提供的产品中有标识AJAX菜单。如下图所示：<br />
<img src="http://i709.photobucket.com/albums/ww92/zsmin/iwanna/Article/201005/Google-AJAX-API.jpg" alt="10个Google 推动的 AJAX 库 API" /><br />
从图中圈出来的按钮点进去之后，您就会发现<strong><a href="http://code.google.com/intl/zh-CN/apis/ajaxlibs/">AJAX 库 API</a></strong>栏目。这里有Google支持的 <a href="http://www.iwanna.cn/tags/ajax/" class="st_tag internal_tag" rel="tag" title="标签 Ajax 下的日志">AJAX</a> 库 API所有栏目。<br />
这里给大家列出的是<strong><a href="http://www.iwanna.cn/archives/2010/05/21/3284/" title="10个Google 推动的 AJAX 库 API">比较常用的 AJAX 库 API 外链地址</a></strong>。<br />
<span id="more-3284"></span></p>
<h2><a href="http://www.iwanna.cn/tags/jquery/" class="st_tag internal_tag" rel="tag" title="标签 JQuery 下的日志">jquery</a></h2>
<pre>&lt;script src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js"&gt;&lt;/script&gt;</pre>
<h2>jquery UI</h2>
<pre>&lt;script src="http://ajax.googleapis.com/ajax/libs/jqueryui/1.8.1/jquery-ui.min.js"&gt;&lt;/script&gt;</pre>
<h2>Chrome Frame</h2>
<pre>&lt;script src="http://ajax.googleapis.com/ajax/libs/chrome-frame/1.0.2/CFInstall.min.js"&gt;&lt;/script&gt;</pre>
<h2>swfobject</h2>
<pre>&lt;script src="http://ajax.googleapis.com/ajax/libs/swfobject/2.2/swfobject.js"&gt;&lt;/script&gt;</pre>
<h2><a href="http://www.iwanna.cn/tags/mootools/" class="st_tag internal_tag" rel="tag" title="标签 Mootools 下的日志">mootools</a></h2>
<pre>&lt;script src="http://ajax.googleapis.com/ajax/libs/mootools/1.2.4/mootools-yui-compressed.js"&gt;&lt;/script&gt;</pre>
<h2>Yahoo! UI</h2>
<pre>&lt;script src="http://ajax.googleapis.com/ajax/libs/yui/2.8.1/build/yuiloader/yuiloader-min.js"&gt;&lt;/script&gt;</pre>
<h2>Prototype</h2>
<pre>&lt;script src="http://ajax.googleapis.com/ajax/libs/prototype/1.6.1.0/prototype.js"&gt;&lt;/script&gt;</pre>
<h2>Ext.JS</h2>
<pre>&lt;script src="http://ajax.googleapis.com/ajax/libs/ext-core/3.1.0/ext-core.js"&gt;&lt;/script&gt;</pre>
<h2><a href="http://www.iwanna.cn/tags/dojo/" class="st_tag internal_tag" rel="tag" title="标签 Dojo 下的日志">Dojo</a></h2>
<pre>&lt;script src="http://ajax.googleapis.com/ajax/libs/dojo/1.4.3/dojo/dojo.xd.js"&gt;&lt;/script&gt;</pre>
<h2>Scriptaculous</h2>
<pre>&lt;script src="http://ajax.googleapis.com/ajax/libs/scriptaculous/1.8.3/scriptaculous.js"&gt;&lt;/script&gt;</pre>
<hr />
<p>© <a href="http://www.iwanna.cn">我想网</a> Akon 所有 , 2010. |
<a href="http://www.iwanna.cn/archives/2010/05/21/3284/">永久链接</a> |
<a href="http://www.iwanna.cn/archives/2010/05/21/3284/#comments">没有评论</a> |
提交到
<a rel="nofollow" target="_blank" href="http://www.google.com/reader/view/feed/http://www.iwanna.cn/archives/2010/05/21/3284/">Google Reader</a>
<a rel="nofollow" target="_blank" href="http://www.xianguo.com/subscribe.php?url=http://www.iwanna.cn/archives/2010/05/21/3284/">鲜果</a>
<a rel="nofollow" target="_blank" href="http://www.zhuaxia.com/add_channel.php?url=http://www.iwanna.cn/archives/2010/05/21/3284/">抓虾</a>
<hr />
<script type="text/javascript"><!--
google_ad_client = "pub-2057344547305288";
/* 336x280,iwanna feed,created 10/3/10 */
google_ad_slot = "9738886183";
google_ad_width = 336;
google_ad_height = 280;
//-->
</script>
<script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script>
<hr />
</p>
<p><small>Feed enhanced by <a href='http://planetozh.com/blog/my-projects/wordpress-plugin-better-feed-rss/'>Better Feed</a> from  <a href='http://planetozh.com/blog/'>Ozh</a></small></p>
]]></content:encoded>
			<wfw:commentRss>http://www.iwanna.cn/archives/2010/05/21/3284/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>AJAX是如何工作的: AJAX的10个实践运用</title>
		<link>http://www.iwanna.cn/archives/2009/07/08/1849/</link>
		<comments>http://www.iwanna.cn/archives/2009/07/08/1849/#comments</comments>
		<pubDate>Wed, 08 Jul 2009 13:32:06 +0000</pubDate>
		<dc:creator>seasun</dc:creator>
				<category><![CDATA[Ajax]]></category>
		<category><![CDATA[Flash]]></category>
		<category><![CDATA[Translate]]></category>
		<category><![CDATA[XMLHTTP]]></category>

		<guid isPermaLink="false">http://www.iwanna.cn/?p=1849</guid>
		<description><![CDATA[近几年，Ajax已变得越来越流行了，这使得网络应用程序变得越来越像是桌面应用程序。Ajax可以提供很多其它程序无法完成的额外的功能。 什么是 AJAX? 它是怎么工作的? 什么是Ajax？它是如何运作的？ Ajax是异步JavaScript脚本和 XML（Asynchronous JavaScript and XML）的缩写，用来使浏览器端应用程序和服务器端进行通信。在Ajax出现以前，浏览器端应用程序是无法直接和服务器进行通信的，只能使用刷新和加载页 面的方法来实现。而有了Ajax之后，浏览器和服务器端就可以自由通信了。 以下简述Ajax脚本的运行路径： 行为引发事件，如用户单击按钮； Ajax响应该事件，并使用XML向服务器发送请求； 服务器端程序（PHP、ASP或其他）接收到Ajax发来的数据并进行处理，从数据库中调用数据等； 服务器端再使用XML向客户端返回数据； 另外一个JavaScript函数，通常称之为回调函数，接收到服务器端发来的数据并据此更新页面。 本文将讨论我们如何通过不同的脚本来实现各种各样的功能。 1、登录表单 按传统的做法，用户登录时会被定向到一个登录页面，随后再返回登录前的页面。使用Ajax后，用户可以直接在原页面输入用户名和密码。Ajax会将 这些信息发送给服务器进行验证。服务器会返回数据告知浏览器是否验证通过，浏览器可相应地更新页面。Digg就有这样的登录表单。 示例：Digg.com （页面顶端） 插件：jQuery Form Plugin 2、自动完成 谷歌是最早开始使用Ajax的公司之一，其搜索建议功能则是最先使用Ajax的地方，并开发了第一个自动完成工具。在搜索框输入数据后，Ajax会 从服务器端接受数据，找出数据库中存储的常用搜索关键字并进行提示。自动完成功能是非常有用的，当表单可以输入多个可能的值时，显示一个下拉列表框供用户 选择，非常人性化。 示例：Google Search 插件：jq autocomplete 3、投票和排行 网页收藏站点如Digg、Reddit等往往会让用户来决定什么内容会放在首页，使用的方法便是投票。他们使用Ajax来实现这个功能，这样用户就能够方便快捷地表达自己的意见了。 示例：Reddit 4、使用用户内容更新 Twitter之所以流行的一大原因是其简单易用的界面。当用户发送了一个消息后，这条消息会立刻添加到用户的页面中，所有的相应内容都会进行更 新。最近，Twitter开始使用Ajax对“热门话题”进行更新。每隔几秒，我们就可以知道大家在忙些什么、关注些什么，非常快速。 示例：Twitter 5、表单的提交和验证 表单永远是最麻烦的东西，但Ajax让它们变得友好起来。Ajax可以派很多用处，从上面提到的自动完成功能，再到现在的表单验证和提交。有些网站使用Ajax检查用户输入的数据是否达到了某些要求，如密码长度或者E-mail地址、URL地址是否合法等 示例：10 Cool jQuery Form Plugins 6、聊天室和即时消息 在线聊天室在IRC之后多年才出现的只用应用。如今，聊天室和即时消息可以完全由浏览器来处理。在聊天室或即时消息应用程序中，Ajax通常要做两 件事情，可以想象一下你的耳朵和嘴巴。你的嘴巴要告诉服务器你发送了一条消息，而耳朵则要保持和服务器的联系，以便接受对伐发送的消息，并显示在页面上 示例：Meebo Chat (使用了Ajax） 插件：GMail/Facebook [...]]]></description>
			<content:encoded><![CDATA[<p>近几年，Ajax已变得越来越流行了，这使得网络应用程序变得越来越像是桌面应用程序。Ajax可以提供很多其它程序无法完成的额外的功能。</p>
<p>什么是 <a href="http://www.iwanna.cn/tags/ajax/" class="st_tag internal_tag" rel="tag" title="标签 Ajax 下的日志">AJAX</a>? 它是怎么工作的?</p>
<p><strong>什么是Ajax？它是如何运作的？</strong></p>
<p>Ajax是异步JavaScript脚本和 XML（Asynchronous <a href="http://www.iwanna.cn/tags/javascript/" class="st_tag internal_tag" rel="tag" title="标签 JavaScript 下的日志">JavaScript</a> and XML）的缩写，用来使浏览器端应用程序和服务器端进行通信。在Ajax出现以前，浏览器端应用程序是无法直接和服务器进行通信的，只能使用刷新和加载页 面的方法来实现。而有了Ajax之后，浏览器和服务器端就可以自由通信了。<br />
<span id="more-1849"></span><br />
<strong>以下简述Ajax脚本的运行路径：</strong></p>
<ul>
<li>行为引发事件，如用户单击按钮；</li>
<li>Ajax响应该事件，并使用XML向服务器发送请求；</li>
<li>服务器端程序（PHP、ASP或其他）接收到Ajax发来的数据并进行处理，从数据库中调用数据等；</li>
<li>服务器端再使用XML向客户端返回数据；</li>
<li>另外一个JavaScript函数，通常称之为回调函数，接收到服务器端发来的数据并据此更新页面。</li>
</ul>
<p>本文将讨论我们如何通过不同的脚本来实现各种各样的功能。</p>
<p><strong>1、登录表单</strong></p>
<p class="img" style="text-align: center;"><a href="http://www.digg.com/"><img src="http://noupe.com/img/ajax-works/ajax-1.jpg" alt="Ajax Post Image" /></a></p>
<p>按传统的做法，用户登录时会被定向到一个登录页面，随后再返回登录前的页面。使用Ajax后，用户可以直接在原页面输入用户名和密码。Ajax会将 这些信息发送给服务器进行验证。服务器会返回数据告知浏览器是否验证通过，浏览器可相应地更新页面。Digg就有这样的登录表单。</p>
<p>示例：<a href="http://www.digg.com/">Digg.com</a> （页面顶端）<br />
插件：<a href="http://malsup.com/jquery/form/">jQuery Form Plugin</a></p>
<p><strong>2、自动完成</strong></p>
<p class="img" style="text-align: center;"><a href="http://www.google.com/"><img src="http://noupe.com/img/ajax-works/ajax-2.jpg" alt="Ajax Post Image" /></a></p>
<p>谷歌是最早开始使用Ajax的公司之一，其搜索建议功能则是最先使用Ajax的地方，并开发了第一个自动完成工具。在搜索框输入数据后，Ajax会 从服务器端接受数据，找出数据库中存储的常用搜索关键字并进行提示。自动完成功能是非常有用的，当表单可以输入多个可能的值时，显示一个下拉列表框供用户 选择，非常人性化。</p>
<p>示例：<a href="http://www.google.com/">Google Search</a><br />
插件：<a href="http://plugins.jquery.com/project/jq-autocomplete">jq autocomplete</a></p>
<p><strong>3、投票和排行</strong></p>
<p class="img" style="text-align: center;"><a href="http://www.reddit.com/"><img src="http://noupe.com/img/ajax-works/ajax-3.jpg" alt="Ajax Post Image" /></a></p>
<p>网页收藏站点如Digg、Reddit等往往会让用户来决定什么内容会放在首页，使用的方法便是投票。他们使用Ajax来实现这个功能，这样用户就能够方便快捷地表达自己的意见了。</p>
<p>示例：<a href="http://www.reddit.com/">Reddit</a></p>
<p><strong>4、使用用户内容更新</strong></p>
<p class="img" style="text-align: center;"><a href="http://www.twitter.com/"><img src="http://noupe.com/img/ajax-works/ajax-4.jpg" alt="Ajax Post Image" /></a></p>
<p>Twitter之所以流行的一大原因是其简单易用的界面。当用户发送了一个消息后，这条消息会立刻添加到用户的页面中，所有的相应内容都会进行更 新。最近，Twitter开始使用Ajax对“热门话题”进行更新。每隔几秒，我们就可以知道大家在忙些什么、关注些什么，非常快速。</p>
<p>示例：<a href="http://www.twitter.com/">Twitter</a></p>
<p><strong>5、表单的提交和验证</strong></p>
<p class="img" style="text-align: center;"><a href="http://kawika.org/jquery/checkbox/"><img src="http://noupe.com/img/ajax-works/ajax-5.jpg" alt="Ajax Post Image" /></a></p>
<p>表单永远是最麻烦的东西，但Ajax让它们变得友好起来。Ajax可以派很多用处，从上面提到的自动完成功能，再到现在的表单验证和提交。有些网站使用Ajax检查用户输入的数据是否达到了某些要求，如密码长度或者E-mail地址、URL地址是否合法等</p>
<p>示例：<a href="http://www.thinkflick.com/freebies/10-great-jquery-form-plugins/">10 Cool jQuery Form Plugins</a></p>
<p><strong>6、聊天室和即时消息</strong></p>
<p class="img" style="text-align: center;"><a href="http://www.meebo.com/"><img src="http://noupe.com/img/ajax-works/ajax-6.jpg" alt="Ajax Post Image" /></a></p>
<p>在线聊天室在IRC之后多年才出现的只用应用。如今，聊天室和即时消息可以完全由浏览器来处理。在聊天室或即时消息应用程序中，Ajax通常要做两 件事情，可以想象一下你的耳朵和嘴巴。你的嘴巴要告诉服务器你发送了一条消息，而耳朵则要保持和服务器的联系，以便接受对伐发送的消息，并显示在页面上</p>
<p>示例：<a href="http://www.meebo.com/">Meebo Chat</a> (使用了Ajax）<br />
插件：<a href="http://anantgarg.com/2009/05/13/gmail-facebook-style-jquery-chat/">GMail/Facebook Style Chat Script</a></p>
<p><strong>7、灵巧的用户界面</strong></p>
<p class="img" style="text-align: center;"><a href="http://jqueryui.com/demos/droppable/"><img src="http://noupe.com/img/ajax-works/ajax-7.jpg" alt="Ajax Post Image" /></a></p>
<p>Ajax的一个常规应用就是创建整洁、灵巧的用户界面，使用户能在一个页面中做更多的事情。它的好处体现在两个地方：首先，它能使应用程序的响应更 为快速，操作更为简单；其次，它能减少浏览器向服务器的请求次数，从而减少带宽和加载时间。有一个免费的上传服务，名为Drop.io，使用的就是这项技 术。而谷歌则更是把这项应用发挥到了极致，使用Ajax开发出了类桌面应用程序，如谷歌文档、谷歌地图等。</p>
<p>参考：<a href="http://jqueryui.com/">jQuery UI Library</a></p>
<p><strong>8、插件</strong></p>
<p class="img" style="text-align: center;"><a href="https://www.google.com/adsense/static/en_US/AdFormats.html?hl=en_US&amp;gsessionid=jfcW8Ypze14jT1AcH9jPTg"><img src="http://noupe.com/img/ajax-works/ajax-8.jpg" alt="Ajax Post Image" /></a></p>
<p>Ajax不仅可以调用本地资源，还能够和其他服务器进行通信。像Wordpress之类的CMS（Content Management System 内容管理系统），它们的插件就是用Ajax实现的。又如Google Adsense，用的也是这样的方法。</p>
<p>示例：<a href="http://www.adsense.com/">Google Adsense</a><br />
插件：<a href="http://www.hotscripts.com/listing/jquery-load-external-content-into-div/">将外部内容加载到div中</a></p>
<p><strong>9、使用Lightbox代替弹出窗口</strong></p>
<p class="img" style="text-align: center;"><a href="http://www.logosauce.com/"><img src="http://noupe.com/img/ajax-works/ajax-9.jpg" alt="Ajax Post Image" /></a></p>
<p>弹出窗口拦截程序越来越流行了，原因当然是弹出窗口实在是很烦人。而Lightbox是在浏览器窗口内部显示的，所以拦截程序不能拿它怎么样。而且 Lightbox也不会让用户感到多厌烦，所以有些人就用它来作广告，如Darren Rowe的ProBlogger.com。Lightbox同样可以用来做登录表单或注册表单，比如匿名用户在Digg上投票时会被要求进行注册。</p>
<p>示例：<a href="http://www.logosauce.com/">Logo Sauce</a><br />
插件：<a href="http://leandrovieira.com/projects/jquery/lightbox/">Lightbox Plugin</a></p>
<p><strong>10、Ajax和Flash的结合</strong></p>
<p class="img" style="text-align: center;"><a href="http://www.kongregate.com/"><img src="http://noupe.com/img/ajax-works/ajax-10.jpg" alt="Ajax Post Image" /></a></p>
<p>很少有人会拿Ajax和Flash和一起使用，但是这样做却能起到非常好的效果。Flash游戏网站Kongregate使用了这项技术，效果很棒。通过使用他们的API，用户可以在游戏中赢取各种“徽章”，并使用Ajax将数据传输给服务器，更新用户的信息。</p>
<p>示例：<a href="http://www.kongregate.com/">Kongregate</a><br />
插件：<a href="http://webscripts.softpedia.com/scriptDownload/jQuery-Flash-Plugin-Download-44476.html">jQuery Flash Plugin</a></p>
<hr />
<p>© <a href="http://www.iwanna.cn">我想网</a> Akon 所有 , 2009. |
<a href="http://www.iwanna.cn/archives/2009/07/08/1849/">永久链接</a> |
<a href="http://www.iwanna.cn/archives/2009/07/08/1849/#comments">没有评论</a> |
提交到
<a rel="nofollow" target="_blank" href="http://www.google.com/reader/view/feed/http://www.iwanna.cn/archives/2009/07/08/1849/">Google Reader</a>
<a rel="nofollow" target="_blank" href="http://www.xianguo.com/subscribe.php?url=http://www.iwanna.cn/archives/2009/07/08/1849/">鲜果</a>
<a rel="nofollow" target="_blank" href="http://www.zhuaxia.com/add_channel.php?url=http://www.iwanna.cn/archives/2009/07/08/1849/">抓虾</a>
<hr />
<script type="text/javascript"><!--
google_ad_client = "pub-2057344547305288";
/* 336x280,iwanna feed,created 10/3/10 */
google_ad_slot = "9738886183";
google_ad_width = 336;
google_ad_height = 280;
//-->
</script>
<script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script>
<hr />
</p>
<p><small>Feed enhanced by <a href='http://planetozh.com/blog/my-projects/wordpress-plugin-better-feed-rss/'>Better Feed</a> from  <a href='http://planetozh.com/blog/'>Ozh</a></small></p>
]]></content:encoded>
			<wfw:commentRss>http://www.iwanna.cn/archives/2009/07/08/1849/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>XmlHttpRequest的串行异步</title>
		<link>http://www.iwanna.cn/archives/2009/06/23/1862/</link>
		<comments>http://www.iwanna.cn/archives/2009/06/23/1862/#comments</comments>
		<pubDate>Tue, 23 Jun 2009 04:32:03 +0000</pubDate>
		<dc:creator>seasun</dc:creator>
				<category><![CDATA[Ajax]]></category>
		<category><![CDATA[JavaScript]]></category>

		<guid isPermaLink="false">http://www.iwanna.cn/?p=1862</guid>
		<description><![CDATA[默认情况下，我们总是喜欢用异步XHR请求来提高Web应用的响应性。然而，你考虑过如何让你的XHR请求串行调用吗？毕竟在有些情况下，XHR请求必须按照顺序调用，比如B的调用依赖于A的结果。 你可以使用同步Ajax请求，但是那会暂时锁住浏览器。Thibaud Lopez Schneider在一篇文章中说明了同步Ajax和 串行发生的异步请求 之间的区别。 他创建了一个网站asynchronous.me用来生成简单的示例代码。如果查看串行异步XHR的示例代码的话，你会发现它其实很简单，只是把下一个方法作为上一个方法的回调方法。 function run() {     request1(function () {         request2(function () {             request3(function () {                 done();             });         });     }); [...]]]></description>
			<content:encoded><![CDATA[<p>默认情况下，我们总是喜欢用异步XHR请求来提高Web应用的响应性。然而，你考虑过如何让你的XHR请求串行调用吗？毕竟在有些情况下，XHR请求必须按照顺序调用，比如B的调用依赖于A的结果。</p>
<p>你可以使用同步Ajax请求，但是那会暂时锁住浏览器。Thibaud Lopez Schneider在<a href="http://www.thibaudlopez.net/xhr/Writing%20effective%20asynchronous%20XmlHttpRequests.pdf" target="_blank">一篇文章</a>中说明了同步Ajax和<br />
<span id="more-1862"></span><br />
<img class="alignnone size-medium wp-image-6974" title="sjaxlock" src="http://ajaxian.com/wp-content/uploads/sjaxlock.png" alt="" width="300" height="200" /></p>
<p>串行发生的异步请求</p>
<p><img class="alignnone size-medium wp-image-6975" title="serialajax" src="http://ajaxian.com/wp-content/uploads/serialajax.png" alt="" width="300" height="171" /></p>
<p>之间的区别。</p>
<p>他创建了一个网站<a href="http://www.asynchronous.me/">asynchronous.me</a>用来生成简单的示例代码。如果查看串行异步XHR的示例代码的话，你会发现它其实很简单，只是把下一个方法作为上一个方法的回调方法。</p>
<pre>function run() {
    request1(function () {
        request2(function () {
            request3(function () {
                done();
            });
        });
    });
}
function request1(callback1) {
    // request 1
    print("request1");
    var xmlHttpRequest1 = new XMLHttpRequest();
    xmlHttpRequest1.open("GET", "something1?hello1", true);
    xmlHttpRequest1.onreadystatechange = function () {
        if (this.readyState == 4 &amp;&amp; this.status == 200) {
            // response 1
            print("response1=" + this.responseText);
            // continue execution in the callback
            if (callback1) {
                callback1();
            }
        }
    };
    xmlHttpRequest1.send();
}
function request2(callback2) {
    // request 2
    print("request2");
    var xmlHttpRequest2 = new XMLHttpRequest();
    xmlHttpRequest2.open("GET", "something2?hello2", true);
    xmlHttpRequest2.onreadystatechange = function () {
        if (this.readyState == 4 &amp;&amp; this.status == 200) {
            // response 2
            print("response2=" + this.responseText);
            // continue execution in the callback
            if (callback2) {
                callback2();
            }
        }
    };
    xmlHttpRequest2.send();
}
function request3(callback3) {
    // request 3
    print("request3");
    var xmlHttpRequest3 = new XMLHttpRequest();
    xmlHttpRequest3.open("GET", "something3?hello3", true);
    xmlHttpRequest3.onreadystatechange = function () {
        if (this.readyState == 4 &amp;&amp; this.status == 200) {
            // response 3
            print("response3=" + this.responseText);
            // continue execution in the callback
            if (callback3) {
                callback3();
            }
        }
    };
    xmlHttpRequest3.send();
}
function done() {
    // end
    print("done");
}

你可以把<a href="http://www.thibaudlopez.net/xhr/generator/1.3/?language=jscallbacks&amp;type=multiple&amp;asynchronous=true&amp;showResponseHandlers=false&amp;responseHandler=inner&amp;communication=serial" target="_blank">使用回调的方法</a>与使用<a href="http://www.thibaudlopez.net/xhr/generator/1.3/?language=js&amp;type=multiple&amp;asynchronous=true&amp;showResponseHandlers=false&amp;responseHandler=inner&amp;communication=serial%3Einlining%3C/a%3E%20and%20the%20interesting%20%3Ca%20href=" target="_blank">Dojo Deferred</a>的进行比较：</pre>
<pre>    function run() {
        request1().addCallback(request2).addCallback(request3).addCallback(done);
    }
    function request1() {
        // request 1
        print("request1");
        var deferred = <a href="http://www.iwanna.cn/tags/dojo/" class="st_tag internal_tag" rel="tag" title="标签 Dojo 下的日志">dojo</a>.xhrGet({
            url: "something1?hello1",
            load: function (response) {
                // response 1
                print("response1=" + response);
            }
        });
        return deferred;
    }
    function request2() {
        // request 2
        print("request2");
        var deferred = <a href="http://www.iwanna.cn/tags/dojo/" class="st_tag internal_tag" rel="tag" title="标签 Dojo 下的日志">dojo</a>.xhrGet({
            url: "something2?hello2",
            load: function (response) {
                // response 2
                print("response2=" + response);
            }
        });
        return deferred;
    }
    function request3() {
        // request 3
        print("request3");
        var deferred = <a href="http://www.iwanna.cn/tags/dojo/" class="st_tag internal_tag" rel="tag" title="标签 Dojo 下的日志">dojo</a>.xhrGet({
            url: "something3?hello3",
            load: function (response) {
                // response 3
                print("response3=" + response);
            }
        });
        return deferred;
    }
    function done() {
        // end
        print("done");
    }</pre>
<hr />
<p>© <a href="http://www.iwanna.cn">我想网</a> Akon 所有 , 2009. |
<a href="http://www.iwanna.cn/archives/2009/06/23/1862/">永久链接</a> |
<a href="http://www.iwanna.cn/archives/2009/06/23/1862/#comments">没有评论</a> |
提交到
<a rel="nofollow" target="_blank" href="http://www.google.com/reader/view/feed/http://www.iwanna.cn/archives/2009/06/23/1862/">Google Reader</a>
<a rel="nofollow" target="_blank" href="http://www.xianguo.com/subscribe.php?url=http://www.iwanna.cn/archives/2009/06/23/1862/">鲜果</a>
<a rel="nofollow" target="_blank" href="http://www.zhuaxia.com/add_channel.php?url=http://www.iwanna.cn/archives/2009/06/23/1862/">抓虾</a>
<hr />
<script type="text/javascript"><!--
google_ad_client = "pub-2057344547305288";
/* 336x280,iwanna feed,created 10/3/10 */
google_ad_slot = "9738886183";
google_ad_width = 336;
google_ad_height = 280;
//-->
</script>
<script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script>
<hr />
</p>
<p><small>Feed enhanced by <a href='http://planetozh.com/blog/my-projects/wordpress-plugin-better-feed-rss/'>Better Feed</a> from  <a href='http://planetozh.com/blog/'>Ozh</a></small></p>
]]></content:encoded>
			<wfw:commentRss>http://www.iwanna.cn/archives/2009/06/23/1862/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>10个关于Ajax的IT人需要知道的事情</title>
		<link>http://www.iwanna.cn/archives/2009/06/21/1854/</link>
		<comments>http://www.iwanna.cn/archives/2009/06/21/1854/#comments</comments>
		<pubDate>Sun, 21 Jun 2009 08:54:03 +0000</pubDate>
		<dc:creator>seasun</dc:creator>
				<category><![CDATA[Ajax]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Assemble]]></category>
		<category><![CDATA[Marrow]]></category>
		<category><![CDATA[XMLHTTP]]></category>

		<guid isPermaLink="false">http://www.iwanna.cn/?p=1854</guid>
		<description><![CDATA[任何新网络技术的引进都会不同方面的影响网络的基础建设，小到微不足道，大到甚至地球破碎。在当今网络中，Ajax是一个更具有破坏性的新网络技术。为了减少你对将来网络的吃惊，下面列出了10项你需要熟知的关于Ajax的知识。]]></description>
			<content:encoded><![CDATA[<p><span>任何新网络技术的引进都会不同方面的影响网络的基础建设，小到微不足道，大到甚至地球破碎。在当今网络中，<span><a href="http://www.iwanna.cn/tags/ajax/" class="st_tag internal_tag" rel="tag" title="标签 Ajax 下的日志">Ajax</a></span>是一个更具有破坏性的新网络技术。为了减少你对将来网络的吃惊，下面列出了<span>10</span>项你需要熟知的关于<span>Ajax</span>的知识。</span></p>
<p><span>让我们看一组幻灯片，对于<span>Ajax</span>，什么是每一个网络专家都需要知道的。</span><br />
<span id="more-1854"></span><br />
<strong>1）</strong><strong><span>Ajax</span>是一个想法，而不仅仅是一个缩略词</strong></p>
<p><span>尽管<span>Ajax</span>通常被拼写为“异步<span><a href="http://www.iwanna.cn/tags/javascript/" class="st_tag internal_tag" rel="tag" title="标签 JavaScript 下的日志">JavaScript</a></span>和<span>XML</span>”，但这个全称不完全合</span><span>适，因为它过分简化了这门技术的历史和实现核心。更确切地，<span>Ajax</span>包含了一种思想，这种思想认为网络应用可以退出传统的以服务器端为中心的重复发送<span>-</span>等待循环方式来建立。<span>Ajax</span>使网络应用转向更有影响的、连续的，而且渐进式的更新。<span>Ajax</span>为用户优先的体验网络应用提供了更丰富、更好的交互性。这个优势也意味着需要网络专家更多的网络控制和安全监视，潜在地，服务器和网络改造也是这样。</span></p>
<p><strong>2）</strong><strong>这确实都与<span>JavaScript</span>有关</strong></p>
<p><span><span>Ajax</span>的应用是用<span>JavaScript</span>写的，通常基于<span>XMLHttpRequest</span>对象来通信，这个<span>XMLHttpRequest</span>对象是通过万维网协议过程进行的。由于像大多的网络技术一样，它现在只是一个特定的工业标准，因此在不同浏览器中实现的显著差别还是可以找到的。不管有没有广泛的工业支持，它也可能使用其它的数据传输机制，包括传统的框架和<span>image-cookie</span>方法，以及<span><a href="http://www.iwanna.cn/tags/flash/" class="st_tag internal_tag" rel="tag" title="标签 Flash 下的日志">Flash</a></span>或<span>java</span>中二进制桥的使用。</span></p>
<p><span>无论开发者使用哪种传输方法，<span>Ajax</span>都将<span>JavaScript</span>在网络应用中提升到了一个前所未有的重要地位。现在<span>JavaScript</span>对重要的数据收集、数据通信、消费机制都有影响，所以它不再被认为是没有重大作用的二级网络技术。</span></p>
<p><span>认为<span>JavaScript</span>技术有毒的开发者们试图使用工具或框架产生其它的语言如<span>java</span>（如谷歌网络工具）来避免使用这种语言，或者在组件或标签后隐藏代码（例如<span>.Net</span>和<span>Ruby</span>）。然而最终，<span>JavaScript</span>仍会在应用中。最好是理解并学会直接使用它，因为只要你使用<span>Ajax</span>，你就使用了很多的<span>JavaScript</span>。</span></p>
<p><span><span>Ajax</span>是内嵌在网络中的，所以坏代码对网络管理员和开发者来说意味着大量的故障修理，底线是鼓励好的、有网络意识的编码。用于其他语言的具有同样组织的“规则和工具”——代码规范、测试机制和源码控制也必须应用于<span>JavaScript</span>，以此来确保<span>Ajax</span>的可支持性和健壮性。</span></p>
<p><strong>3）</strong><strong><span>XML</span>是不需要的</strong></p>
<p><span>尽管缩略词中有“<span>x</span>”，但是<span>Ajax</span>并不需要<span>XML</span>。<span>XMLHttpRequest</span>对象可以传输任意的文本格式。对于很多<span>Ajax</span>开发者来说，作为一种数据格式<span>JavaScript</span>对象符号甚至是纯<span>JavaScript</span>代码段更有意义，因为<span>JavaScript</span>是消费环境。有的开发者喜欢以纯文本或<span><a href="http://www.iwanna.cn/tags/html/" class="st_tag internal_tag" rel="tag" title="标签 HTML 下的日志">HTML</a></span>代码段做为网页的输入，也有的使用像不太著名的<span>YAML</span>标记语言或逗号分隔值这样的数据格式。</span></p>
<p><span>当然，使用<span>XML</span>是可能的也是应当的，只是不是必需的。<span>XMLHttpRequest</span>对象不支持使用二进制格式上传文件，但是考虑到<span>Flash</span>使用一种叫做活动消息格式（<span>Action Message Format</span>）的二机制格式，所以在<span>Ajax</span>应用中也可能很快地找到类似的性质。你应该知道网络中的哪种机制正在被网络淘汰，因为淘汰的不总是<span>XML</span>，也要确保能够分析出这些机制的性能和安全性。</span></p>
<p><strong>4）</strong><strong>为<span>HTTP</span>请求的增加做好准备</strong></p>
<p><span>对网络管理员来说，支持<span>Ajax</span>应用最明显的问题是结构化编程方式使网络应用的使用从只有几百<span>KB</span>的某些不频繁响应的程序组变为更多连续的小型<span>HTTP</span>请求交换。这意味着网络绑定的网页和应用服务器会发现他们比以前更繁忙。<span>Ajax</span>将为服务器和网络应用做些什么取决于这些应用是如何建立的——开发者们一定要明白他们使用的应用间的网络冲突。</span></p>
<p><strong>5）</strong><strong>仔细地优化<span>Ajax</span>请求</strong></p>
<p><span>网络应用应该坚持发送更少的数据、更少的发送次数的网络传输规则。但是这也不是说这种规则被开发者们广泛地遵循。对网络来说很幸运的是，<span> Ajax</span>响应的<span>HTTP</span>压缩可以减少响应尺寸，并且在所有现代的浏览器中都支持。但是由于动态压缩的额外开销，如果响应相对较小速度也不会改变太多。这也就是说，对网络管理员来说在服务器端打开压缩机制是明智的，但是需要明白的是，使用<span>Ajax</span>应用不会比使用传统的网络应用获得的更多。</span></p>
<p><span>我们一般使用缓存来减少发送数据的次数。但是，尽管由浏览器提供的特定<span style="color: #ff0000;">假设</span>不会在同一段时间里再次获取<span>URL</span>，大多数的<span>Ajax</span>实现还是公开敌视缓存。许多<span>Ajax</span>开发人员不是使用缓存，而是通过头设置或<span>URL</span>的唯一性来积极地战胜缓存。</span></p>
<p><span>用<span>JavaScript</span>写的客户端<span>Ajax</span>缓存使得对付缓存成为可能，但是大多数的<span>Ajax</span>库不执行这样的功能。网络专家应该为开发者们展示缓存的好处，因为<span>Ajax</span>使用缓存的好处要比使用压缩多得多。</span></p>
<p><strong>6）</strong><strong>认识到两个连接限制</strong></p>
<p><span><span>Ajax</span>应用向同一个<span>URL</span>发送两个同步的连接是受<span>HTTP</span>限制的。这是<span>HTTP</span>协议的设计方式，不是什么浏览器问题或浏览器限制。好消息是，它使许多<span>Ajax</span>开发者远离了服务器的突然崩溃，尽管微软的<span>Internet Explorer 8</span>被认为在这种限制之外运行得很好。非正式的<span>Ajax</span>应用可能是麻烦的，随着浏览器不断地改变规则，网络管理员们应该随时关注提出请求的数量，跟应用开发者们一起避免像<span style="color: #ff0000;">快速投票</span>（<span>fast polling</span>）或长期持有连接这样的设计模式。</span></p>
<p><strong>7）</strong><strong>小心响应顺序</strong></p>
<p><span>在传统的网络应用中，<span>TCP/IP</span>通信协议的网络影响——如<span>HTTP</span>响应接收的缺乏秩序，通常不被开发者和使用者所注意。基础单元、<span>HTML</span>文件在其他对象之前被接收，接着就触发请求。任何接下来的请求都触发整个新的基础文件，从而保证顺序。<span>Ajax</span>将这种固有的顺序摒除了，但是，由于这样，基于一定顺序的应用需要一个响应队列。但<span>Ajax</span>框架并不始终理解这个相关网络。因此，再一次地确认<span>Ajax</span>应用的开发者们了解这些相关的网络级别。</span></p>
<p><strong>8）</strong><strong>理解“层<span>8</span>”纠错的影响</strong></p>
<p><span>多年来，用户们一直都是通过重载页面或按“后退按钮”来纠正网络传输质量。简而言之，用户这样做有助于减轻网络问题，因为错误一般发生在预期的页面绘制之间。但是，通过<span>Ajax</span>应用错误不再那么明显。可糟糕的是，由于简单的、动画的<span>GIF</span>旋转循环提供的正确的请求状态信息很少，用户经常将错误误传。</span></p>
<p><span>开发者们很烦恼，因为许多库在认识到发生了超时时不再响应，一定发生重试，而且服务器错误和数据错误会突然出现。因为<span>JavaScript</span>检测显示的通信和代码错误很少出现在客户端，所以（使用户）无忧的无知是一种规范。为了使管理员正确地使用<span>Ajax</span>，更多的应用级监控是必需的。</span></p>
<p><strong>9）</strong><strong>旧的安全威胁被二次曝光</strong></p>
<p><span>如果你听信专家的，<span>Ajax</span>可能会显现得产生更多的攻击页面，但是事实是它不会比传统的网络应用开发环境更不安全，因为传送给可信任的服务器的<span>HTTP</span>输入——头消息、检索字符串和消息体是一样的。如果在你的网络开发组可信任的客户端代码和输入数据不被暗地里禁止，那么<span>Ajax</span>将会使事情朝着那个方向推进。</span></p>
<p><span>跨站点脚本（<span>XSS</span>）不是在<span>Ajax</span>中的一个新的脆弱点，它只是在<span>JavaScript</span>中更常见，尤其当应用允许使用<span style="color: #ff0000;">规定</span>（<span>state</span>）数据时。</span></p>
<p><span>跨站点请求伪造物也不是在<span>Ajax</span>中的新现象，但是如果应用开发者们不适当地检查在<span>Ajax</span>应用中的<span>HTTP </span><span style="color: #ff0000;">引用</span>（原文如此）头和管理<span>session</span>，将是为伪造物们开了门，尽管可能现在更糟糕了。</span></p>
<p><span>黑客，像开发者们一样，现在更感兴趣于使用和滥用增加了潜在漏洞的<span>JavaScript</span>。网络专家们应该确定开发者们意识到了即使客户端代码在适当的位置混乱也可能被利用，所以不管是不是<span>Ajax</span>数据输入始终都要被过滤和杀毒。</span></p>
<p><strong><span>10)</span>遵守相同的起始地址做为保护</strong></p>
<p><span>在安全的积极方面，<span>JavaScript</span>的<span>SOP</span>（同一起始地址策略）被完全地强迫应用在基于<span>XMLHttpRequest</span>的<span>Ajax</span>应用中。这个策略确保了脚本不能跟自己发行的以外的域进行通话。从开发者的观点，这也是让人非常烦恼的，因为这意味着来自<span>ajaxref.com</span>的网页服务不能跟来自<span>www.ajaxref.com</span>的<span>URL</span>进行通话，尽管这是同一台服务器上的，但它们不是同一个域。<span>DNS</span>匹配跟这个没关系，这是用于<span>SOP</span>的字符串检查。</span></p>
<p><span><span>SOP</span>也会严重的束缚开发者在客户端努力进行网络服务的能力。显然，最好的方法是在服务器端使用代理来响应发送给其他服务器的请求并将这些结果组合起来。但是许多<span>Ajax</span>开发者们试图打破这个同一起始地址的限制。使用<span>&lt;script&gt;</span>标签来代替<span>XMLHttpRequest</span>对象作为传输引入了危险的信任假设，而且导致了关注整个<span>Ajax</span>安全的开始。</span></p>
<p><span>现在，随着像<span>FireFox3</span>和<span>IE8</span>这样使用自己的跨域请求工具的浏览器的出现，更多的麻烦肯定即将来临。像<span>Java</span>的安全砂箱概念的情况似的，<span>SOP</span>限制被引进只是避免开发者们破坏安全。绕过这些安全措施要极为谨慎。</span></p>
<p><strong>注意你想要的是什么</strong></p>
<p><span>通过</span><span>Ajax</span><span>，丰富的应用界面工具集将赢得一个项目，但是坏的配管系统可能会搞垮它。如果一个丰富的</span><span>Ajax</span><span>应用的约定在偶尔很脆弱的网络环境中传输，那么用户会对察觉到应用的不稳定感到很失望，尽管它有华而不实的界面。为了实现桌面式的品质，网络专家们必须关于特定的网络和安全原理对</span><span>Ajax</span><span>开发者们进行培训，并且提供一个固定且连续的监控传输平台，这个平台包含</span><span>JavaScript</span><span>机能和来自用户感觉的网络性能的客户端检测。用户们看到的丰富的网络应用通常使用正常——例如像那些来自</span><span><a href="http://www.iwanna.cn/tags/google/" class="st_tag internal_tag" rel="tag" title="标签 Google 下的日志">Google</a></span><span>的网络应用，如果不这样将是冒险的努力。</span></p>
<hr />
<p>© <a href="http://www.iwanna.cn">我想网</a> Akon 所有 , 2009. |
<a href="http://www.iwanna.cn/archives/2009/06/21/1854/">永久链接</a> |
<a href="http://www.iwanna.cn/archives/2009/06/21/1854/#comments">没有评论</a> |
提交到
<a rel="nofollow" target="_blank" href="http://www.google.com/reader/view/feed/http://www.iwanna.cn/archives/2009/06/21/1854/">Google Reader</a>
<a rel="nofollow" target="_blank" href="http://www.xianguo.com/subscribe.php?url=http://www.iwanna.cn/archives/2009/06/21/1854/">鲜果</a>
<a rel="nofollow" target="_blank" href="http://www.zhuaxia.com/add_channel.php?url=http://www.iwanna.cn/archives/2009/06/21/1854/">抓虾</a>
<hr />
<script type="text/javascript"><!--
google_ad_client = "pub-2057344547305288";
/* 336x280,iwanna feed,created 10/3/10 */
google_ad_slot = "9738886183";
google_ad_width = 336;
google_ad_height = 280;
//-->
</script>
<script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script>
<hr />
</p>
<p><small>Feed enhanced by <a href='http://planetozh.com/blog/my-projects/wordpress-plugin-better-feed-rss/'>Better Feed</a> from  <a href='http://planetozh.com/blog/'>Ozh</a></small></p>
]]></content:encoded>
			<wfw:commentRss>http://www.iwanna.cn/archives/2009/06/21/1854/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>简单的Ajax实例</title>
		<link>http://www.iwanna.cn/archives/2009/06/03/1678/</link>
		<comments>http://www.iwanna.cn/archives/2009/06/03/1678/#comments</comments>
		<pubDate>Wed, 03 Jun 2009 01:51:10 +0000</pubDate>
		<dc:creator>seasun</dc:creator>
				<category><![CDATA[Ajax]]></category>

		<guid isPermaLink="false">http://www.iwanna.cn/?p=1678</guid>
		<description><![CDATA[Ajax 是一种可以通过Javascript, DHTML and the XMLHttpRequest 来发送GET或POST请求，在数据返回时不必重新载入页面。 下面是一个非常简单的Ajax例子，发送一个请求，打印出请求的字符串和远程用户的IP地址。 简单的Ajax演示 (请参考原文演示: http://www.degraeve.com/reference/simple-ajax-example.php) Html 页面 这个HTML页面提供了3个JavaScript函数，通过执行XMLHttpRequest来更新HTML页面.(AJAX调用) &#60;html&#62; &#60;head&#62; &#60;title&#62;Simple Ajax Example&#60;/title&#62; &#60;script language="Javascript"&#62; function xmlhttpPost(strURL) { var xmlHttpReq = false; var self = this; // Mozilla/Safari if (window.XMLHttpRequest) { self.xmlHttpReq = new XMLHttpRequest(); } // IE else if (window.ActiveXObject) { self.xmlHttpReq = new ActiveXObject("Microsoft.XMLHTTP"); } self.xmlHttpReq.open('POST', strURL, [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.iwanna.cn/tags/ajax/" class="st_tag internal_tag" rel="tag" title="标签 Ajax 下的日志">Ajax</a> 是一种可以通过Javascript, DHTML and the XMLHttpRequest 来发送GET或POST请求，在数据返回时不必重新载入页面。	 下面是一个非常简单的Ajax例子，发送一个请求，打印出请求的字符串和远程用户的IP地址。<br />
<span id="more-1678"></span><br />
<span style="font-size: medium;"><strong>简单的Ajax演示 </strong></span>(请参考原文演示: <a href="http://www.degraeve.com/reference/simple-ajax-example.php">http://www.degraeve.com/reference/simple-ajax-example.php</a>)</p>
<h2><span style="font-size: medium;"><a href="http://www.iwanna.cn/tags/html/" class="st_tag internal_tag" rel="tag" title="标签 HTML 下的日志">Html</a> 页面</span></h2>
<p>这个HTML页面提供了3个JavaScript函数，通过执行XMLHttpRequest来更新HTML页面.(AJAX调用)</p>
<pre class="sample" style="padding-left: 30px;">&lt;html&gt;
&lt;head&gt;
&lt;title&gt;Simple Ajax Example&lt;/title&gt;
&lt;script language="<a href="http://www.iwanna.cn/tags/javascript/" class="st_tag internal_tag" rel="tag" title="标签 JavaScript 下的日志">Javascript</a>"&gt;
function xmlhttpPost(strURL) {
    var xmlHttpReq = false;
    var self = this;
    // Mozilla/Safari
    if (window.XMLHttpRequest) {
        self.xmlHttpReq = new XMLHttpRequest();
    }
    // IE
    else if (window.ActiveXObject) {
        self.xmlHttpReq = new ActiveXObject("Microsoft.<a href="http://www.iwanna.cn/tags/xmlhttp/" class="st_tag internal_tag" rel="tag" title="标签 XMLHTTP 下的日志">XMLHTTP</a>");
    }
    self.xmlHttpReq.open('POST', strURL, true);
    self.xmlHttpReq.setRequestHeader('Content-Type',
    'application/x-www-form-urlencoded');
    self.xmlHttpReq.onreadystatechange = function() {
        if (self.xmlHttpReq.readyState == 4) {
            updatepage(self.xmlHttpReq.responseText);
        }
    }
    self.xmlHttpReq.send(getquerystring());
}

function getquerystring() {
    var form     = document.forms['f1'];
    var word = form.word.value;
    qstr = 'w=' + escape(word);  // NOTE: no '?' before querystring
    return qstr;
}

function updatepage(str){
    document.getElementById("result").innerHTML = str;
}
&lt;/script&gt;
&lt;/head&gt;
&lt;body&gt;
&lt;form name="f1"&gt;
  &lt;p&gt;word: &lt;input name="word" type="text"&gt;
  &lt;input value="Go" type="button"
  onclick='<a href="http://www.iwanna.cn/tags/javascript/" class="st_tag internal_tag" rel="tag" title="标签 JavaScript 下的日志">JavaScript</a>:xmlhttpPost("/cgi-bin/simple-ajax-example.cgi")'&gt;&lt;/p&gt;
  &lt;div id="result"&gt;&lt;/div&gt;
&lt;/form&gt;
&lt;/body&gt;
&lt;/html&gt;</pre>
<h2>CGI 脚本</h2>
<p>这个CGI脚本是用来应答HTML页面的JavaScript的请求。 CGI脚本可以通过简单的Python, Puby, PHP, C, Perl 等来实现。<br />
#!/usr/bin/perl -w<br />
use CGI;</p>
<p>$query = new CGI;</p>
<p>$secretword = $query-&gt;param(&#8216;w&#8217;);<br />
$remotehost = $query-&gt;remote_host();</p>
<p>print $query-&gt;header;<br />
print &#8220;&lt;p&gt;The secret word is &lt;b&gt;$secretword&lt;/b&gt; and your IP is &lt;b&gt;$remotehost&lt;/b&gt;</p>
<hr />
<p>© <a href="http://www.iwanna.cn">我想网</a> Akon 所有 , 2009. |
<a href="http://www.iwanna.cn/archives/2009/06/03/1678/">永久链接</a> |
<a href="http://www.iwanna.cn/archives/2009/06/03/1678/#comments">没有评论</a> |
提交到
<a rel="nofollow" target="_blank" href="http://www.google.com/reader/view/feed/http://www.iwanna.cn/archives/2009/06/03/1678/">Google Reader</a>
<a rel="nofollow" target="_blank" href="http://www.xianguo.com/subscribe.php?url=http://www.iwanna.cn/archives/2009/06/03/1678/">鲜果</a>
<a rel="nofollow" target="_blank" href="http://www.zhuaxia.com/add_channel.php?url=http://www.iwanna.cn/archives/2009/06/03/1678/">抓虾</a>
<hr />
<script type="text/javascript"><!--
google_ad_client = "pub-2057344547305288";
/* 336x280,iwanna feed,created 10/3/10 */
google_ad_slot = "9738886183";
google_ad_width = 336;
google_ad_height = 280;
//-->
</script>
<script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script>
<hr />
</p>
<p><small>Feed enhanced by <a href='http://planetozh.com/blog/my-projects/wordpress-plugin-better-feed-rss/'>Better Feed</a> from  <a href='http://planetozh.com/blog/'>Ozh</a></small></p>
]]></content:encoded>
			<wfw:commentRss>http://www.iwanna.cn/archives/2009/06/03/1678/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Google AJAX Libraries API</title>
		<link>http://www.iwanna.cn/archives/2009/05/27/1206/</link>
		<comments>http://www.iwanna.cn/archives/2009/05/27/1206/#comments</comments>
		<pubDate>Wed, 27 May 2009 09:17:59 +0000</pubDate>
		<dc:creator>seasun</dc:creator>
				<category><![CDATA[Ajax]]></category>
		<category><![CDATA[Extjs]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[JQuery]]></category>
		<category><![CDATA[Prototype]]></category>
		<category><![CDATA[Widget]]></category>
		<category><![CDATA[YUI]]></category>
		<category><![CDATA[API]]></category>
		<category><![CDATA[Library]]></category>

		<guid isPermaLink="false">http://www.iwanna.cn/?p=1206</guid>
		<description><![CDATA[什么是 AJAX 库 API？ AJAX 库 API 是一种内容分布网络，可加载最受欢迎的开源 JavaScript 库的架构。通过使用 Google AJAX API 加载程序的 google.load() 方法，您的应用程序能够迅速从全球任何位置访问不断增长的、最受欢迎的 JavaScript 开源库列表，包括： jQuery jQuery UI Prototype script.aculo.us MooTools Dojo SWFObject Yahoo! User Interface Library (YUI) Google 就每个库的利益直接与关键相关人员配合，并在最新稳定版本发布时接受这些版本。一旦我们托管给定库的版本，我们承诺无限期地托管该版本。 AJAX 库 API 在使用库集合的同时消除了用 JavaScript 开发混搭的不便之处。我们消除了托管库的不便之处、正确地设置缓存标头、与最新错误修正日期保持一致等。 &#60;script src="http://www.google.com/jsapi"&#62;&#60;/script&#62; &#60;script&#62; // Load jQuery google.load("jquery", "1"); // on page load complete, fire off a [...]]]></description>
			<content:encoded><![CDATA[<div class="g-c-gc-home">
<h2>什么是 <a href="http://www.iwanna.cn/tags/ajax/" class="st_tag internal_tag" rel="tag" title="标签 Ajax 下的日志">AJAX</a> 库 <a href="http://www.iwanna.cn/tags/api/" class="st_tag internal_tag" rel="tag" title="标签 API 下的日志">API</a>？</h2>
<p>AJAX 库 API 是一种内容分布网络，可加载最受欢迎的开源 <a href="http://www.iwanna.cn/tags/javascript/" class="st_tag internal_tag" rel="tag" title="标签 JavaScript 下的日志">JavaScript</a> 库的架构。通过使用 <a href="http://code.google.com/apis/ajax/documentation/">Google AJAX API 加载程序的</a> <code>google.load()</code> 方法，您的应用程序能够迅速从全球任何位置访问不断增长的、最受欢迎的 JavaScript 开源库列表，包括：</p>
<ul>
<li><a href="http://code.google.com/intl/zh-CN/apis/ajaxlibs/documentation/index.html#jquery">jQuery</a></li>
<li><a href="http://code.google.com/intl/zh-CN/apis/ajaxlibs/documentation/index.html#jqueryUI">jQuery UI</a></li>
<li><a href="http://code.google.com/intl/zh-CN/apis/ajaxlibs/documentation/index.html#prototype">Prototype</a></li>
<li><a href="http://code.google.com/intl/zh-CN/apis/ajaxlibs/documentation/index.html#script_aculo_us">script.aculo.us</a></li>
<li><a href="http://code.google.com/intl/zh-CN/apis/ajaxlibs/documentation/index.html#mootools">MooTools</a></li>
<li><a href="http://code.google.com/intl/zh-CN/apis/ajaxlibs/documentation/index.html#dojo">Dojo</a></li>
<li><a href="http://code.google.com/intl/zh-CN/apis/ajaxlibs/documentation/index.html#swfobject">SWFObject</a></li>
<li><a href="http://code.google.com/intl/zh-CN/apis/ajaxlibs/documentation/index.html#yui">Yahoo! User Interface Library (YUI)</a></li>
</ul>
<p><span id="more-1206"></span>Google 就每个库的利益直接与关键相关人员配合，并在最新稳定版本发布时接受这些版本。一旦我们托管给定库的版本，我们承诺无限期地托管该版本。</p>
<p>AJAX 库 API 在使用库集合的同时消除了用 JavaScript 开发混搭的不便之处。我们消除了托管库的不便之处、正确地设置缓存标头、与最新错误修正日期保持一致等。</p>
<pre class="prettyprint">&lt;script src="http://www.google.com/jsapi"&gt;&lt;/script&gt;
&lt;script&gt;
  // Load <a href="http://www.iwanna.cn/tags/jquery/" class="st_tag internal_tag" rel="tag" title="标签 JQuery 下的日志">jQuery</a>
  google.load("<a href="http://www.iwanna.cn/tags/jquery/" class="st_tag internal_tag" rel="tag" title="标签 JQuery 下的日志">jquery</a>", "1");

  // on page load complete, fire off a <a href="http://www.iwanna.cn/tags/jquery/" class="st_tag internal_tag" rel="tag" title="标签 JQuery 下的日志">jQuery</a> json-p query
  // against Google <a href="http://www.iwanna.cn/tags/web/" class="st_tag internal_tag" rel="tag" title="标签 Web 下的日志">web</a> search
  google.setOnLoadCallback(function() {
    $.getJSON("http://ajax.googleapis.com/ajax/services/search/<a href="http://www.iwanna.cn/tags/web/" class="st_tag internal_tag" rel="tag" title="标签 Web 下的日志">web</a>?q=google&amp;v=1.0&amp;callback=?",

      // on search completion, process the results
      function (data) {
        if (data.responseData.results &amp;&amp;
            data.responseData.results.length &gt; 0) {
          var results = data.responseData.results;

          for (var i=0; i &lt; results.length; i++) {
            // Display each result however you wish
            alert(results[i].titleNoFormatting);
          }
        }

      });
    });
&lt;/script&gt;</pre>
</div>
<hr />
<p>© <a href="http://www.iwanna.cn">我想网</a> Akon 所有 , 2009. |
<a href="http://www.iwanna.cn/archives/2009/05/27/1206/">永久链接</a> |
<a href="http://www.iwanna.cn/archives/2009/05/27/1206/#comments">没有评论</a> |
提交到
<a rel="nofollow" target="_blank" href="http://www.google.com/reader/view/feed/http://www.iwanna.cn/archives/2009/05/27/1206/">Google Reader</a>
<a rel="nofollow" target="_blank" href="http://www.xianguo.com/subscribe.php?url=http://www.iwanna.cn/archives/2009/05/27/1206/">鲜果</a>
<a rel="nofollow" target="_blank" href="http://www.zhuaxia.com/add_channel.php?url=http://www.iwanna.cn/archives/2009/05/27/1206/">抓虾</a>
<hr />
<script type="text/javascript"><!--
google_ad_client = "pub-2057344547305288";
/* 336x280,iwanna feed,created 10/3/10 */
google_ad_slot = "9738886183";
google_ad_width = 336;
google_ad_height = 280;
//-->
</script>
<script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script>
<hr />
</p>
<p><small>Feed enhanced by <a href='http://planetozh.com/blog/my-projects/wordpress-plugin-better-feed-rss/'>Better Feed</a> from  <a href='http://planetozh.com/blog/'>Ozh</a></small></p>
]]></content:encoded>
			<wfw:commentRss>http://www.iwanna.cn/archives/2009/05/27/1206/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>jQuery与Extjs的Ajax的跨域访问</title>
		<link>http://www.iwanna.cn/archives/2009/05/20/1107/</link>
		<comments>http://www.iwanna.cn/archives/2009/05/20/1107/#comments</comments>
		<pubDate>Wed, 20 May 2009 04:37:38 +0000</pubDate>
		<dc:creator>seasun</dc:creator>
				<category><![CDATA[Ajax]]></category>
		<category><![CDATA[Extjs]]></category>
		<category><![CDATA[JQuery]]></category>
		<category><![CDATA[ExtJS]]></category>

		<guid isPermaLink="false">http://www.iwanna.cn/?p=1107</guid>
		<description><![CDATA[jquery的代码: Js代码 &#60;script&#62; $(function() { //      $.getJSON(&#8220;http://10.128.3.104/edi/rest/GetBillCaseInfo?_out=json&#38;_callback=?&#8221;, function(json) { //        alert(json.ROWSET.ROW[0].CaseName); //      }); $.ajax({ async:false, //url: &#8217;http://10.128.3.104/edi/rest/GetBillCaseInfo&#8217;, //跨域的dns/document!searchJSONResult.action, url: &#8216;testjson.do&#8217;, type: &#8220;GET&#8221;, dataType: &#8216;jsonp&#8217;, jsonp: &#8216;_callback&#8217;, data: &#8216;_out=json&#8217;, timeout: 5000, header: { &#8216;Authorization&#8217;: &#8216;Basic YWRtaW46YWRtaW4xMjM=&#8217;}, beforeSend: function(request) { //jsonp 方式此方法不被触发.原因可能是dataType如果指定为jsonp的话,就已经不是ajax事件了 }, success: function (json) { //客户端jquery预先定义好的callback函数,成功获取跨域服务器上的json数据后,会动态执行这个callback函数 alert($.toJSON(json)); alert($.toJSON(json.ROWSET.ROW[0])); }, error: function(request) { //jsonp 方式此方法不被触发.原因可能是dataType如果指定为jsonp的话,就已经不是ajax事件了 //请求出错处理 alert(&#8220;请求出错(请检查相关度网络状况.)&#8221;); } }); }); &#60;/script&#62; &#60;script&#62; $(function() { // $.getJSON("http://10.128.3.104/edi/rest/GetBillCaseInfo?_out=json&#38;_callback=?", function(json) { // alert(json.ROWSET.ROW[0].CaseName); // }); $.ajax({ async:false, //url: 'http://10.128.3.104/edi/rest/GetBillCaseInfo', //跨域的dns/document!searchJSONResult.action, url: 'testjson.do', type: "GET", [...]]]></description>
			<content:encoded><![CDATA[<p><span style="background-color: #ff0000;">jquery的代码:</span><br />
<span id="more-1107"></span></p>
<div class="dp-highlighter">
<div class="bar">
<div class="tools">Js代码 <object width="14" height="15" data="http://wjw465150.javaeye.com/javascripts/syntaxhighlighter/clipboard_new.swf" type="application/x-shockwave-flash"><param name="flashvars" value="clipboard=%20%20%3Cscript%3E%0A%20%20%20%20%24(function()%20%7B%0A%20%20%20%20%20%20%2F%2F%20%20%20%20%20%20%24.getJSON(%22http%3A%2F%2F10.128.3.104%2Fedi%2Frest%2FGetBillCaseInfo%3F_out%3Djson%26_callback%3D%3F%22%2C%20function(json)%20%7B%0A%20%20%20%20%20%20%2F%2F%20%20%20%20%20%20%20%20alert(json.ROWSET.ROW%5B0%5D.CaseName)%3B%0A%20%20%20%20%20%20%2F%2F%20%20%20%20%20%20%7D)%3B%0A%0A%20%20%20%20%20%20%24.ajax(%7B%0A%20%20%20%20%20%20%20%20async%3Afalse%2C%0A%20%20%20%20%20%20%20%20%2F%2Furl%3A%20'http%3A%2F%2F10.128.3.104%2Fedi%2Frest%2FGetBillCaseInfo'%2C%20%2F%2F%E8%B7%A8%E5%9F%9F%E7%9A%84dns%2Fdocument!searchJSONResult.action%2C%0A%20%20%20%20%20%20%20%20url%3A%20'testjson.do'%2C%0A%20%20%20%20%20%20%20%20type%3A%20%22GET%22%2C%0A%20%20%20%20%20%20%20%20dataType%3A%20'jsonp'%2C%0A%20%20%20%20%20%20%20%20jsonp%3A%20'_callback'%2C%0A%20%20%20%20%20%20%20%20data%3A%20'_out%3Djson'%2C%0A%20%20%20%20%20%20%20%20timeout%3A%205000%2C%0A%20%20%20%20%20%20%20%20header%3A%20%7B%20'Authorization'%3A%20'Basic%20YWRtaW46YWRtaW4xMjM%3D'%7D%2C%0A%20%20%20%20%20%20%20%20beforeSend%3A%20function(request)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%2F%2Fjsonp%20%E6%96%B9%E5%BC%8F%E6%AD%A4%E6%96%B9%E6%B3%95%E4%B8%8D%E8%A2%AB%E8%A7%A6%E5%8F%91.%E5%8E%9F%E5%9B%A0%E5%8F%AF%E8%83%BD%E6%98%AFdataType%E5%A6%82%E6%9E%9C%E6%8C%87%E5%AE%9A%E4%B8%BAjsonp%E7%9A%84%E8%AF%9D%2C%E5%B0%B1%E5%B7%B2%E7%BB%8F%E4%B8%8D%E6%98%AFajax%E4%BA%8B%E4%BB%B6%E4%BA%86%0A%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20success%3A%20function%20(json)%20%7B%20%20%2F%2F%E5%AE%A2%E6%88%B7%E7%AB%AFjquery%E9%A2%84%E5%85%88%E5%AE%9A%E4%B9%89%E5%A5%BD%E7%9A%84callback%E5%87%BD%E6%95%B0%2C%E6%88%90%E5%8A%9F%E8%8E%B7%E5%8F%96%E8%B7%A8%E5%9F%9F%E6%9C%8D%E5%8A%A1%E5%99%A8%E4%B8%8A%E7%9A%84json%E6%95%B0%E6%8D%AE%E5%90%8E%2C%E4%BC%9A%E5%8A%A8%E6%80%81%E6%89%A7%E8%A1%8C%E8%BF%99%E4%B8%AAcallback%E5%87%BD%E6%95%B0%0A%20%20%20%20%20%20%20%20%20%20alert(%24.toJSON(json))%3B%0A%20%20%20%20%20%20%20%20%20%20alert(%24.toJSON(json.ROWSET.ROW%5B0%5D))%3B%0A%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20error%3A%20function(request)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%2F%2Fjsonp%20%E6%96%B9%E5%BC%8F%E6%AD%A4%E6%96%B9%E6%B3%95%E4%B8%8D%E8%A2%AB%E8%A7%A6%E5%8F%91.%E5%8E%9F%E5%9B%A0%E5%8F%AF%E8%83%BD%E6%98%AFdataType%E5%A6%82%E6%9E%9C%E6%8C%87%E5%AE%9A%E4%B8%BAjsonp%E7%9A%84%E8%AF%9D%2C%E5%B0%B1%E5%B7%B2%E7%BB%8F%E4%B8%8D%E6%98%AFajax%E4%BA%8B%E4%BB%B6%E4%BA%86%0A%20%20%20%20%20%20%20%20%20%20%2F%2F%E8%AF%B7%E6%B1%82%E5%87%BA%E9%94%99%E5%A4%84%E7%90%86%0A%20%20%20%20%20%20%20%20%20%20alert(%22%E8%AF%B7%E6%B1%82%E5%87%BA%E9%94%99(%E8%AF%B7%E6%A3%80%E6%9F%A5%E7%9B%B8%E5%85%B3%E5%BA%A6%E7%BD%91%E7%BB%9C%E7%8A%B6%E5%86%B5.)%22)%3B%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%7D)%3B%0A%0A%20%20%20%20%7D)%3B%0A%20%20%3C%2Fscript%3E%0A%0A" /><param name="src" value="http://wjw465150.javaeye.com/javascripts/syntaxhighlighter/clipboard_new.swf" /><param name="quality" value="high" /></object></div>
</div>
<ol class="dp-c">
<li><span><span>&lt;script&gt; </span></span></li>
<li><span> $(<span class="keyword">function</span><span>() { </span></span></li>
<li><span> <span class="comment">//      $.getJSON(&#8220;http://10.128.3.104/edi/rest/GetBillCaseInfo?_out=<a href="http://www.iwanna.cn/tags/json/" class="st_tag internal_tag" rel="tag" title="标签 Json 下的日志">json</a>&amp;_callback=?&#8221;, function(<a href="http://www.iwanna.cn/tags/json/" class="st_tag internal_tag" rel="tag" title="标签 Json 下的日志">json</a>) {</span><span> </span></span></li>
<li><span> <span class="comment">//        alert(json.ROWSET.ROW[0].CaseName);</span><span> </span></span></li>
<li><span> <span class="comment">//      });</span><span> </span></span></li>
<li><span> </span></li>
<li><span> $.<a href="http://www.iwanna.cn/tags/ajax/" class="st_tag internal_tag" rel="tag" title="标签 Ajax 下的日志">ajax</a>({ </span></li>
<li><span> async:<span class="keyword">false</span><span>, </span></span></li>
<li><span> <span class="comment">//url: &#8217;http://10.128.3.104/edi/rest/GetBillCaseInfo&#8217;, //跨域的dns/document!searchJSONResult.action,</span><span> </span></span></li>
<li><span> url: <span class="string">&#8216;testjson.do&#8217;</span><span>, </span></span></li>
<li><span> type: <span class="string">&#8220;GET&#8221;</span><span>, </span></span></li>
<li><span> dataType: <span class="string">&#8216;jsonp&#8217;</span><span>, </span></span></li>
<li><span> jsonp: <span class="string">&#8216;_callback&#8217;</span><span>, </span></span></li>
<li><span> data: <span class="string">&#8216;_out=json&#8217;</span><span>, </span></span></li>
<li><span> timeout: 5000, </span></li>
<li><span> header: { <span class="string">&#8216;Authorization&#8217;</span><span>: </span><span class="string">&#8216;Basic YWRtaW46YWRtaW4xMjM=&#8217;</span><span>}, </span></span></li>
<li><span> beforeSend: <span class="keyword">function</span><span>(request) { </span></span></li>
<li><span> <span class="comment">//jsonp 方式此方法不被触发.原因可能是dataType如果指定为jsonp的话,就已经不是ajax事件了</span><span> </span></span></li>
<li><span> }, </span></li>
<li><span> success: <span class="keyword">function</span><span> (json) { </span><span class="comment">//客户端jquery预先定义好的callback函数,成功获取跨域服务器上的json数据后,会动态执行这个callback函数</span><span> </span></span></li>
<li><span> alert($.toJSON(json)); </span></li>
<li><span> alert($.toJSON(json.ROWSET.ROW[0])); </span></li>
<li><span> }, </span></li>
<li><span> error: <span class="keyword">function</span><span>(request) { </span></span></li>
<li><span> <span class="comment">//jsonp 方式此方法不被触发.原因可能是dataType如果指定为jsonp的话,就已经不是ajax事件了</span><span> </span></span></li>
<li><span> <span class="comment">//请求出错处理</span><span> </span></span></li>
<li><span> alert(<span class="string">&#8220;请求出错(请检查相关度网络状况.)&#8221;</span><span>); </span></span></li>
<li><span> } </span></li>
<li><span> }); </span></li>
<li><span> </span></li>
<li><span> }); </span></li>
<li><span>&lt;/script&gt; </span></li>
</ol>
</div>
<pre class="js" style="display: none;">  &lt;script&gt;
    $(function() {
      //      $.getJSON("http://10.128.3.104/edi/rest/GetBillCaseInfo?_out=json&amp;_callback=?", function(json) {
      //        alert(json.ROWSET.ROW[0].CaseName);
      //      });

      $.ajax({
        async:false,
        //url: 'http://10.128.3.104/edi/rest/GetBillCaseInfo', //跨域的dns/document!searchJSONResult.action,
        url: 'testjson.do',
        type: "GET",
        dataType: 'jsonp',
        jsonp: '_callback',
        data: '_out=json',
        timeout: 5000,
        header: { 'Authorization': 'Basic YWRtaW46YWRtaW4xMjM='},
        beforeSend: function(request) {
          //jsonp 方式此方法不被触发.原因可能是dataType如果指定为jsonp的话,就已经不是ajax事件了
        },
        success: function (json) {  //客户端jquery预先定义好的callback函数,成功获取跨域服务器上的json数据后,会动态执行这个callback函数
          alert($.toJSON(json));
          alert($.toJSON(json.ROWSET.ROW[0]));
        },
        error: function(request) {
          //jsonp 方式此方法不被触发.原因可能是dataType如果指定为jsonp的话,就已经不是ajax事件了
          //请求出错处理
          alert("请求出错(请检查相关度网络状况.)");
        }
      });

    });
  &lt;/script&gt;</pre>
<p><span style="background-color: #ff0000;">Extjs的代码:</span></p>
<div class="dp-highlighter">
<div class="bar">
<div class="tools">Js代码 <object width="14" height="15" data="http://wjw465150.javaeye.com/javascripts/syntaxhighlighter/clipboard_new.swf" type="application/x-shockwave-flash"><param name="flashvars" value="clipboard=%20%20%20%20%20%20ss%20%3D%20new%20Ext.data.ScriptTagProxy(%7B%0A%20%20%20%20%20%20%20%20%2F%2Furl%3A%20'http%3A%2F%2F10.128.3.104%2Fedi%2Frest%2FGetBillCaseInfo'%2C%0A%20%20%20%20%20%20%20%20url%3A%20'testjson.do'%2C%0A%20%20%20%20%20%20%20%20callbackParam%3A%20%22_callback%22%2C%0A%20%20%20%20%20%20%20%20headers%3A%20%7B%20'Authorization'%3A%20'Basic%20YWRtaW46YWRtaW4xMjM%3D'%7D%0A%20%20%20%20%20%20%7D)%3B%0A%20%20%20%20%20%20ss.load(%7B'_out'%3A%20'json'%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20new%20Ext.data.JsonReader(%7Broot%3A%22ROWSET.ROW%22%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%5B%7Bname%3A%20'CaseCode'%2C%20mapping%3A%20'CaseCode'%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7Bname%3A%20'CaseName'%2C%20mapping%3A%20'CaseName'%7D%5D)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20function(recordsBlock%2C%20arg%2C%20isok)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20alert(Ext.encode(recordsBlock))%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20alert(Ext.encode(recordsBlock.records%5B0%5D.data))%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20)%3B%0A%0A%20%20%20%20%20%20Ext.Ajax.request(%7B%0A%20%20%20%20%20%20%20%20url%3A%20'http%3A%2F%2F10.128.3.104%2Fedi%2Frest%2FGetBillCaseInfo'%2C%0A%20%20%20%20%20%20%20%20%2F%2Furl%3A%20'testjson.do'%2C%0A%20%20%20%20%20%20%20%20scriptTag%3A%20true%2C%0A%20%20%20%20%20%20%20%20success%3A%20function(req)%20%7B%0A%20%20%20%20%20%20%20%20%20%20alert(req.responseText)%3B%0A%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20failure%3A%20function(req)%20%7B%0A%20%20%20%20%20%20%20%20%20%20alert(req.responseText)%3B%0A%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20headers%3A%20%7B%20'Authorization'%3A%20'Basic%20YWRtaW46YWRtaW4xMjM%3D'%7D%2C%0A%20%20%20%20%20%20%20%20params%3A%20%7B%20_out%3A%20'json'%20%7D%0A%20%20%20%20%20%20%7D)%3B%0A" /><param name="src" value="http://wjw465150.javaeye.com/javascripts/syntaxhighlighter/clipboard_new.swf" /><param name="quality" value="high" /></object></div>
</div>
<ol class="dp-c">
<li><span><span>ss = </span><span class="keyword">new</span><span> Ext.data.ScriptTagProxy({ </span></span></li>
<li><span> <span class="comment">//url: &#8217;http://10.128.3.104/edi/rest/GetBillCaseInfo&#8217;,</span><span> </span></span></li>
<li><span> url: <span class="string">&#8216;testjson.do&#8217;</span><span>, </span></span></li>
<li><span> callbackParam: <span class="string">&#8220;_callback&#8221;</span><span>, </span></span></li>
<li><span> headers: { <span class="string">&#8216;Authorization&#8217;</span><span>: </span><span class="string">&#8216;Basic YWRtaW46YWRtaW4xMjM=&#8217;</span><span>} </span></span></li>
<li><span>}); </span></li>
<li><span>ss.load({<span class="string">&#8216;_out&#8217;</span><span>: </span><span class="string">&#8216;json&#8217;</span><span>}, </span></span></li>
<li><span> <span class="keyword">new</span><span> Ext.data.JsonReader({root:</span><span class="string">&#8220;ROWSET.ROW&#8221;</span><span>}, </span></span></li>
<li><span> [{name: <span class="string">'CaseCode'</span><span>, mapping: </span><span class="string">'CaseCode'</span><span>}, </span></span></li>
<li><span> {name: <span class="string">'CaseName'</span><span>, mapping: </span><span class="string">'CaseName'</span><span>}]), </span></span></li>
<li><span> <span class="keyword">function</span><span>(recordsBlock, arg, isok) { </span></span></li>
<li><span> alert(Ext.encode(recordsBlock)); </span></li>
<li><span> alert(Ext.encode(recordsBlock.records[0].data)); </span></li>
<li><span> } </span></li>
<li><span> ); </span></li>
<li><span> </span></li>
<li><span>Ext.Ajax.request({ </span></li>
<li><span> url: <span class="string">&#8216;http://10.128.3.104/edi/rest/GetBillCaseInfo&#8217;</span><span>, </span></span></li>
<li><span> <span class="comment">//url: &#8217;testjson.do&#8217;,</span><span> </span></span></li>
<li><span> scriptTag: <span class="keyword">true</span><span>, </span></span></li>
<li><span> success: <span class="keyword">function</span><span>(req) { </span></span></li>
<li><span> alert(req.responseText); </span></li>
<li><span> }, </span></li>
<li><span> failure: <span class="keyword">function</span><span>(req) { </span></span></li>
<li><span> alert(req.responseText); </span></li>
<li><span> }, </span></li>
<li><span> headers: { <span class="string">&#8216;Authorization&#8217;</span><span>: </span><span class="string">&#8216;Basic YWRtaW46YWRtaW4xMjM=&#8217;</span><span>}, </span></span></li>
<li><span> params: { _out: <span class="string">&#8216;json&#8217;</span><span> } </span></span></li>
<li><span>}); </span></li>
</ol>
</div>
<pre class="js" style="display: none;">      ss = new Ext.data.ScriptTagProxy({
        //url: 'http://10.128.3.104/edi/rest/GetBillCaseInfo',
        url: 'testjson.do',
        callbackParam: "_callback",
        headers: { 'Authorization': 'Basic YWRtaW46YWRtaW4xMjM='}
      });
      ss.load({'_out': 'json'},
              new Ext.data.JsonReader({root:"ROWSET.ROW"},
                      [{name: 'CaseCode', mapping: 'CaseCode'},
                        {name: 'CaseName', mapping: 'CaseName'}]),
              function(recordsBlock, arg, isok) {
                alert(Ext.encode(recordsBlock));
                alert(Ext.encode(recordsBlock.records[0].data));
              }
              );

      Ext.Ajax.request({
        url: 'http://10.128.3.104/edi/rest/GetBillCaseInfo',
        //url: 'testjson.do',
        scriptTag: true,
        success: function(req) {
          alert(req.responseText);
        },
        failure: function(req) {
          alert(req.responseText);
        },
        headers: { 'Authorization': 'Basic YWRtaW46YWRtaW4xMjM='},
        params: { _out: 'json' }
      });</pre>
<p><span style="background-color: #ff0000;">注意:无论是jQuery还是Extjs都不能发送自定义HTTP的信息,因为他们都是通过动态生成&lt;scripe&gt;标签的方式来实现跨域的访问!</span></p>
<hr />
<p>© <a href="http://www.iwanna.cn">我想网</a> Akon 所有 , 2009. |
<a href="http://www.iwanna.cn/archives/2009/05/20/1107/">永久链接</a> |
<a href="http://www.iwanna.cn/archives/2009/05/20/1107/#comments">没有评论</a> |
提交到
<a rel="nofollow" target="_blank" href="http://www.google.com/reader/view/feed/http://www.iwanna.cn/archives/2009/05/20/1107/">Google Reader</a>
<a rel="nofollow" target="_blank" href="http://www.xianguo.com/subscribe.php?url=http://www.iwanna.cn/archives/2009/05/20/1107/">鲜果</a>
<a rel="nofollow" target="_blank" href="http://www.zhuaxia.com/add_channel.php?url=http://www.iwanna.cn/archives/2009/05/20/1107/">抓虾</a>
<hr />
<script type="text/javascript"><!--
google_ad_client = "pub-2057344547305288";
/* 336x280,iwanna feed,created 10/3/10 */
google_ad_slot = "9738886183";
google_ad_width = 336;
google_ad_height = 280;
//-->
</script>
<script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script>
<hr />
</p>
<p><small>Feed enhanced by <a href='http://planetozh.com/blog/my-projects/wordpress-plugin-better-feed-rss/'>Better Feed</a> from  <a href='http://planetozh.com/blog/'>Ozh</a></small></p>
]]></content:encoded>
			<wfw:commentRss>http://www.iwanna.cn/archives/2009/05/20/1107/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>ajax与json配合使用最简单实现</title>
		<link>http://www.iwanna.cn/archives/2009/04/09/316/</link>
		<comments>http://www.iwanna.cn/archives/2009/04/09/316/#comments</comments>
		<pubDate>Thu, 09 Apr 2009 04:06:55 +0000</pubDate>
		<dc:creator>seasun</dc:creator>
				<category><![CDATA[Ajax]]></category>
		<category><![CDATA[Json]]></category>

		<guid isPermaLink="false">http://www.iwanna.cn/?p=316</guid>
		<description><![CDATA[//ajax声明 var xmlHttp; function createXMLHttpRequest() { if (window.ActiveXObject) { xmlHttp = new ActiveXObject(&#8220;Microsoft.XMLHTTP&#8221;); } else if (window.XMLHttpRequest) { xmlHttp = new XMLHttpRequest(); } } //javascript调用执行back()方法启动 ajax function back() { var url=&#8221;/websys/main/actionurl.do?paraname=123&#8243;; createXMLHttpRequest(); xmlHttp.open(&#8220;GET&#8221;, url); xmlHttp.onreadystatechange =callback; xmlHttp.send(null); } //回掉函数 function callback(){ if (xmlHttp.readyState == 4) { if (xmlHttp.status == 200) { var resstr=xmlHttp.responseText; var ress=eval(&#8220;(&#8220;+resstr+&#8221;)&#8221;); [...]]]></description>
			<content:encoded><![CDATA[<p>//ajax声明<br />
var <a href="http://www.iwanna.cn/tags/xmlhttp/" class="st_tag internal_tag" rel="tag" title="标签 XMLHTTP 下的日志">xmlHttp</a>; function createXMLHttpRequest() {<br />
if (window.ActiveXObject) {<br />
xmlHttp = new ActiveXObject(&#8220;Microsoft.XMLHTTP&#8221;);<br />
} else if (window.XMLHttpRequest) {<br />
xmlHttp = new XMLHttpRequest();<br />
}<br />
}<br />
//javascript调用执行back()方法启动<br />
<a href="http://www.iwanna.cn/tags/ajax/" class="st_tag internal_tag" rel="tag" title="标签 Ajax 下的日志">ajax</a> function back() {<br />
var url=&#8221;/websys/main/actionurl.do?paraname=123&#8243;; createXMLHttpRequest(); xmlHttp.open(&#8220;GET&#8221;, url); xmlHttp.onreadystatechange =callback; xmlHttp.send(null);<br />
}<br />
//回掉函数 function callback(){<br />
if (xmlHttp.readyState == 4) {<br />
if (xmlHttp.status == 200) {<br />
var resstr=xmlHttp.responseText;<br />
var ress=eval(&#8220;(&#8220;+resstr+&#8221;)&#8221;);<br />
if(ress.msg==false){<br />
alert(ress.value);<br />
}else{<br />
alert(ress.value);<br />
}<br />
}<br />
}<br />
//后台action<br />
public ActionForward execute(&#8230;&#8230;.)<br />
throws IOException  {<br />
String paravalue=rerquest.getParameter(&#8220;paraname&#8221;);<br />
PrintWriter out=response.getWriter();<br />
if(paravalue.equals(&#8220;123&#8243;))  {<br />
out.print(&#8220;{msg:&#8217;success&#8217;,value:&#8217;oknow!&#8217;}&#8221;);<br />
return null;<br />
}  else  {<br />
out.print(&#8220;{msg:error,value:&#8217;error!&#8217;}&#8221;);<br />
}<br />
return null;<br />
}<br />
return null;<br />
}</p>
<hr />
<p>© <a href="http://www.iwanna.cn">我想网</a> Akon 所有 , 2009. |
<a href="http://www.iwanna.cn/archives/2009/04/09/316/">永久链接</a> |
<a href="http://www.iwanna.cn/archives/2009/04/09/316/#comments">没有评论</a> |
提交到
<a rel="nofollow" target="_blank" href="http://www.google.com/reader/view/feed/http://www.iwanna.cn/archives/2009/04/09/316/">Google Reader</a>
<a rel="nofollow" target="_blank" href="http://www.xianguo.com/subscribe.php?url=http://www.iwanna.cn/archives/2009/04/09/316/">鲜果</a>
<a rel="nofollow" target="_blank" href="http://www.zhuaxia.com/add_channel.php?url=http://www.iwanna.cn/archives/2009/04/09/316/">抓虾</a>
<hr />
<script type="text/javascript"><!--
google_ad_client = "pub-2057344547305288";
/* 336x280,iwanna feed,created 10/3/10 */
google_ad_slot = "9738886183";
google_ad_width = 336;
google_ad_height = 280;
//-->
</script>
<script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script>
<hr />
</p>
<p><small>Feed enhanced by <a href='http://planetozh.com/blog/my-projects/wordpress-plugin-better-feed-rss/'>Better Feed</a> from  <a href='http://planetozh.com/blog/'>Ozh</a></small></p>
]]></content:encoded>
			<wfw:commentRss>http://www.iwanna.cn/archives/2009/04/09/316/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Ajax之XMLHTTP学习理解</title>
		<link>http://www.iwanna.cn/archives/2009/04/09/302/</link>
		<comments>http://www.iwanna.cn/archives/2009/04/09/302/#comments</comments>
		<pubDate>Thu, 09 Apr 2009 03:04:55 +0000</pubDate>
		<dc:creator>seasun</dc:creator>
				<category><![CDATA[Ajax]]></category>
		<category><![CDATA[XMLHTTP]]></category>

		<guid isPermaLink="false">http://www.iwanna.cn/?p=302</guid>
		<description><![CDATA[在.JS文件或者网页中写入如下脚本 //定义XMLHttp实例 var xmlHttp; function createXMLHttpRequest(){ //开始初始化XMLHttpRequest对象 if(window.ActiveXObject){ //IE浏览器 xmlHttp = new ActiveXObject(&#8220;Microsoft.XMLHTTP&#8221;); }else if(window.XMLHttpRequest){ //Mozilla浏览器 xmlHttp = new XMLHttpRequest(); } if(xmlHttp){ xmlHttp.open(&#8220;GET&#8221;,url,false); xmlHttp.onreadystatechange=function(){setState(greens,reds,contains)}; xmlHttp.send(null); } } //回调函数举例 //返回的4种状态 function setState(greens,reds,contains){ var contains = document.getElementById(&#8220;contain&#8221;); if(xmlHttp.readyState == 0){ contains.innerHTML = &#8220;正在初始化&#8221;; } if(xmlHttp.readyState == 1){ contains.innerHTML = &#8220;正在准备发送请求&#8221;; } if(xmlHttp.readyState == 2){ contains.innerHTML = &#8220;正在发送请求&#8221;; [...]]]></description>
			<content:encoded><![CDATA[<p>在.JS文件或者网页中写入如下脚本</p>
<p><span><span><span><span>//</span><span>定义XMLHttp实例</span><br />
var <a href="http://www.iwanna.cn/tags/xmlhttp/" class="st_tag internal_tag" rel="tag" title="标签 XMLHTTP 下的日志">xmlHttp</a>;<br />
function createXMLHttpRequest(){<br />
<span>//</span><span>开始初始化XMLHttpRequest对象</span><br />
if(window.ActiveXObject){<br />
<span>//</span><span>IE浏览器</span><br />
xmlHttp = new ActiveXObject(&#8220;Microsoft.XMLHTTP&#8221;);<br />
}else if(window.XMLHttpRequest){<br />
<span>//</span><span>Mozilla浏览器</span><br />
xmlHttp = new XMLHttpRequest();<br />
}<br />
if(xmlHttp){<br />
xmlHttp.open(&#8220;GET&#8221;,url,false);<br />
xmlHttp.onreadystatechange=function(){setState(greens,reds,contains)};<br />
xmlHttp.send(null);<br />
}<br />
}<br />
</span></span><span style="background-color: #ffffff;"><span><span><span>//回调函数举例<br />
//返回的4种状态<br />
</span>function setState(greens,reds,contains){<br />
var contains = document.getElementById(&#8220;contain&#8221;);<br />
if(xmlHttp.readyState == 0){<br />
contains.innerHTML = &#8220;正在初始化&#8221;;<br />
}<br />
if(xmlHttp.readyState == 1){<br />
contains.innerHTML = &#8220;正在准备发送请求&#8221;;<br />
}<br />
if(xmlHttp.readyState == 2){<br />
contains.innerHTML = &#8220;正在发送请求&#8221;;<br />
}<br />
if(xmlHttp.readyState == 3){<br />
contains.innerHTML = &#8220;正在接收数据&#8221;;<br />
}<br />
if(xmlHttp.readyState == 4){<br />
<span>//</span><span>信息已经成功返回，开始处理信息</span><br />
if(xmlHttp.status == 200){<br />
contains.innerHTML = xmlHttp.responstText; <span>//返回值</span><br />
}<br />
}<br />
}</span></span></span></span><span style="background-color: #ffffff; color: #999999; "> </span></p>
<p><span>DOM的一些详解</span></p>
<p><span><span>(1)设置<br />
</span> </span><span><span style="color: #3366ff;">在从服务器返回数据的同时，还要进行设置，使浏览器不会在本地缓存结果，response.setHeader(&#8220;Cache-Control&#8221;,&#8221;no-cache&#8221;);response.setHeader(&#8220;pragma&#8221;,&#8221;no-cache&#8221;);<br />
XMLHttpRequest对象提供２个可以用来访问服务器响应的属性，一个是responseText将响应提供一个串，结合HTML元 素的innerHTML属性，非常有用． (document.getElementById(&#8220;results&#8221;).innerHTML=xmlHttp.responseText).一个是 responseXML将响应提供为一个XML对象．<br />
</span><br />
</span><span><span>(2)DOM元素的一些有用的属性<br />
</span> </span><span><span style="color: #3366ff;">childNodes&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;返回当前元素所有子元素的数组<br />
firstChild   &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;返回当前元素的第一个下级子元素<br />
lastChild   &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;返回当前元素的最后一个子元素<br />
nextSibling&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;返回紧跟在当前元素后面的元素<br />
nodeValue&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-指定表示元素值的读／写属性<br />
parentNode &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;返回元素的父节点<br />
previousSibling&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-返回紧邻当前元素之前的元素</span></span></p>
<p><span><span>(3)用于遍历XML文档的DOM元素方法(document)<br />
</span> </span><span><span style="color: #3366ff;">getElementById(id)&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;获取有指定唯一ID属性值文档中的元素<br />
getElementsByTagName(name)&#8212;&#8212;&#8212;&#8212;&#8211;返回当前元素中有指定标记名的子元素的数组<br />
hasChildNodes()&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;返回一个布尔值，指定元素是否有子元素<br />
getAttribute(name)&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;返回元素的属性值，属性由name指定</span></span></p>
<p><span><span>(4)动态创建内容时所用的W3C DOM属性和方法<br />
</span> document.createElement(tagName)&#8212;&#8212;&#8212;-文档对象上的createElement方法可以创建由tagName指定的元素<br />
document.createTextNode(text)&#8212;&#8212;&#8212;&#8212;&#8211;文档对象的createTextNode方法会创建一个包含静态文本的节点．<br />
&lt;element&gt;&lt;/element&gt;.appendChild(childNode)&#8212;&#8212;&#8212;该方法将指定的节点增加到当前元素的子节点列表．<br />
&lt;element&gt;&lt;/element&gt;.getAttribute(name)|.setAttribute(name,value)&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;获得和设置元素中name属性的值<br />
&lt;element&gt;&lt;/element&gt;.insertBefore(newNode,targetNode)&#8212;&#8211;这个方法将节点newNode作为当前元素的子节点插到targetNode元素前面。<br />
&lt;element&gt;&lt;/element&gt;.removeAttribute(name)&#8212;&#8211;这个方法从元素中删除属性name<br />
&lt;element&gt;&lt;/element&gt;.removeChild(childNode)&#8212;&#8211;这个方法从元素中删除子元素childNode<br />
&lt;element&gt;&lt;/element&gt;.replaceChild(newNode,oldNode)&#8212;&#8211;这个方法将节点oldNode替换为节点newNode<br />
&lt;element&gt;&lt;/element&gt;.hasChildNodes()这个方法返回一个布尔值，指示元素是否有子元素</span></p>
<p><span><span>XMLHttpRequest对象的一些典型方法</span></span></p>
<p><span><span>(1)、void open(String method,String url,boolean asynch);这个方法会建立对服务器的调用。<br />
第一个参数表示要提供调用的特定方法(get,post,put)<br />
第二个参数表示要提供所调用资源的url<br />
第三个参数表示是异步(true)还是同步(false)<br />
(2)、void send(content):这个方法会向具体服务器发出请求。可选参数会作为请求体的一部分发送。<br />
(3)、void setRequestHeader(String header ,String value):这个方法为HTTP请求中一个给定的首部设置值<br />
第一个参数表示要设置的首部。<br />
第二个参数表示要 在首部中放置的值。这个方法必须在调用open()之后才能调用。<br />
XMLHttpRequest对象的一些典型属性：<br />
(1)、onreadystatechange:每个状态改变时都会触发这个事件处理器，通常会调用一个javascript函数，用来处理返回时要调用的函数。<br />
(2)、readyState:请求的状态。有5个值：0=未初始化，1=正在加载，2=已经加载，3=交互中，4=完成。<br />
(3)、responseText:服务器的响应，表示为一个串<br />
(4)、responseXML:服务器的响应，表示为一个XML，这个对象可以解析为一个DOM对象。<br />
(5)、status:服务器的Http状态码(200对应ok，404对应Not Found(未找到))</span></span></p>
<hr />
<p>© <a href="http://www.iwanna.cn">我想网</a> Akon 所有 , 2009. |
<a href="http://www.iwanna.cn/archives/2009/04/09/302/">永久链接</a> |
<a href="http://www.iwanna.cn/archives/2009/04/09/302/#comments">没有评论</a> |
提交到
<a rel="nofollow" target="_blank" href="http://www.google.com/reader/view/feed/http://www.iwanna.cn/archives/2009/04/09/302/">Google Reader</a>
<a rel="nofollow" target="_blank" href="http://www.xianguo.com/subscribe.php?url=http://www.iwanna.cn/archives/2009/04/09/302/">鲜果</a>
<a rel="nofollow" target="_blank" href="http://www.zhuaxia.com/add_channel.php?url=http://www.iwanna.cn/archives/2009/04/09/302/">抓虾</a>
<hr />
<script type="text/javascript"><!--
google_ad_client = "pub-2057344547305288";
/* 336x280,iwanna feed,created 10/3/10 */
google_ad_slot = "9738886183";
google_ad_width = 336;
google_ad_height = 280;
//-->
</script>
<script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script>
<hr />
</p>
<p><small>Feed enhanced by <a href='http://planetozh.com/blog/my-projects/wordpress-plugin-better-feed-rss/'>Better Feed</a> from  <a href='http://planetozh.com/blog/'>Ozh</a></small></p>
]]></content:encoded>
			<wfw:commentRss>http://www.iwanna.cn/archives/2009/04/09/302/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>几种流行的AJAX框架jQuery,Mootools,Dojo,Ext JS的对比</title>
		<link>http://www.iwanna.cn/archives/2009/04/09/280/</link>
		<comments>http://www.iwanna.cn/archives/2009/04/09/280/#comments</comments>
		<pubDate>Thu, 09 Apr 2009 01:49:06 +0000</pubDate>
		<dc:creator>seasun</dc:creator>
				<category><![CDATA[Ajax]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Dojo]]></category>
		<category><![CDATA[ExtJS]]></category>
		<category><![CDATA[JQuery]]></category>
		<category><![CDATA[Mootools]]></category>

		<guid isPermaLink="false">http://www.iwanna.cn/?p=280</guid>
		<description><![CDATA[AJAX是web20的基石，现在网上流行几种开源的AJAX框架，比如：jQuery,Mootools,Dojo,Ext JS等等，那么我们到底在什么情况下该使用那个框架？以下是一组摘抄的数据： Ajaxian在2007年底对Ajax工具进行了调查，部分调查结果见下表（其中数字为调查者使用该工具的百分比，详细的请参见网页）：http://ajaxian.com/archives/2007-ajax-tools-usage-survey-results Prototype jQuery Ext Script.aculo.us Mootools YUI JSON Dojo Backbase 34.1% 29.3% 22.5% 22.3% 14.3% 13% 12.9% 11.8% 8.3% 其中Prototype使用率最高，很大程度上是因为它是最早成熟的框架，很多以前在项目中采用，所以现在一直在用 让我们来看看选择AJAX框架的基础： 你的项目需求（即你需要哪些特性，例如是否要求做出精美的界面、特效或其它功能） 是否支持A等级的浏览器（IE, Firefox等）? 文档的质量：是否完善（包含教程，API，代码示例等） 框架的可扩展性如何？为框架写插件容易吗？ 你是否喜欢它的API的风格？ 能大多程度上统一你的JavaScript代码的风格？ 框架大小（太大的框架导致用户下载时间的延长） 框架是否强迫你改变写HTML的方式（Dojo就是这样）？ 代码执行速度：性能如何？ 代码是否为模块化（Mootools为高度模块化）？代码可重用性如何？ 一、jQuery 主页：http://jquery.com/ 设计思想 简洁的思想：几乎所有操作都是以选择DOM元素（有强大的Selector）开始，然后是对其的操作（Chaining等特性）。 优点 小，压缩后代码只有20多k（无压缩代码94k）。 Selector和DOM操作的方便：jQuery的Selector与mootools的Element.Selectors.js比较，CSS Selector, XPath Selector（1.2后已删除） Chaining：总是返回一个jQuery对象，可以连续操作。 文档的完整，易用性（每个API都有完整的例子，这是其它框架现在不能比的），而且网上还有很多其它的文档，书籍。 应用的广泛，包括google code也使用了jQuery。 使用jQuery的站点：http://docs.jquery.com/Sites_Using_jQuery 核心的开发团队和核心人员：John Resig等。 简洁和简短的语法，容易记。 可扩展性：有大量用户开发的插件可供使用（http://jquery.com/plugins/） jQuery UI（http://jquery.com/plugins/，基于jQuery，但和核心的jQuery是独立的），不断发展中。 [...]]]></description>
			<content:encoded><![CDATA[<p>AJAX是web20的基石，现在网上流行几种开源的AJAX框架，比如：<a href="http://www.iwanna.cn/tags/jquery/" class="st_tag internal_tag" rel="tag" title="标签 JQuery 下的日志">jQuery</a>,<a href="http://www.iwanna.cn/tags/mootools/" class="st_tag internal_tag" rel="tag" title="标签 Mootools 下的日志">Mootools</a>,<a href="http://www.iwanna.cn/tags/dojo/" class="st_tag internal_tag" rel="tag" title="标签 Dojo 下的日志">Dojo</a>,Ext JS等等，那么我们到底在什么情况下该使用那个框架？以下是一组摘抄的数据：</p>
<p>Ajaxian在2007年底对Ajax工具进行了调查，部分调查结果见下表（其中数字为调查者使用该工具的百分比，详细的请参见网页）：<a href="http://ajaxian.com/archives/2007-ajax-tools-usage-survey-results">http://ajaxian.com/archives/2007-ajax-tools-usage-survey-results<span id="more-280"></span></a></p>
<table style="width: 403.75pt; border-collapse: collapse;" border="1" cellspacing="0" cellpadding="0" width="538">
<tbody>
<tr>
<td style="border: 0.5pt solid black; padding: 0cm 5.4pt; width: 51.7pt; background-color: transparent;" width="69" valign="top"><span><span style="font-size: small;"><span style="color: #000000;"><span style="font-family: Times New Roman;">Prototype</span></span></span></span></td>
<td style="border-color: black black black #ece9d8; border-top: 0.5pt solid black; border-right: 0.5pt solid black; border-bottom: 0.5pt solid black; padding: 0cm 5.4pt; width: 45.1pt; background-color: transparent;" width="60" valign="top"><span><span style="font-size: small;"><span style="color: #000000;"><span style="font-family: Times New Roman;">jQuery</span></span></span></span></td>
<td style="border-color: black black black #ece9d8; border-top: 0.5pt solid black; border-right: 0.5pt solid black; border-bottom: 0.5pt solid black; padding: 0cm 5.4pt; width: 29.2pt; background-color: transparent;" width="39" valign="top"><span><span style="font-size: small;"><span style="color: #000000;"><span style="font-family: Times New Roman;">Ext</span></span></span></span></td>
<td style="border-color: black black black #ece9d8; border-top: 0.5pt solid black; border-right: 0.5pt solid black; border-bottom: 0.5pt solid black; padding: 0cm 5.4pt; width: 73.25pt; background-color: transparent;" width="98" valign="top"><span><span style="font-size: small;"><span style="color: #000000;"><span style="font-family: Times New Roman;">Script.aculo.us</span></span></span></span></td>
<td style="border-color: black black black #ece9d8; border-top: 0.5pt solid black; border-right: 0.5pt solid black; border-bottom: 0.5pt solid black; padding: 0cm 5.4pt; width: 54.25pt; background-color: transparent;" width="72" valign="top"><span><span style="font-size: small;"><span style="color: #000000;"><span style="font-family: Times New Roman;">Mootools</span></span></span></span></td>
<td style="border-color: black black black #ece9d8; border-top: 0.5pt solid black; border-right: 0.5pt solid black; border-bottom: 0.5pt solid black; padding: 0cm 5.4pt; width: 29.5pt; background-color: transparent;" width="39" valign="top"><span><span style="font-size: small;"><span style="color: #000000;"><span style="font-family: Times New Roman;">YUI</span></span></span></span></td>
<td style="border-color: black black black #ece9d8; border-top: 0.5pt solid black; border-right: 0.5pt solid black; border-bottom: 0.5pt solid black; padding: 0cm 5.4pt; width: 35.9pt; background-color: transparent;" width="48" valign="top"><span><span style="font-size: small;"><span style="color: #000000;"><span style="font-family: Times New Roman;"><a href="http://www.iwanna.cn/tags/json/" class="st_tag internal_tag" rel="tag" title="标签 Json 下的日志">JSON</a></span></span></span></span></td>
<td style="border-color: black black black #ece9d8; border-top: 0.5pt solid black; border-right: 0.5pt solid black; border-bottom: 0.5pt solid black; padding: 0cm 5.4pt; width: 33.8pt; background-color: transparent;" width="45" valign="top"><span><span style="font-size: small;"><span style="color: #000000;"><span style="font-family: Times New Roman;">Dojo</span></span></span></span></td>
<td style="border-color: black black black #ece9d8; border-top: 0.5pt solid black; border-right: 0.5pt solid black; border-bottom: 0.5pt solid black; padding: 0cm 5.4pt; width: 51.05pt; background-color: transparent;" width="68" valign="top"><span><span style="font-size: small;"><span style="color: #000000;"><span style="font-family: Times New Roman;">Backbase</span></span></span></span></td>
</tr>
<tr>
<td style="border-color: #ece9d8 black black; border-left: 0.5pt solid black; border-right: 0.5pt solid black; border-bottom: 0.5pt solid black; padding: 0cm 5.4pt; width: 51.7pt; background-color: transparent;" width="69" valign="top"><span><span style="font-size: small;"><span style="color: #000000;"><span style="font-family: Times New Roman;">34.1%</span></span></span></span></td>
<td style="border-color: #ece9d8 black black #ece9d8; border-right: 0.5pt solid black; border-bottom: 0.5pt solid black; padding: 0cm 5.4pt; width: 45.1pt; background-color: transparent;" width="60" valign="top"><span><span style="font-size: small;"><span style="color: #000000;"><span style="font-family: Times New Roman;">29.3%</span></span></span></span></td>
<td style="border-color: #ece9d8 black black #ece9d8; border-right: 0.5pt solid black; border-bottom: 0.5pt solid black; padding: 0cm 5.4pt; width: 29.2pt; background-color: transparent;" width="39" valign="top"><span><span style="font-size: small;"><span style="color: #000000;"><span style="font-family: Times New Roman;">22.5%</span></span></span></span></td>
<td style="border-color: #ece9d8 black black #ece9d8; border-right: 0.5pt solid black; border-bottom: 0.5pt solid black; padding: 0cm 5.4pt; width: 73.25pt; background-color: transparent;" width="98" valign="top"><span><span style="font-size: small;"><span style="color: #000000;"><span style="font-family: Times New Roman;">22.3%</span></span></span></span></td>
<td style="border-color: #ece9d8 black black #ece9d8; border-right: 0.5pt solid black; border-bottom: 0.5pt solid black; padding: 0cm 5.4pt; width: 54.25pt; background-color: transparent;" width="72" valign="top"><span><span style="font-size: small;"><span style="color: #000000;"><span style="font-family: Times New Roman;">14.3%</span></span></span></span></td>
<td style="border-color: #ece9d8 black black #ece9d8; border-right: 0.5pt solid black; border-bottom: 0.5pt solid black; padding: 0cm 5.4pt; width: 29.5pt; background-color: transparent;" width="39" valign="top"><span><span style="font-size: small;"><span style="color: #000000;"><span style="font-family: Times New Roman;">13%</span></span></span></span></td>
<td style="border-color: #ece9d8 black black #ece9d8; border-right: 0.5pt solid black; border-bottom: 0.5pt solid black; padding: 0cm 5.4pt; width: 35.9pt; background-color: transparent;" width="48" valign="top"><span><span style="font-size: small;"><span style="color: #000000;"><span style="font-family: Times New Roman;">12.9%</span></span></span></span></td>
<td style="border-color: #ece9d8 black black #ece9d8; border-right: 0.5pt solid black; border-bottom: 0.5pt solid black; padding: 0cm 5.4pt; width: 33.8pt; background-color: transparent;" width="45" valign="top"><span><span style="font-size: small;"><span style="color: #000000;"><span style="font-family: Times New Roman;">11.8%</span></span></span></span></td>
<td style="border-color: #ece9d8 black black #ece9d8; border-right: 0.5pt solid black; border-bottom: 0.5pt solid black; padding: 0cm 5.4pt; width: 51.05pt; background-color: transparent;" width="68" valign="top"><span><span style="font-size: small;"><span style="color: #000000;"><span style="font-family: Times New Roman;">8.3%</span></span></span></span></td>
</tr>
</tbody>
</table>
<p>其中Prototype使用率最高，很大程度上是因为它是最早成熟的框架，很多以前在项目中采用，所以现在一直在用</p>
<p>让我们来看看选择AJAX框架的基础：</p>
<p>你的项目需求（即你需要哪些特性，例如是否要求做出精美的界面、特效或其它功能）</p>
<p>是否支持A等级的浏览器（IE, Firefox等）?</p>
<p>文档的质量：是否完善（包含教程，API，代码示例等）</p>
<p>框架的可扩展性如何？为框架写插件容易吗？</p>
<p>你是否喜欢它的API的风格？</p>
<p>能大多程度上统一你的JavaScript代码的风格？</p>
<p>框架大小（太大的框架导致用户下载时间的延长）</p>
<p>框架是否强迫你改变写HTML的方式（Dojo就是这样）？</p>
<p>代码执行速度：性能如何？</p>
<p>代码是否为模块化（Mootools为高度模块化）？代码可重用性如何？</p>
<h1><span style="font-size: 20px;">一、jQuery</p>
<p>主页：</span><a href="http://jquery.com/"><span style="font-size: 20px;">http://jquery.com/</span></a></h1>
<p>设计思想</p>
<p>简洁的思想：几乎所有操作都是以选择DOM元素（有强大的Selector）开始，然后是对其的操作（Chaining等特性）。</p>
<p>优点</p>
<p>小，压缩后代码只有20多k（无压缩代码94k）。</p>
<p>Selector和DOM操作的方便：jQuery的Selector与mootools的Element.Selectors.js比较，CSS Selector, XPath Selector（1.2后已删除）</p>
<p>Chaining：总是返回一个jQuery对象，可以连续操作。</p>
<p>文档的完整，易用性（每个API都有完整的例子，这是其它框架现在不能比的），而且网上还有很多其它的文档，书籍。</p>
<p>应用的广泛，包括google code也使用了jQuery。</p>
<p>使用jQuery的站点：<a href="http://docs.jquery.com/Sites_Using_jQuery">http://docs.jquery.com/Sites_Using_jQuery</a></p>
<p>核心的开发团队和核心人员：John Resig等。</p>
<p>简洁和简短的语法，容易记。</p>
<p>可扩展性：有大量用户开发的插件可供使用（<a href="http://jquery.com/plugins/">http://jquery.com/plugins/</a>）</p>
<p>jQuery UI（<a href="http://jquery.com/plugins/">http://jquery.com/plugins/</a>，基于jQuery，但和核心的jQuery是独立的），不断发展中。</p>
<p>友好和活跃的社区：<a href="http://www.iwanna.cn/tags/google/" class="st_tag internal_tag" rel="tag" title="标签 Google 下的日志">google</a> groups: <a href="http://docs.jquery.com/Discussion">http://docs.jquery.com/Discussion</a></p>
<p>事件处理有很多方便的方法，如click，而不是单一的addEvent之类的。</p>
<p>缺点</p>
<p>由于设计思想是追求高效和简洁，没有面向对象的扩展。设计思路和Mootools不一样。</p>
<p>CSS Selector的速度稍微有些慢（但是现在速度已经大幅提高）</p>
<h2><span style="font-size: 24px;">Mootools</p>
<p>主页：</span><a href="http://mootools.net/"><span style="font-size: 24px;">http://mootools.net/</span></a></h2>
<p>设计思想</p>
<p>面向对象的设计思想。</p>
<p>优点</p>
<p>模块化，各模块代码非常独立，最小的核心只有8k，最大的优点是可选择使用哪些模块，用的时候只导入使用的模块即可，完整的也不到180k（没有压缩），压缩后不到70k。</p>
<p>语法的简洁，直观。</p>
<p>特效（Effects）：这一点比jQuery稍强，现在也正在开发Mootools UI（这应该是Ajax框架开发的一个趋势）。</p>
<p>代码写的优美，易阅读和修改。</p>
<p>文档的完整（最新的1.2beta的文档比以前更详细）。</p>
<p>活跃的社区：官网(<a href="http://forum.mootools.net/">http://forum.mootools.net/</a>)，还有一个IRC。</p>
<p>性能：见：<a href="http://mootools.net/slickspeed/">http://mootools.net/slickspeed/</a></p>
<p>缺点</p>
<p>修改了低层的一些类：如Array, String等，这也是设计思想的不同。</p>
<p>在DOM和CSS Selector上不如jQuery强大。</p>
<p><span style="font-size: 24px;">Dojo</span></p>
<p>主页：<a href="http://dojotoolkit.org/"><span style="font-size: 24px;">http://dojotoolkit.org/</span></a></p>
<p>优点</p>
<p>背后强大的支持：IBM、Sun、BEA等，这是非常重要的优势。</p>
<p>功能的强大，Full Stack的框架，扩展了DHTML的能力，例如：</p>
<p>支持与浏览器Back/Forward按钮的集成。</p>
<p>Dojo Offline，一个跨平台的离线存储API。</p>
<p>Chart组件，可以方便地在浏览器端生成图表。</p>
<p>基于SVG/VML的矢量图形库。</p>
<p>Google Maps、Yahoo! Maps组件，方便开发Mashup应用。</p>
<p>Comet支持，通过通用的Buyeux协议。</p>
<p>强大的UI（Dijit）。</p>
<p>面向对象的设计，统一的命名空间，包管理机制（The Package System and Custom Builds）</p>
<p>可扩展性。</p>
<p>缺点</p>
<p>复杂，学习曲线陡。</p>
<p>文档的极端不全，这是一个很大的问题。</p>
<p>API很多不稳定，各版本间改动较大，现在还不是一个成熟的框架。</p>
<p>侵入性太大，页面中大量使用dojo的属性，例如&lt;button dojoType=&#8221;dijit.form.Button&#8221; id=&#8221;helloButton&#8221;&gt;，如果将来dojo升级或者换一个框架时，负担会很大。</p>
<p>性能问题，由于dojo加载采用了同步的机制，会暂时锁定浏览器，导致CPU使用率达到100%。另外，很多Widget的速度很慢。</p>
<p><span style="font-size: 24px;">Ext JS</p>
<p>主页：</span><a href="http://extjs.com/"><span style="font-size: 24px;">http://extjs.com/</span></a></p>
<p>设计思想</p>
<p>组件化，推进RIA（Rich Internet Application）的应用。</p>
<p>优点</p>
<p>强大的UI，而且性能不错，这是其最大的优点。</p>
<p>速度快，管是UI还是其它模块。</p>
<p>100%面向对象和组件化的思想，一致的语法，全局的命名空间。</p>
<p>文档的完整，规范，方便。</p>
<p>核心的开发团队，Jack Slocum等。</p>
<p>活跃的社区，迅速增加的用户量。</p>
<p>模块化实现，可扩展性强。</p>
<p>所有的组件（widgets）都可直接使用，而无需进行设置（当然，用户可以选择重新配置）。</p>
<p>缺点</p>
<p>稍复杂。</p>
<p>为重量级的框架（包含大量UI），体积大。如果导入ext-all.js，压缩后也有近500k。</p>
<p>注意：EXT的商业使用：如果只是把extjs包含在自己的项目中，而且这个项目不是卖给用户做二次开发的工具箱，或组件库，就可以遵守LGPL协议免费使用；否则要付费。</p>
<p>总结</p>
<p>轻量级选择</p>
<p>轻量级的选择：主要是mootools和 jquery，由于它们的设计思想的不同，jQuery是追求简洁和高效，Mootools除了追求这些目标以外，其核心在于面向对象，所以jQuery 适合于快速开发，Mootools适合于稍大型和复杂的项目，其中需要面向对象的支持；另外，在Ajax的支持上，jQuery稍强一些；在Comet的 支持上，jQuery有相关的插件，Mootools目前没有，但是Comet的核心在于服务器的支持，浏览器端的接口很简单，开发相关的插件很简单。</p>
<p>在面向对象的Javascript Library中，mootools逐渐战胜了prototype（体积大，面向对象的设计不合理等），也包括script.acul.ous（基于prototype，实际上就是prototype上的UI库）。</p>
<p>面向RIA的框架</p>
<p>考虑纯JavaScripty库，目前主要是Dojo和ExtJS（还有YUI）。Dojo更适合企业应用和产品开发的需要，因为 离线存储、 DataGrid、2D、3D图形、Chart、Comet等组件对于企业应用来说都是很重要的（当然这些组件还要等一段时间才能稳定下来）。例 如，BEA基于Mashup技术开发的产品中已经使用了Dojo。</p>
<p><a href="http://www.iwanna.cn/tags/extjs/" class="st_tag internal_tag" rel="tag" title="标签 ExtJS 下的日志">ExtJS</a>：美观和&#8221;易用&#8221;，并且足够强大。在对UI有比较大的需求时，是首选。</p>
<hr />
<p>© <a href="http://www.iwanna.cn">我想网</a> Akon 所有 , 2009. |
<a href="http://www.iwanna.cn/archives/2009/04/09/280/">永久链接</a> |
<a href="http://www.iwanna.cn/archives/2009/04/09/280/#comments">没有评论</a> |
提交到
<a rel="nofollow" target="_blank" href="http://www.google.com/reader/view/feed/http://www.iwanna.cn/archives/2009/04/09/280/">Google Reader</a>
<a rel="nofollow" target="_blank" href="http://www.xianguo.com/subscribe.php?url=http://www.iwanna.cn/archives/2009/04/09/280/">鲜果</a>
<a rel="nofollow" target="_blank" href="http://www.zhuaxia.com/add_channel.php?url=http://www.iwanna.cn/archives/2009/04/09/280/">抓虾</a>
<hr />
<script type="text/javascript"><!--
google_ad_client = "pub-2057344547305288";
/* 336x280,iwanna feed,created 10/3/10 */
google_ad_slot = "9738886183";
google_ad_width = 336;
google_ad_height = 280;
//-->
</script>
<script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script>
<hr />
</p>
<p><small>Feed enhanced by <a href='http://planetozh.com/blog/my-projects/wordpress-plugin-better-feed-rss/'>Better Feed</a> from  <a href='http://planetozh.com/blog/'>Ozh</a></small></p>
]]></content:encoded>
			<wfw:commentRss>http://www.iwanna.cn/archives/2009/04/09/280/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>6个你必须用到AJAX的地方与6个不必用到的地方</title>
		<link>http://www.iwanna.cn/archives/2009/04/07/218/</link>
		<comments>http://www.iwanna.cn/archives/2009/04/07/218/#comments</comments>
		<pubDate>Tue, 07 Apr 2009 01:28:44 +0000</pubDate>
		<dc:creator>seasun</dc:creator>
				<category><![CDATA[Ajax]]></category>

		<guid isPermaLink="false">http://www.iwanna.cn/?p=218</guid>
		<description><![CDATA[现在距离gmail改变大家对使用网页应用程序的方式,已经有一年多了。但是目前很多网页应用程序,并没有使用充满活力的Ajax的优势,来代替以前沉闷的html功能。 下面是当前网页应用程序应该出现的地方： * 基于表单的交互 表单是很慢的，非常慢。尝试编辑位于del.icio.us上面的一个书签？点击编辑链接打开一个编辑书签的表单页面，然后编辑你的内容并点击提交按钮等待整个提交过程结束，最后返回上一页并向下滚动到你刚才编辑的书签那里查看内容是否已经正确更改。那AJAX呢？点击编辑链接马上开始更改标签内容，点击提交按钮开始异步传输标签编辑的内容并立即看到更改后的内容而无需重载整个页面。 * 深层树状导航 总而言之，带有深层树状导航的应用程序通常是一个噩梦。在大多数情况中简单平直的拓扑结构以及搜索/标记可以很好的工作。但是如果一个应用程序真正使用深层树状导航，使用JavaScript来管理拓扑ui(user interface用户接口)，则使用Ajax懒加载深层数据可以降低服务器的负载。举例来说，为了阅读一个只有一行的结果来加载整个一个新页面是非常耗时的。 * 实时用户对用户通讯 在一个允许用户创建实时讨论的信息公告系统中，迫使用户一次又一次的更新完页面看到答复是非常愚蠢的。回复应该是实时的，用户不应被迫总是去痴迷于刷新操作。即使是gmail这个已经对以前像hotmail/yahoo mail的收件箱刷新，刷新收件箱标记的操作有所改进，也并没有充分的使用Ajax的功能来提示有新邮件到达。 * 投票、是否选择、等级评价 如果Ajax提交过程没有一个协调的UI提示是非常糟糕的，通过使用Ajax来提交一个调查或是否选择可以减少提交过程等待的痛苦。通过减少点击的等待时间，Ajax应用程序变得越来越有交互性-如果要用40秒来提交一个投票，除非非常在意的话大多数人会选择放弃。如果只花1秒呢，非常大比例的人会乐于参加投票的。（我在Netflix versus有2008张电影投票在IMDb.com有210张电影投票） * 过滤和复杂数据操作 应用一个过滤、按日期排序、按日期和姓名排序、打开或关闭过滤器等等。任何一种高交换型操作应该交给JavaScript来处理而不是通过向服务器来提交一系列的请求。在查找或者操作大量数据的时候带来的视图上的改变最多不会超过30秒，Ajax真的使这些操作加速了。 * 普通录入时的提示/自动补齐 一些软件/JavaScript是擅长于帮助用户完成键入相同的文字或可以预测的文字的工作的。在del.icio.us 和 Gmail 中该功能是非常有益的，可以用来快速增加标记/email等。 对于一个频繁使用的应用程序诸如网页邮件客户端或博客阅读器来说，用户有充足的时间来学习如何使用新的UI概念但是他们却无法接受一个非常缓慢的反应速度。这种应用为Ajax变的更加普及起到了一个完美的杠杆作用。随着用户使用频率的增加，更多的Ajax部件应该加强用户的使用体验。 但是对于网页应用程序来说，把每件事甚至任何事都用JavaScript来实现也是没有意义的。Ajax只是针对一些特定的环境才能带来显著的帮助。在Ajax出现之前网页应用程序已经可以工作的很好了并且目前在网页开发中Ajax还存在着许多的缺陷和缺点。就算不从服务器端取得一个异步的信息数据流一个平直的html网页日志也可以工作的很好。对于文档或文档之间的跳转来说，老旧的纯HTML仍然是最好的选择。简单或很少使用的应用程序就算不用JavaScript同样可以很好的工作。 下面是一些不应该用到Ajax的地方： * 简单的表单 就算表单是Ajax技术的最大受益人，一个简单内容的表单，或提交订货单，或一次性的很少用到的表单都不应该使用以Ajax驱动的表单提交机制。总的来说，如果一个表单不是很长用，或已经工作的很好，那么就算使用Ajax也没有什么帮助。 * 搜索 实时搜索带来的痛苦要远大于他带来的帮助。这就是为什么Google Suggest还处于beta测试而并没有放在主页上的原因。在Start.com Live.com上搜索的时候你是不能使用返回按钮来查看上一次搜索或返回上一页的。或许还没有人来完成这项工作，但是完成这个工作应该是很困难的至少是不太明知的或者会因此带来更多的麻烦。（译注：现在已经有很多开源的框架可以实现历史记录功能） * 基本导航 总的来说，使用Ajax为一个基础的网站/程序做导航是一个可怕的念头。谁会把用来使自己的程序变的更好的时间花在编写代码模仿浏览器的行为上面？在基础页面中导航的操作中JavaScript是没有用的。 * 替换大量的信息 Ajax可以不用整页刷新来动态更新页面中改变的一小部分。但是如果一页上的大部分内容都需要更新，那为什么不从服务器那里获得一个新页面呢？ * 显示操作 虽然看上去Ajax是一个纯UI技术，其实不是这样的。他实际上是一个数据同步、操作、传输的技术。要想得到一个稳定的干净的网页程序，不使用 Ajax/JavaScript来直接完成用户接口是明智的。JavaScript可以分散分布并简单的操作XHTML/HTML DOM，根据CSS规则来决定如何让UI显示数据。查看 这里（http://www.sourcelabs.com/blogs/ajb/2005/08/powering_javascript_ui_with_cs.html） 来查看如何使用CSS来替代JavaScript来控制数据的显示。 * 无用的网页小部件 滑块选择控件、拖拽控件、弹性控件（此处原文为bouncies，不知指为何物？）、鼠标样式、天气预报控件，这些小部件应该可以被更直接的控件代替或者为了整洁干脆整个去掉。为了选择一种颜色，也许滑块选择控件可以选择一个正确的阴影颜色，但是在一个商店中选择一个价格，使用滑块选择控件选到分这个单位对于用户来说有点过分 © 我想网 [...]]]></description>
			<content:encoded><![CDATA[<p>现在距离gmail改变大家对使用网页应用程序的方式,已经有一年多了。但是目前很多网页应用程序,并没有使用充满活力的Ajax的优势,来代替以前沉闷的html功能。</p>
<p>下面是当前网页应用程序应该出现的地方：</p>
<p>* 基于表单的交互<br />
<span id="more-218"></span><br />
表单是很慢的，非常慢。尝试编辑位于del.icio.us上面的一个书签？点击编辑链接打开一个编辑书签的表单页面，然后编辑你的内容并点击提交按钮等待整个提交过程结束，最后返回上一页并向下滚动到你刚才编辑的书签那里查看内容是否已经正确更改。那AJAX呢？点击编辑链接马上开始更改标签内容，点击提交按钮开始异步传输标签编辑的内容并立即看到更改后的内容而无需重载整个页面。</p>
<p>* 深层树状导航</p>
<p>总而言之，带有深层树状导航的应用程序通常是一个噩梦。在大多数情况中简单平直的拓扑结构以及搜索/标记可以很好的工作。但是如果一个应用程序真正使用深层树状导航，使用JavaScript来管理拓扑ui(user interface用户接口)，则使用Ajax懒加载深层数据可以降低服务器的负载。举例来说，为了阅读一个只有一行的结果来加载整个一个新页面是非常耗时的。</p>
<p>* 实时用户对用户通讯</p>
<p>在一个允许用户创建实时讨论的信息公告系统中，迫使用户一次又一次的更新完页面看到答复是非常愚蠢的。回复应该是实时的，用户不应被迫总是去痴迷于刷新操作。即使是gmail这个已经对以前像hotmail/yahoo mail的收件箱刷新，刷新收件箱标记的操作有所改进，也并没有充分的使用Ajax的功能来提示有新邮件到达。</p>
<p>* 投票、是否选择、等级评价</p>
<p>如果Ajax提交过程没有一个协调的UI提示是非常糟糕的，通过使用Ajax来提交一个调查或是否选择可以减少提交过程等待的痛苦。通过减少点击的等待时间，Ajax应用程序变得越来越有交互性-如果要用40秒来提交一个投票，除非非常在意的话大多数人会选择放弃。如果只花1秒呢，非常大比例的人会乐于参加投票的。（我在Netflix versus有2008张电影投票在IMDb.com有210张电影投票）</p>
<p>* 过滤和复杂数据操作</p>
<p>应用一个过滤、按日期排序、按日期和姓名排序、打开或关闭过滤器等等。任何一种高交换型操作应该交给JavaScript来处理而不是通过向服务器来提交一系列的请求。在查找或者操作大量数据的时候带来的视图上的改变最多不会超过30秒，Ajax真的使这些操作加速了。</p>
<p>* 普通录入时的提示/自动补齐</p>
<p>一些软件/JavaScript是擅长于帮助用户完成键入相同的文字或可以预测的文字的工作的。在del.icio.us 和 Gmail 中该功能是非常有益的，可以用来快速增加标记/email等。</p>
<p>对于一个频繁使用的应用程序诸如网页邮件客户端或博客阅读器来说，用户有充足的时间来学习如何使用新的UI概念但是他们却无法接受一个非常缓慢的反应速度。这种应用为Ajax变的更加普及起到了一个完美的杠杆作用。随着用户使用频率的增加，更多的Ajax部件应该加强用户的使用体验。</p>
<p>但是对于网页应用程序来说，把每件事甚至任何事都用JavaScript来实现也是没有意义的。Ajax只是针对一些特定的环境才能带来显著的帮助。在Ajax出现之前网页应用程序已经可以工作的很好了并且目前在网页开发中Ajax还存在着许多的缺陷和缺点。就算不从服务器端取得一个异步的信息数据流一个平直的html网页日志也可以工作的很好。对于文档或文档之间的跳转来说，老旧的纯HTML仍然是最好的选择。简单或很少使用的应用程序就算不用JavaScript同样可以很好的工作。</p>
<p>下面是一些不应该用到Ajax的地方：</p>
<p>* 简单的表单</p>
<p>就算表单是Ajax技术的最大受益人，一个简单内容的表单，或提交订货单，或一次性的很少用到的表单都不应该使用以Ajax驱动的表单提交机制。总的来说，如果一个表单不是很长用，或已经工作的很好，那么就算使用Ajax也没有什么帮助。</p>
<p>* 搜索</p>
<p>实时搜索带来的痛苦要远大于他带来的帮助。这就是为什么Google Suggest还处于beta测试而并没有放在主页上的原因。在Start.com Live.com上搜索的时候你是不能使用返回按钮来查看上一次搜索或返回上一页的。或许还没有人来完成这项工作，但是完成这个工作应该是很困难的至少是不太明知的或者会因此带来更多的麻烦。（译注：现在已经有很多开源的框架可以实现历史记录功能）</p>
<p>* 基本导航</p>
<p>总的来说，使用Ajax为一个基础的网站/程序做导航是一个可怕的念头。谁会把用来使自己的程序变的更好的时间花在编写代码模仿浏览器的行为上面？在基础页面中导航的操作中JavaScript是没有用的。</p>
<p>* 替换大量的信息</p>
<p>Ajax可以不用整页刷新来动态更新页面中改变的一小部分。但是如果一页上的大部分内容都需要更新，那为什么不从服务器那里获得一个新页面呢？</p>
<p>* 显示操作</p>
<p>虽然看上去Ajax是一个纯UI技术，其实不是这样的。他实际上是一个数据同步、操作、传输的技术。要想得到一个稳定的干净的网页程序，不使用 <a href="http://www.iwanna.cn/tags/ajax/" class="st_tag internal_tag" rel="tag" title="标签 Ajax 下的日志">Ajax</a>/JavaScript来直接完成用户接口是明智的。JavaScript可以分散分布并简单的操作XHTML/<a href="http://www.iwanna.cn/tags/html/" class="st_tag internal_tag" rel="tag" title="标签 HTML 下的日志">HTML</a> DOM，根据CSS规则来决定如何让UI显示数据。查看</p>
<p>这里（http://www.sourcelabs.com/blogs/ajb/2005/08/powering_<a href="http://www.iwanna.cn/tags/javascript/" class="st_tag internal_tag" rel="tag" title="标签 JavaScript 下的日志">javascript</a>_ui_with_cs.html）</p>
<p>来查看如何使用CSS来替代JavaScript来控制数据的显示。</p>
<p>* 无用的网页小部件</p>
<p>滑块选择控件、拖拽控件、弹性控件（此处原文为bouncies，不知指为何物？）、鼠标样式、天气预报控件，这些小部件应该可以被更直接的控件代替或者为了整洁干脆整个去掉。为了选择一种颜色，也许滑块选择控件可以选择一个正确的阴影颜色，但是在一个商店中选择一个价格，使用滑块选择控件选到分这个单位对于用户来说有点过分</p>
<hr />
<p>© <a href="http://www.iwanna.cn">我想网</a> Akon 所有 , 2009. |
<a href="http://www.iwanna.cn/archives/2009/04/07/218/">永久链接</a> |
<a href="http://www.iwanna.cn/archives/2009/04/07/218/#comments">没有评论</a> |
提交到
<a rel="nofollow" target="_blank" href="http://www.google.com/reader/view/feed/http://www.iwanna.cn/archives/2009/04/07/218/">Google Reader</a>
<a rel="nofollow" target="_blank" href="http://www.xianguo.com/subscribe.php?url=http://www.iwanna.cn/archives/2009/04/07/218/">鲜果</a>
<a rel="nofollow" target="_blank" href="http://www.zhuaxia.com/add_channel.php?url=http://www.iwanna.cn/archives/2009/04/07/218/">抓虾</a>
<hr />
<script type="text/javascript"><!--
google_ad_client = "pub-2057344547305288";
/* 336x280,iwanna feed,created 10/3/10 */
google_ad_slot = "9738886183";
google_ad_width = 336;
google_ad_height = 280;
//-->
</script>
<script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script>
<hr />
</p>
<p><small>Feed enhanced by <a href='http://planetozh.com/blog/my-projects/wordpress-plugin-better-feed-rss/'>Better Feed</a> from  <a href='http://planetozh.com/blog/'>Ozh</a></small></p>
]]></content:encoded>
			<wfw:commentRss>http://www.iwanna.cn/archives/2009/04/07/218/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Ajax之XMLHTTP学习理解</title>
		<link>http://www.iwanna.cn/archives/2009/03/31/63/</link>
		<comments>http://www.iwanna.cn/archives/2009/03/31/63/#comments</comments>
		<pubDate>Tue, 31 Mar 2009 14:41:29 +0000</pubDate>
		<dc:creator>seasun</dc:creator>
				<category><![CDATA[Ajax]]></category>
		<category><![CDATA[JavaScript]]></category>

		<guid isPermaLink="false">http://www.iwanna.cn/?p=63</guid>
		<description><![CDATA[在.JS文件或者网页中写入如下脚本 //定义XMLHttp实例 var xmlHttp; function createXMLHttpRequest(){ //开始初始化XMLHttpRequest对象 if(window.ActiveXObject){ //IE浏览器 xmlHttp = new ActiveXObject(&#8220;Microsoft.XMLHTTP&#8221;); }else if(window.XMLHttpRequest){ //Mozilla浏览器 xmlHttp = new XMLHttpRequest(); } if(xmlHttp){ xmlHttp.open(&#8220;GET&#8221;,url,false); xmlHttp.onreadystatechange=function(){setState(greens,reds,contains)}; xmlHttp.send(null); } } //回调函数举例 //返回的4种状态 function setState(greens,reds,contains){ var contains = document.getElementById(&#8220;contain&#8221;); if(xmlHttp.readyState == 0){ contains.innerHTML = &#8220;正在初始化&#8221;; } if(xmlHttp.readyState == 1){ contains.innerHTML = &#8220;正在准备发送请求&#8221;; } if(xmlHttp.readyState == 2){ contains.innerHTML = &#8220;正在发送请求&#8221;; [...]]]></description>
			<content:encoded><![CDATA[<p><span style="color: #800080;"><span style="color: #008000;"><span style="color: #000000; font-size: x-small;">在.JS文件或者网页中写入如下脚本</span></span></span></p>
<p><span style="color: #800080;"><span style="color: #999999;"><span style="font-size: x-small;"><span style="color: #008000;">//</span><span style="color: #008000;">定义XMLHttp实例</span><br />
var <a href="http://www.iwanna.cn/tags/xmlhttp/" class="st_tag internal_tag" rel="tag" title="标签 XMLHTTP 下的日志">xmlHttp</a>;<br />
function createXMLHttpRequest(){<br />
<span style="color: #008000;">//</span><span style="color: #008000;">开始初始化XMLHttpRequest对象</span><br />
if(window.ActiveXObject){<br />
<span style="color: #008000;">//</span><span style="color: #008000;">IE浏览器</span><br />
xmlHttp = new ActiveXObject(&#8220;Microsoft.XMLHTTP&#8221;);<br />
}else if(window.XMLHttpRequest){<br />
<span style="color: #008000;">//</span><span style="color: #008000;">Mozilla浏览器</span><br />
xmlHttp = new XMLHttpRequest();<br />
}<br />
if(xmlHttp){<br />
xmlHttp.open(&#8220;GET&#8221;,url,false);<br />
xmlHttp.onreadystatechange=function(){setState(greens,reds,contains)};<br />
xmlHttp.send(null);<br />
}<br />
}<br />
</span></span><span style="background-color: #ffffff;"><span style="color: #999999;"><span style="font-size: x-small;"><span>//回调函数举例<br />
//返回的4种状态<br />
</span>function setState(greens,reds,contains){<br />
var contains = document.getElementById(&#8220;contain&#8221;);<br />
if(xmlHttp.readyState == 0){<br />
contains.innerHTML = &#8220;正在初始化&#8221;;<br />
}<br />
if(xmlHttp.readyState == 1){<br />
contains.innerHTML = &#8220;正在准备发送请求&#8221;;<br />
}<br />
if(xmlHttp.readyState == 2){<br />
contains.innerHTML = &#8220;正在发送请求&#8221;;<br />
}<br />
if(xmlHttp.readyState == 3){<br />
contains.innerHTML = &#8220;正在接收数据&#8221;;<br />
}<br />
if(xmlHttp.readyState == 4){<br />
<span style="color: #008000;">//</span><span style="color: #008000;">信息已经成功返回，开始处理信息</span><br />
if(xmlHttp.status == 200){<br />
contains.innerHTML = xmlHttp.responstText; <span style="color: #008000;">//返回值</span><br />
}<br />
}<br />
}</span></span></span></span><span style="background-color: #ffffff; color: #999999; font-size: x-small;"> </span></p>
<p><span style="color: #000000; font-size: x-small;">DOM的一些详解</span></p>
<p><span style="font-size: x-small;"><span style="color: #800080;">(1)设置<br />
</span> </span><span style="font-size: x-small;"><span style="color: #3366ff;">在从服务器返回数据的同时，还要进行设置，使浏览器不会在本地缓存结果，response.setHeader(&#8220;Cache-Control&#8221;,&#8221;no-cache&#8221;);response.setHeader(&#8220;pragma&#8221;,&#8221;no-cache&#8221;);<br />
XMLHttpRequest对象提供２个可以用来访问服务器响应的属性，一个是responseText将响应提供一个串，结合HTML元 素的innerHTML属性，非常有用． (document.getElementById(&#8220;results&#8221;).innerHTML=xmlHttp.responseText).一个是 responseXML将响应提供为一个XML对象．<br />
</span><br />
</span><span style="font-size: x-small;"><span style="color: #800080;">(2)DOM元素的一些有用的属性<br />
</span> </span><span style="font-size: x-small;"><span style="color: #3366ff;">childNodes&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;返回当前元素所有子元素的数组<br />
firstChild   &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;返回当前元素的第一个下级子元素<br />
lastChild   &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;返回当前元素的最后一个子元素<br />
nextSibling&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;返回紧跟在当前元素后面的元素<br />
nodeValue&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-指定表示元素值的读／写属性<br />
parentNode &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;返回元素的父节点<br />
previousSibling&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-返回紧邻当前元素之前的元素</p>
<p></span> </span><span style="font-size: x-small;"><span style="color: #800080;">(3)用于遍历XML文档的DOM元素方法(document)<br />
</span> </span><span style="font-size: x-small;"><span style="color: #3366ff;">getElementById(id)&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;获取有指定唯一ID属性值文档中的元素<br />
getElementsByTagName(name)&#8212;&#8212;&#8212;&#8212;&#8211;返回当前元素中有指定标记名的子元素的数组<br />
hasChildNodes()&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;返回一个布尔值，指定元素是否有子元素<br />
getAttribute(name)&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;返回元素的属性值，属性由name指定</p>
<p></span> </span><span style="font-size: x-small;"><span style="color: #800080;">(4)动态创建内容时所用的W3C DOM属性和方法<br />
</span> document.createElement(tagName)&#8212;&#8212;&#8212;-文档对象上的createElement方法可以创建由tagName指定的元素<br />
document.createTextNode(text)&#8212;&#8212;&#8212;&#8212;&#8211;文档对象的createTextNode方法会创建一个包含静态文本的节点．<br />
&lt;element&gt;&lt;/element&gt;.appendChild(childNode)&#8212;&#8212;&#8212;该方法将指定的节点增加到当前元素的子节点列表．<br />
&lt;element&gt;&lt;/element&gt;.getAttribute(name)|.setAttribute(name,value)&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;获得和设置元素中name属性的值<br />
&lt;element&gt;&lt;/element&gt;.insertBefore(newNode,targetNode)&#8212;&#8211;这个方法将节点newNode作为当前元素的子节点插到targetNode元素前面。<br />
&lt;element&gt;&lt;/element&gt;.removeAttribute(name)&#8212;&#8211;这个方法从元素中删除属性name<br />
&lt;element&gt;&lt;/element&gt;.removeChild(childNode)&#8212;&#8211;这个方法从元素中删除子元素childNode<br />
&lt;element&gt;&lt;/element&gt;.replaceChild(newNode,oldNode)&#8212;&#8211;这个方法将节点oldNode替换为节点newNode<br />
&lt;element&gt;&lt;/element&gt;.hasChildNodes()这个方法返回一个布尔值，指示元素是否有子元素</span></p>
<p><span style="color: #993300;"><span style="color: #000000; font-size: x-small;">XMLHttpRequest对象的一些典型方法</span></span></p>
<p><span style="color: #993300;"><span style="font-size: x-small;">(1)、void open(String method,String url,boolean asynch);这个方法会建立对服务器的调用。<br />
第一个参数表示要提供调用的特定方法(get,post,put)<br />
第二个参数表示要提供所调用资源的url<br />
第三个参数表示是异步(true)还是同步(false)<br />
(2)、void send(content):这个方法会向具体服务器发出请求。可选参数会作为请求体的一部分发送。<br />
(3)、void setRequestHeader(String header ,String value):这个方法为HTTP请求中一个给定的首部设置值<br />
第一个参数表示要设置的首部。<br />
第二个参数表示要 在首部中放置的值。这个方法必须在调用open()之后才能调用。<br />
XMLHttpRequest对象的一些典型属性：<br />
(1)、onreadystatechange:每个状态改变时都会触发这个事件处理器，通常会调用一个javascript函数，用来处理返回时要调用的函数。<br />
(2)、readyState:请求的状态。有5个值：0=未初始化，1=正在加载，2=已经加载，3=交互中，4=完成。<br />
(3)、responseText:服务器的响应，表示为一个串<br />
(4)、responseXML:服务器的响应，表示为一个XML，这个对象可以解析为一个DOM对象。<br />
(5)、status:服务器的Http状态码(200对应ok，404对应Not Found(未找到))</span></span></p>
<hr />
<p>© <a href="http://www.iwanna.cn">我想网</a> Akon 所有 , 2009. |
<a href="http://www.iwanna.cn/archives/2009/03/31/63/">永久链接</a> |
<a href="http://www.iwanna.cn/archives/2009/03/31/63/#comments">没有评论</a> |
提交到
<a rel="nofollow" target="_blank" href="http://www.google.com/reader/view/feed/http://www.iwanna.cn/archives/2009/03/31/63/">Google Reader</a>
<a rel="nofollow" target="_blank" href="http://www.xianguo.com/subscribe.php?url=http://www.iwanna.cn/archives/2009/03/31/63/">鲜果</a>
<a rel="nofollow" target="_blank" href="http://www.zhuaxia.com/add_channel.php?url=http://www.iwanna.cn/archives/2009/03/31/63/">抓虾</a>
<hr />
<script type="text/javascript"><!--
google_ad_client = "pub-2057344547305288";
/* 336x280,iwanna feed,created 10/3/10 */
google_ad_slot = "9738886183";
google_ad_width = 336;
google_ad_height = 280;
//-->
</script>
<script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script>
<hr />
</p>
<p><small>Feed enhanced by <a href='http://planetozh.com/blog/my-projects/wordpress-plugin-better-feed-rss/'>Better Feed</a> from  <a href='http://planetozh.com/blog/'>Ozh</a></small></p>
]]></content:encoded>
			<wfw:commentRss>http://www.iwanna.cn/archives/2009/03/31/63/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>21个新奇漂亮的Ajax/CSS表格设计</title>
		<link>http://www.iwanna.cn/archives/2009/03/30/15/</link>
		<comments>http://www.iwanna.cn/archives/2009/03/30/15/#comments</comments>
		<pubDate>Mon, 30 Mar 2009 15:21:22 +0000</pubDate>
		<dc:creator>seasun</dc:creator>
				<category><![CDATA[Ajax]]></category>
		<category><![CDATA[CSS]]></category>
		<category><![CDATA[JavaScript]]></category>

		<guid isPermaLink="false">http://www.iwanna.cn/?p=15</guid>
		<description><![CDATA[翻译:PARAN 当谈到表格数据的设计时，没有太多的网页设计师会有太大的兴趣。今天我们已经收集了21个功能超大且看上去挺漂亮的Ajax/CSS表格设计，并且教你一些表格设计中所运用的技巧，例如表格数据的排序和过滤等。 OK，让我们来看一下这些表格: 1. Tablecloth Tablecloth 由CSS Globe 开发，是一个轻巧易于使用的表格，简洁的将表格样式添加到你的HTML 表格元素中。 2. Ask the CSS Guy Table Ask the CSS Guy Table教给我们要如何去创建能够清晰显出去资料之间的相关联系的表格，例如:点击一个表格元素时，将突了显示这个元素，并且在纵列和横列都显示出相关的类别关系。 #3. A CSS styled table version 2 Veerle Duoh 为我们展示了一个漂亮的表格设计，并教我们如何使用CSS来吸引用户的眼球。 #4. Sortable Table Sortable Table 演示了如何按升序或降序排列以及如何过滤表格中的数据。 5. Row Locking with CSS and JavaScript Css Guy再次对表格使用了聚焦高亮的效果，除非用户再次点击，否则表单数据将一直保持亮高。 他还给了我们另一个示例:another example to Lock rows with radios . #6. [...]]]></description>
			<content:encoded><![CDATA[<p>翻译:PARAN</p>
<p>当谈到表格数据的设计时，没有太多的网页设计师会有太大的兴趣。今天我们已经收集了<strong><a title="21个新奇漂亮的Ajax/CSS表格设计" href="http://www.iwanna.cn/archives/2009/03/30/15/">21个功能超大且看上去挺漂亮的Ajax/CSS表格设计</a></strong>，并且教你一些表格设计中所运用的技巧，例如表格数据的排序和过滤等。</p>
<p>OK，让我们来看一下这些表格:</p>
<h4>1. <a href="http://cssglobe.com/lab/tablecloth/">Tablecloth</a></h4>
<p>Tablecloth 由<a href="http://cssglobe.com/">CSS Globe</a> 开发，是一个轻巧易于使用的表格，简洁的将表格样式添加到你的HTML 表格元素中。</p>
<p><a href="http://cssglobe.com/lab/tablecloth/"><img title="21个新奇漂亮的Ajax/CSS表格设计" src="http://images.uheed.com/iwanna/2010/05/27/c1.gif" alt="21个新奇漂亮的Ajax/CSS表格设计-Tablecloth" /></a></p>
<h4>2. <a href="http://www.askthecssguy.com/2007/09/sangeeta_asks_the_css_guy_how_1.html">Ask the CSS Guy Table</a></h4>
<p>Ask the <a href="http://www.iwanna.cn/tags/css/" class="st_tag internal_tag" rel="tag" title="标签 CSS 下的日志">CSS</a> Guy Table教给我们要如何去创建能够清晰显出去资料之间的相关联系的表格，例如:点击一个表格元素时，将突了显示这个元素，并且在纵列和横列都显示出相关的类别关系。</p>
<p><a href="http://www.askthecssguy.com/examples/orbitz/example01.html"><img title="21个新奇漂亮的Ajax/CSS表格设计" src="http://images.uheed.com/iwanna/2010/05/27/c2.gif" alt="21个新奇漂亮的Ajax/CSS表格设计-Ask the CSS Guy Table" /></a><br />
<span id="more-15"></span></p>
<h4>#3. <a href="http://veerle.duoh.com/blog/comments/a_css_styled_table_version_2/">A CSS styled table version 2</a></h4>
<p><a href="http://veerle.duoh.com/">Veerle Duoh</a> 为我们展示了一个漂亮的表格设计，并教我们如何使用CSS来吸引用户的眼球。</p>
<p><a href="http://www.iwanna.cn/"><img title="21个新奇漂亮的Ajax/CSS表格设计" src="http://images.uheed.com/iwanna/2010/05/27/c4.gif" alt="21个新奇漂亮的Ajax/CSS表格设计-A CSS styled table version 2" /></a></p>
<h4>#4. <a href="http://www.iwanna.cn/">Sortable Table</a></h4>
<p>Sortable Table 演示了如何按升序或降序排列以及如何过滤表格中的数据。</p>
<p><a href="http://www.iwanna.cn/"><img title="21个新奇漂亮的Ajax/CSS表格设计" src="http://images.uheed.com/iwanna/2010/05/27/c5.gif" alt="21个新奇漂亮的Ajax/CSS表格设计-Sortable Table" /></a></p>
<h4>5. <a href="http://www.askthecssguy.com/2007/05/brett_asks_the_css_guy_if_the.html">Row Locking with CSS and JavaScript</a></h4>
<p>Css Guy再次对表格使用了聚焦高亮的效果，除非用户再次点击，否则表单数据将一直保持亮高。</p>
<p><a href="http://www.askthecssguy.com/examples/rowlock/example8.html"><img title="21个新奇漂亮的Ajax/CSS表格设计" src="http://images.uheed.com/iwanna/2010/05/27/c3.gif" alt="21个新奇漂亮的Ajax/CSS表格设计-Row Locking with CSS and JavaScript" /></a></p>
<p>他还给了我们另一个示例:<a href="http://www.askthecssguy.com/examples/rowlock/example9.html">another example to Lock rows with radios </a>.</p>
<h4>#6. <a href="http://www.cssplay.co.uk/menu/tablescroll.html">Vertical scrolling tables</a></h4>
<p>如果您有大量的表格数据，但却没有太大的空间来展示它，这可能是个比较好的方法:一个纯CSS的表格与固定的标题和页脚，以及滚动显示的内容。</p>
<p><a href="http://www.cssplay.co.uk/menu/tablescroll.html"><img title="21个新奇漂亮的Ajax/CSS表格设计" src="http://images.uheed.com/iwanna/2010/05/27/c6.gif" alt="21个新奇漂亮的Ajax/CSS表格设计-Vertical scrolling tables" /></a></p>
<h4>7. Replicating a Tree table</h4>
<p>这是一个使用HTML 和CSS 设计的树形状表格。</p>
<p><img title="21个新奇漂亮的Ajax/CSS表格设计" src="http://images.uheed.com/iwanna/2010/05/27/c7.gif" alt="21个新奇漂亮的Ajax/CSS表格设计-Replicating a Tree table" /></p>
<p>8 ) <a href="http://dev.nozav.org/rails_ajax_table.html">Paginate, sort and search a table with Ajax and Rails</a></p>
<p>这个表格提供了一个动态的界面，而不需要重新刷新整个页面。</p>
<p><a href="http://dev.nozav.org/ajaxtable/"><img title="21个新奇漂亮的Ajax/CSS表格设计" src="http://images.uheed.com/iwanna/2010/05/27/c9.gif" alt="21个新奇漂亮的Ajax/CSS表格设计-ajax tables" /></a></p>
<p>9. <a href="http://icant.co.uk/sandbox/footercollapsetables/">Collapsible tables with DOM and CSS</a></p>
<p>此表格加上箭头形象的脚本提示，用来控制表格的伸展和收缩。</p>
<p><a href="http://icant.co.uk/sandbox/footercollapsetables/"><img title="21个新奇漂亮的Ajax/CSS表格设计" src="http://images.uheed.com/iwanna/2010/05/27/c8.gif" alt="21个新奇漂亮的Ajax/CSS表格设计-Collapsible tables with DOM and CSS" /></a></p>
<h4>10. <a href="http://motherrussia.polyester.se/jquery-plugins/tablesorter/">TableSorter plug-in for jQuery</a></h4>
<p>它的主要特性包括多列排序，支持&lt;TH&gt;的rowspan和colspan属性以及许多其他功能。</p>
<p><a href="http://motherrussia.polyester.se/docs/tablesorter/"><img title="21个新奇漂亮的Ajax/CSS表格设计" src="http://images.uheed.com/iwanna/2010/05/27/c10.gif" alt="21个新奇漂亮的Ajax/CSS表格设计-TableSorter plug-in for jQuery" /></a></p>
<h4>11. Stripe your tables the OO way</h4>
<p>使用了Javascript 为表格中的行进行颜色交替，并且添加了<span class="code">onmouseover</span> 和<span class="code">onmouseout</span> 事件，当鼠标点击时，切换背景颜色。</p>
<p><img title="21个新奇漂亮的Ajax/CSS表格设计" src="http://images.uheed.com/iwanna/2010/05/27/c11.gif" alt="21个新奇漂亮的Ajax/CSS表格设计-Stripe your tables the OO way" /></p>
<h4>12. <a href="http://www.chrisesler.com/mootools/mootools-rowcolumnhighlight.php">MooTools Table Row &amp; Column highlighting</a></h4>
<p>基于MooTools 框架，高亮显示鼠标悬停时的单元格所在的行和列。</p>
<p><a href="http://www.chrisesler.com/mootools/mootools-rowcolumnhighlight.php"><img title="21个新奇漂亮的Ajax/CSS表格设计" src="http://images.uheed.com/iwanna/2010/05/27/c12.gif" alt="21个新奇漂亮的Ajax/CSS表格设计-MooTools Table Row &amp; Column highlighting" /></a></p>
<h4>13. <a href="http://icant.co.uk/csstablegallery/">CSS Table Gallery</a></h4>
<p>93 styled tables是一个专门收集表格样式的站点，下面是来自一个表格样式的截图:</p>
<p><a href="http://icant.co.uk/csstablegallery/"><img title="21个新奇漂亮的Ajax/CSS表格设计" src="http://images.uheed.com/iwanna/2010/05/27/c13.gif" alt="21个新奇漂亮的Ajax/CSS表格设计-CSS Table Gallery" /></a></p>
<h4>14. <a href="http://ideamill.synaptrixgroup.com/jquery/tablefilter/tabletest.htm">jQuery Table Filter</a></h4>
<p>可以对数据进行各种不同的排序、过滤。</p>
<p><a href="http://ideamill.synaptrixgroup.com/jquery/tablefilter/tabletest.htm"><img title="21个新奇漂亮的Ajax/CSS表格设计" src="http://images.uheed.com/iwanna/2010/05/27/c14.gif" alt="21个新奇漂亮的Ajax/CSS表格设计-jQuery Table Filter" /></a></p>
<p>15. <a href="http://www.millstream.com.au/upload/code/tablekit/">Sortable/Resizable/Editable TableKit</a></p>
<p>TableKit基于Prototype框架，专门收集各种HTML表格，可以利用Ajax实时的进行表格栏目大小、排序等编辑。</p>
<p><a href="http://www.millstream.com.au/upload/code/tablekit/"><img title="21个新奇漂亮的Ajax/CSS表格设计" src="http://images.uheed.com/iwanna/2010/05/27/c22.gif" alt="21个新奇漂亮的Ajax/CSS表格设计-sortable, resizable, editable" /></a></p>
<h4>16. <a href="http://www.kryogenix.org/code/browser/sorttable/">Make all your tables sortable</a></h4>
<p><a href="http://www.kryogenix.org/code/browser/sorttable/"><img title="21个新奇漂亮的Ajax/CSS表格设计" src="http://images.uheed.com/iwanna/2010/05/27/c16.gif" alt="21个新奇漂亮的Ajax/CSS表格设计-sortable table" /></a></p>
<h4>17. <a href="http://www.alistapart.com/articles/zebratables/">Zebra Tables</a></h4>
<p>alistapart为我们提供了一个极好的例子，如何使用JavaScript和DOM的改变背景色风格，以突出显示单元格。</p>
<p><a href="http://www.alistapart.com/articles/zebratables/"><img title="21个新奇漂亮的Ajax/CSS表格设计" src="http://images.uheed.com/iwanna/2010/05/27/c17.gif" alt="21个新奇漂亮的Ajax/CSS表格设计-Zebra Tables" /></a></p>
<h4>18. <a href="http://www.workingwith.me.uk/articles/scripting/standardista_table_sorting">Standardista Table Sorting</a></h4>
<p>Standardista Table Sorting 是一个Javascript模块，让您可以对HTML数据表的任何栏目进行排序。</p>
<p><a href="http://www.workingwith.me.uk/articles/scripting/standardista_table_sorting"><img title="21个新奇漂亮的Ajax/CSS表格设计" src="http://images.uheed.com/iwanna/2010/05/27/c18.gif" alt="21个新奇漂亮的Ajax/CSS表格设计-Standardista Table Sorting" /></a></p>
<h4>19. GridView3 Example</h4>
<p><img title="21个新奇漂亮的Ajax/CSS表格设计" src="http://images.uheed.com/iwanna/2010/05/27/c19.gif" alt="21个新奇漂亮的Ajax/CSS表格设计-GridView3 Example" /></p>
<h4>20. <a href="http://joomlicious.com/mootable/">Mootable</a></h4>
<p><a href="http://joomlicious.com/mootable/"><img title="21个新奇漂亮的Ajax/CSS表格设计" src="http://images.uheed.com/iwanna/2010/05/27/c20.gif" alt="21个新奇漂亮的Ajax/CSS表格设计-Mootable" /></a></p>
<h4>21. <a href="http://tool-man.org/examples/sorting.html">Drag &amp; Drop Sortable Lists with JavaScript and CSS</a></h4>
<p><a href="http://tool-man.org/examples/sorting.html"><img title="21个新奇漂亮的Ajax/CSS表格设计" src="http://images.uheed.com/iwanna/2010/05/27/c21.gif" alt="21个新奇漂亮的Ajax/CSS表格设计-Drag &amp; Drop Sortable Lists with JavaScript and CSS" /></a></p>
<p>可能还会有一些你更想寻找的详细资料，下面是一些相关的资源链接:</p>
<ul style="width: 400px;">
<li><a href="http://www.456bereastreet.com/archive/200410/bring_on_the_tables/">Bring on the Tables</a></li>
<li><a href="http://www.usability.com.au/resources/tables.cfm">Accessible Data Tables</a></li>
<li><a href="http://www.snook.ca/archives/html_and_css/designing_data_1/">Designing Data Tables</a></li>
<li><a href="http://www.brainjar.com/dhtml/tablesort/demo.html">Brainjar Table Sort</a></li>
<li><a href="http://neil.fraser.name/software/tablesort/">Table Sorter</a></li>
</ul>
<hr />
<p>© <a href="http://www.iwanna.cn">我想网</a> Akon 所有 , 2009. |
<a href="http://www.iwanna.cn/archives/2009/03/30/15/">永久链接</a> |
<a href="http://www.iwanna.cn/archives/2009/03/30/15/#comments">没有评论</a> |
提交到
<a rel="nofollow" target="_blank" href="http://www.google.com/reader/view/feed/http://www.iwanna.cn/archives/2009/03/30/15/">Google Reader</a>
<a rel="nofollow" target="_blank" href="http://www.xianguo.com/subscribe.php?url=http://www.iwanna.cn/archives/2009/03/30/15/">鲜果</a>
<a rel="nofollow" target="_blank" href="http://www.zhuaxia.com/add_channel.php?url=http://www.iwanna.cn/archives/2009/03/30/15/">抓虾</a>
<hr />
<script type="text/javascript"><!--
google_ad_client = "pub-2057344547305288";
/* 336x280,iwanna feed,created 10/3/10 */
google_ad_slot = "9738886183";
google_ad_width = 336;
google_ad_height = 280;
//-->
</script>
<script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script>
<hr />
</p>
<p><small>Feed enhanced by <a href='http://planetozh.com/blog/my-projects/wordpress-plugin-better-feed-rss/'>Better Feed</a> from  <a href='http://planetozh.com/blog/'>Ozh</a></small></p>
]]></content:encoded>
			<wfw:commentRss>http://www.iwanna.cn/archives/2009/03/30/15/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

