<?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>彩程团队BLOG &#187; Web前端技术</title>
	<atom:link href="http://mycolorway.com/blog/category/front-end-dev/feed/" rel="self" type="application/rss+xml" />
	<link>http://mycolorway.com/blog</link>
	<description></description>
	<lastBuildDate>Tue, 31 Aug 2010 20:27:02 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>UED/UCD设计资源汇总 3#</title>
		<link>http://mycolorway.com/blog/2010/04/20/ued-ucd-collection-3/</link>
		<comments>http://mycolorway.com/blog/2010/04/20/ued-ucd-collection-3/#comments</comments>
		<pubDate>Tue, 20 Apr 2010 02:37:10 +0000</pubDate>
		<dc:creator>yx.shawn</dc:creator>
				<category><![CDATA[Web前端技术]]></category>
		<category><![CDATA[用户体验设计]]></category>
		<category><![CDATA[css]]></category>
		<category><![CDATA[design]]></category>
		<category><![CDATA[flash]]></category>
		<category><![CDATA[graphic]]></category>
		<category><![CDATA[icon]]></category>
		<category><![CDATA[jQuery]]></category>
		<category><![CDATA[js]]></category>
		<category><![CDATA[psd]]></category>
		<category><![CDATA[svg]]></category>
		<category><![CDATA[twitter]]></category>
		<category><![CDATA[ucd]]></category>
		<category><![CDATA[ucdcn]]></category>
		<category><![CDATA[ued]]></category>
		<category><![CDATA[UI]]></category>
		<category><![CDATA[web]]></category>
		<category><![CDATA[webdesign]]></category>
		<category><![CDATA[图标]]></category>
		<category><![CDATA[模板]]></category>
		<category><![CDATA[源文件]]></category>
		<category><![CDATA[用户交互]]></category>
		<category><![CDATA[用户体验]]></category>
		<category><![CDATA[设计]]></category>

		<guid isPermaLink="false">http://blog.mycolorway.com/2010/04/20/ued-ucd-collection-3/</guid>
		<description><![CDATA[一个月没有把@ucdcn的推汇总出来了。实在惭愧，一来是因为当时写的存储推的数据库出现了一些问题，导致部分推不能被在汇总中显示，二来是因为有朋友反应推的频率太高会被洪水淹没，因此现在减小了推的频率。下面的关于UCD/UED的自3月初的总结。为了大家的检索方便，接下来空余时间我做一个搜索推库的功能，敬请期待^_^ @ 2010-3-3 11:25 创新的简历可能会帮助你找到更好的工作。甚至有的人把 #infographic 的展现方式都运用其中。http://is.gd/9zBQQ @ 2010-3-3 11:27 #iphone #code #web #ued 十分十分有用的代码片段有助于你为iPhone设计更友好的界面。http://is.gd/9zCkP @ 2010-3-3 11:31 #os #jquery “谁在你的网站上？” 有人写了一个开源的&#34;who is online&#34; 的小插件，功能蛮齐的。http://is.gd/9zD11 @ 2010-3-4 10:1 #design #ued Web设计中的颜色理论http://is.gd/aaHRE @ 2010-3-4 11:38 #ued #ucd #web 50个十分漂亮简洁的网站设计欣赏。 颜色越是用得简单，设计的时候就越需要考虑布局排版。大家可以围观 http://is.gd/ab0nI @ 2010-3-4 12:18 #design #ued #web 2010年网页设计趋势预测。 http://is.gd/ab7XZ @ 2010-3-4 12:34 #jquery #ued 未被众人所知的一些jQuery的隐藏技能 http://is.gd/abaU0 [...]]]></description>
			<content:encoded><![CDATA[<p><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="ucd-ued" border="0" alt="ucd-ued" src="http://blog.mycolorway.com/wp-content/uploads/2010/04/ucdued.jpg" width="580" height="180" /> </p>
<p>一个月没有把@ucdcn的推汇总出来了。实在惭愧，一来是因为当时写的存储推的数据库出现了一些问题，导致部分推不能被在汇总中显示，二来是因为有朋友反应推的频率太高会被洪水淹没，因此现在减小了推的频率。下面的关于UCD/UED的自3月初的总结。为了大家的检索方便，接下来空余时间我做一个搜索推库的功能，敬请期待^_^</p>
<ul class="twitts">
<li class="twit-item"><b>@ <span class="twit-time">2010-3-3 11:25</span></b>
<p class="twit-content">创新的简历可能会帮助你找到更好的工作。甚至有的人把 #infographic 的展现方式都运用其中。<a href="http://is.gd/9zBQQ" target="blank">http://is.gd/9zBQQ</a> </p>
</li>
<li class="twit-item"><b>@ <span class="twit-time">2010-3-3 11:27</span></b>
<p class="twit-content">#iphone #code #web #ued 十分十分有用的代码片段有助于你为iPhone设计更友好的界面。<a href="http://is.gd/9zCkP" target="blank">http://is.gd/9zCkP</a> </p>
</li>
<li class="twit-item"><b>@ <span class="twit-time">2010-3-3 11:31</span></b>
<p class="twit-content">#os #jquery “谁在你的网站上？” 有人写了一个开源的&quot;who is online&quot; 的小插件，功能蛮齐的。<a href="http://is.gd/9zD11" target="blank">http://is.gd/9zD11</a> </p>
</li>
</ul>
<p> <span id="more-1066"></span>
<ul class="twitts">
<li class="twit-item">
<p class="twit-content"></p>
</li>
<li class="twit-item"><b>@ <span class="twit-time">2010-3-4 10:1</span></b>
<p class="twit-content">#design #ued Web设计中的颜色理论<a href="http://is.gd/aaHRE" target="blank">http://is.gd/aaHRE</a> </p>
</li>
<li class="twit-item"><b>@ <span class="twit-time">2010-3-4 11:38</span></b>
<p class="twit-content">#ued #ucd #web 50个十分漂亮简洁的网站设计欣赏。 颜色越是用得简单，设计的时候就越需要考虑布局排版。大家可以围观 <a href="http://is.gd/ab0nI" target="blank">http://is.gd/ab0nI</a> </p>
</li>
<li class="twit-item"><b>@ <span class="twit-time">2010-3-4 12:18</span></b>
<p class="twit-content">#design #ued #web 2010年网页设计趋势预测。 <a href="http://is.gd/ab7XZ" target="blank">http://is.gd/ab7XZ</a> </p>
</li>
<li class="twit-item"><b>@ <span class="twit-time">2010-3-4 12:34</span></b>
<p class="twit-content">#jquery #ued 未被众人所知的一些jQuery的隐藏技能 <a href="http://is.gd/abaU0" target="blank">http://is.gd/abaU0</a> </p>
</li>
<li class="twit-item"><b>@ <span class="twit-time">2010-3-5 10:7</span></b>
<p class="twit-content">#ued #tool 十个有用的网站分析工具<a href="http://is.gd/ahjT9" target="blank">http://is.gd/ahjT9</a> </p>
</li>
<li class="twit-item"><b>@ <span class="twit-time">2010-3-1 9:24</span></b>
<p class="twit-content">#design #case 国外设计师本周搜集的一些很棒的设计 <a href="http://is.gd/aEByt" target="blank">http://is.gd/aEByt</a> </p>
</li>
<li class="twit-item"><b>@ <span class="twit-time">2010-3-1 9:36</span></b>
<p class="twit-content">#wallpaper wow~简直是太漂亮了，这里有80+地球上最漂亮的地方的照片。 其中部分做了HDR的处理 <a href="http://is.gd/aEFmy" target="blank">http://is.gd/aEFmy</a> </p>
</li>
<li class="twit-item"><b>@ <span class="twit-time">2010-3-1 9:45</span></b>
<p class="twit-content">#ucd #ucdchina 社区上出现一篇文章，说到安慰用户的一些情感设计。<a href="http://is.gd/aEHSL" target="blank">http://is.gd/aEHSL</a> 这让我想到了前些时间看到的纽约十字路口人行道的按钮其实是不会让红绿灯改变的，但是没有取消的原因完全是为了安慰行人。<a href="http://is.gd/aEHSL" target="blank">http://is.gd/aEHSL</a> </p>
</li>
<li class="twit-item"><b>@ <span class="twit-time">2010-3-1 9:51</span></b>
<p class="twit-content">#ued #jquery #js 45个有用的jQuery技巧及工具 <a href="http://is.gd/aEJEU" target="blank">http://is.gd/aEJEU</a> </p>
</li>
<li class="twit-item"><b>@ <span class="twit-time">2010-3-2 13:3</span></b>
<p class="twit-content">#jquery 这个世界什么奇怪的人都有，例如这个，像书的翻页角一样的jQuery插件，虽然不实用，但是的确很sexy <a href="http://is.gd/aJj7E" target="blank">http://is.gd/aJj7E</a> </p>
</li>
<li class="twit-item"><b>@ <span class="twit-time">2010-3-2 13:5</span></b>
<p class="twit-content">#web #webapp #ued 如果你想设计一个Web Application，这里有20个很棒的20个We APP的接口设计供你参考。<a href="http://is.gd/aJjeo" target="blank">http://is.gd/aJjeo</a> </p>
</li>
<li class="twit-item"><b>@ <span class="twit-time">2010-3-2 13:9</span></b>
<p class="twit-content">#flash #jquery #chart #ued 如果你要设计一个带有图表的网站，首先想到的是图表用flash/flex来展现。但是若在不支持flash的环境中怎么办？这里有5个顶级JS的包帮助你 <a href="http://is.gd/aJjqB" target="blank">http://is.gd/aJjqB</a> </p>
</li>
<li class="twit-item"><b>@ <span class="twit-time">2010-3-2 13:25</span></b>
<p class="twit-content">#web #ued 50个设计很漂亮的黄色网站也许能给你不少灵感 <a href="http://is.gd/aJkbS" target="blank">http://is.gd/aJkbS</a> </p>
</li>
<li class="twit-item"><b>@ <span class="twit-time">2010-3-2 13:43</span></b>
<p class="twit-content">#bizcard 设计名片？背面总是一件痛苦的事儿。这里有一些双面的名片设计的案例供给你参考 <a href="http://is.gd/aJl3z" target="blank">http://is.gd/aJl3z</a> </p>
</li>
<li class="twit-item"><b>@ <span class="twit-time">2010-3-3 12:26</span></b>
<p class="twit-content">#ucd #ued #web 无论你是图像设计和体验设计的高手还是菜鸟，这篇文章总结的12个标准屏幕设计模板都会帮助你把经验固化。文中还包含了大量的最侍实践 <a href="http://is.gd/aLnIH" target="blank">http://is.gd/aLnIH</a> </p>
</li>
<li class="twit-item"><b>@ <span class="twit-time">2010-3-2 9:38</span></b>
<p class="twit-content">#ucd #flash 请饶恕我的推中不常包含中文网站。的确是我实在不知道哪些是值得拿出来推的，直到我发现这个：<a href="http://www.iloveg3.com/" target="blank">http://www.iloveg3.com/</a> 中国移动的G3宣传概念网站，值得一看 </p>
</li>
<li class="twit-item"><b>@ <span class="twit-time">2010-3-2 9:40</span></b>
<p class="twit-content">#china #design 上一推推了一条中国设计的概念网站，其实SM在前些天刚做了一个关于中国从操到创造的设计大收罗： <a href="http://is.gd/aTDAA" target="blank">http://is.gd/aTDAA</a> </p>
</li>
<li class="twit-item"><b>@ <span class="twit-time">2010-4-4 9:18</span></b>
<p class="twit-content">#visual #design 一个黑色骚包的设计网站<a href="http://is.gd/b91HZ" target="blank">http://is.gd/b91HZ</a> </p>
</li>
<li class="twit-item"><b>@ <span class="twit-time">2010-4-4 9:22</span></b>
<p class="twit-content">#design #ad 我也不记得过去是在哪个推上推过一些很有创意的广告牌设计，没有关系，今天补上更多的。这些广告都突破了传统广告牌的设计<a href="http://is.gd/b91WN" target="blank">http://is.gd/b91WN</a> </p>
</li>
<li class="twit-item"><b>@ <span class="twit-time">2010-4-4 9:25</span></b>
<p class="twit-content">#ads 我终于找到这个广告了，很早前看到的，这应该是BBC推出的一组广告中的一个，我过去看到的不是这个。广告很巧妙地利用了街口转角处的特点设计了这组广告以传达广告的意义<a href="http://is.gd/b9299" target="blank">http://is.gd/b9299</a> </p>
</li>
<li class="twit-item"><b>@ <span class="twit-time">2010-4-4 10:5</span></b>
<p class="twit-content">#ad 我把刚刚推的那组BBC的户外广告集结在一起了，有兴趣可以看一下 <a href="http://is.gd/b94gs" target="blank">http://is.gd/b94gs</a> </p>
</li>
<li class="twit-item"><b>@ <span class="twit-time">2010-4-4 16:18</span></b>
<p class="twit-content">#jquery #ued 很漂亮的图片注释显示器插件 </p>
</li>
<li class="twit-item"><b>@ <span class="twit-time">2010-4-4 16:19</span></b>
<p class="twit-content">#jquery #ued 很漂亮的图片注释显示器。<a href="http://is.gd/b9ngn" target="blank">http://is.gd/b9ngn</a> </p>
</li>
<li class="twit-item"><b>@ <span class="twit-time">2010-4-2 17:0</span></b>
<p class="twit-content">#jquery #js #design 一个很实用的Notify插件<a href="http://is.gd/bgMAp" target="blank">http://is.gd/bgMAp</a> </p>
</li>
<li class="twit-item"><b>@ <span class="twit-time">2010-4-2 17:4</span></b>
<p class="twit-content">#jquery #js #web 一个动态Tab的插件，蛮有意思的<a href="http://is.gd/bgMOb" target="blank">http://is.gd/bgMOb</a> </p>
</li>
<li class="twit-item"><b>@ <span class="twit-time">2010-4-2 17:8</span></b>
<p class="twit-content">#jquery #js #web 很囧的jquery动态插件<a href="http://is.gd/bgN3f" target="blank">http://is.gd/bgN3f</a> </p>
</li>
<li class="twit-item"><b>@ <span class="twit-time">2010-4-2 17:15</span></b>
<p class="twit-content">#jquery #js 现在蛮流行大图片在网站的背景上的使用，这里有一个现成的jquery插件 <a href="http://is.gd/bgNvn" target="blank">http://is.gd/bgNvn</a> </p>
</li>
<li class="twit-item"><b>@ <span class="twit-time">2010-4-2 20:5</span></b>
<p class="twit-content">#grid #css #web 15个有用的css表格系统供你设计选用<a href="http://is.gd/bqRUa" target="blank">http://is.gd/bqRUa</a> </p>
</li>
<li class="twit-item"><b>@ <span class="twit-time">2010-4-2 20:7</span></b>
<p class="twit-content">#webapp #photo 30个照片在线编辑网站 <a href="http://is.gd/bqS5l" target="blank">http://is.gd/bqS5l</a> </p>
</li>
<li class="twit-item"><b>@ <span class="twit-time">2010-4-5 9:31</span></b>
<p class="twit-content">#design #ipad 用色蛮漂亮的ipad天气预报设计 <a href="http://is.gd/buMyG" target="blank">http://is.gd/buMyG</a> </p>
</li>
<li class="twit-item"><b>@ <span class="twit-time">2010-4-5 9:33</span></b>
<p class="twit-content">#photo 30张很漂亮的中国主题宽屏幕墙纸。 <a href="http://is.gd/buMFn" target="blank">http://is.gd/buMFn</a> </p>
</li>
<li class="twit-item"><b>@ <span class="twit-time">2010-4-5 16:22</span></b>
<p class="twit-content">#infographics #design 太棒了，找到一个infographics的大集合： <a href="http://is.gd/bvcy2" target="blank">http://is.gd/bvcy2</a> </p>
</li>
<li class="twit-item"><b>@ <span class="twit-time">2010-4-5 16:32</span></b>
<p class="twit-content">#ucd #ued #web 50个漂亮的导航条设计 <a href="http://is.gd/bvdct" target="blank">http://is.gd/bvdct</a> </p>
</li>
<li class="twit-item"><b>@ <span class="twit-time">2010-4-5 17:26</span></b>
<p class="twit-content">#js #jquery #extjs EXTJS的最大优点就是做数据展示，但是EXTJS对于jQuery而言，过于臃肿，如果我们使用的框架是jQ，同时希望做很好的数据展示，这40个jQ插件也许可以帮上忙<a href="http://is.gd/bvgPu" target="blank">http://is.gd/bvgPu</a> </p>
</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://mycolorway.com/blog/2010/04/20/ued-ucd-collection-3/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>基于jQuery的HTML逐帧播放器</title>
		<link>http://mycolorway.com/blog/2009/09/21/html-frame-player/</link>
		<comments>http://mycolorway.com/blog/2009/09/21/html-frame-player/#comments</comments>
		<pubDate>Mon, 21 Sep 2009 04:04:58 +0000</pubDate>
		<dc:creator>farthinker</dc:creator>
				<category><![CDATA[Web前端技术]]></category>
		<category><![CDATA[frameplayer]]></category>
		<category><![CDATA[jQuery]]></category>
		<category><![CDATA[逐帧动画]]></category>
		<category><![CDATA[逐帧播放器]]></category>

		<guid isPermaLink="false">http://blog.mycolorway.com/?p=130</guid>
		<description><![CDATA[google.cn的导航大家一定不会陌生。在这个Web逐帧动画被flash统治的时代，基于HTML和JS的逐帧动画总是能让人感觉眼前一亮。由于公司新网站的“龙门阵”模块需要用到HTML的逐帧动画，我用jQuery写了一个逐帧播放器，这里共享出来，希望对童鞋们有所帮助。]]></description>
			<content:encoded><![CDATA[<p>
google.cn的导航大家一定不会陌生。在这个Web逐帧动画被flash统治的时代，基于HTML和JS的逐帧动画总是能让人感觉眼前一亮。存在即合理，与flash相比，HTML逐帧动画有着一些不可替代的优势，比如更好的可访问性、对搜索引擎更加友好等等，但是较高的技术门槛往往让众多开发人员望而却步。由于<a href="http://mycolorway.com" target="_blank">公司新网站</a>的“龙门阵”模块需要用到HTML的逐帧动画，我用jQuery写了一个简易逐帧播放器，这里共享出来，希望对童鞋们有所帮助。猛击<a href="http://farthinker.mycolorway.com/projects/frameplayer/index.html" target="_blank">这里</a>看<strong>Demo</strong>。</p>
<p>
<span id="more-130"></span></p>
<h3>基本原理</h3>
<p>
HTML逐帧动画的基本原理跟老式的动画片一样，就是把画好的图片一张一张逐个显示出来：
</p>
<p><img src="http://farthinker.cn/wp-content/uploads/2009/09/anim.png" alt="播放的图片" title="播放的图片" width="260" height="37" class="alignnone size-full wp-image-166" /></p>
<p>
具体到技术上，就是把所有的帧横向排列到一张图片上作为舞台(stage)div的背景图，控制舞台的高(height)、宽(width)和背景图位置(background-position)，使舞台同一时间只能显示一帧的图像，然后每隔一段时间（由帧速决定）改变一次舞台的背景图位置，让下一帧显示出来，达到“播放”的效果。
</p>
<h3>API接口</h3>
<p>
有童鞋肯定会问，为什么不用gif图片来播放逐帧动画呢？原因就是gif动画无法用程序来控制，没有API接口。
</p>
<p><em>Options</em></p>
<ul>
<li>img ( String, required ): 被播放图片的路径。</li>
<li>width ( Number, required ): 每一帧的宽度。</li>
<li>height ( Number, required ): 每一帧的高度。</li>
<li>framenum ( Number, required ): 总共有多少帧。</li>
<li>framerate ( Number, optional ): 播放的帧速，默认为25。</li>
<li>currentFrame ( Number, optional ): 当前处于第几帧，即从第几帧开始播放，默认为1。</li>
<li>autoPlay ( Boolen, optional ): 是否在初始化之后自动播放，默认为true。</li>
<li>reverse ( Boolen, optional ): 是否按倒序播放，默认为false。</li>
<li>vPosition ( String, optional ): 舞台竖直方向的背景图位置，默认为&#8221;0px&#8221;。</li>
</ul>
<p><em>Methods</em></p>
<ul>
<li>.frameplayer( &#8220;play&#8221; ): 开始播放。</li>
<li>.frameplayer( &#8220;pause&#8221; ): 暂停播放。</li>
<li>.frameplayer( &#8220;stop&#8221; ): 停止播放，回到第一帧（倒序播放时跳到最后一帧）。</li>
<li>.frameplayer( &#8220;options&#8221;, newOptions ): 修改选项参数，可修改的参数见”Options“。</li>
</ul>
<p><em>Events</em></p>
<ul>
<li>.bind( &#8220;play&#8221;, function ): 开始播放时触发。</li>
<li>.bind( &#8220;pause&#8221;, function ): 暂停播放时触发。</li>
<li>.bind( &#8220;play&#8221;, function ): 停止播放时触发。</li>
<li>.bind( &#8220;complete&#8221;, function ): 播放完毕时触发。</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://mycolorway.com/blog/2009/09/21/html-frame-player/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>基于Flex的Finance Chart</title>
		<link>http://mycolorway.com/blog/2009/08/17/finance-chart-based-on-flex/</link>
		<comments>http://mycolorway.com/blog/2009/08/17/finance-chart-based-on-flex/#comments</comments>
		<pubDate>Mon, 17 Aug 2009 09:26:26 +0000</pubDate>
		<dc:creator>古灵</dc:creator>
				<category><![CDATA[Web前端技术]]></category>
		<category><![CDATA[Finance Chart]]></category>
		<category><![CDATA[Flex]]></category>

		<guid isPermaLink="false">http://blog.colorcyberway.com/?p=72</guid>
		<description><![CDATA[Google Finance频道的Flash图表很好很强大，这里是一个使用Flex Builder开发的简单版本。]]></description>
			<content:encoded><![CDATA[<p><a title="Google Finance" href="http://www.google.com/finance?q=INDEXDJX:.DJI" target="_blank">Google Finance频道的Flash图表</a>很好很强大，这里是一个使用Flex Builder开发的简单版本：</p>
<p><img class="alignnone size-full wp-image-73" src="http://blog.mycolorway.com/wp-content/uploads/2009/08/2009-08-17_175504.png" alt="CCW_Slide_Chart" width="568" height="331" /></p>
<p>代码很简单，在Demo中直接点击右键即可查看。</p>
<p><a title="CCW Slide Chart" href="http://blog.mycolorway.com/demo/SlideChart/" target="_blank">Demo</a></p>
]]></content:encoded>
			<wfw:commentRss>http://mycolorway.com/blog/2009/08/17/finance-chart-based-on-flex/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>在Web中实现C/S模式的Tab</title>
		<link>http://mycolorway.com/blog/2009/03/24/implementation-of-cs-tab/</link>
		<comments>http://mycolorway.com/blog/2009/03/24/implementation-of-cs-tab/#comments</comments>
		<pubDate>Tue, 24 Mar 2009 14:52:49 +0000</pubDate>
		<dc:creator>farthinker</dc:creator>
				<category><![CDATA[Web前端技术]]></category>
		<category><![CDATA[C/S]]></category>
		<category><![CDATA[iframe]]></category>
		<category><![CDATA[tab]]></category>

		<guid isPermaLink="false">http://blog.colorcyberway.com/?p=33</guid>
		<description><![CDATA[这篇文章主要讨论在web中实现C/S模式tab的一种方案]]></description>
			<content:encoded><![CDATA[<div id="attachment_60" class="wp-caption alignnone" style="width: 400px"><a href="http://blog.mycolorway.com/wp-content/uploads/2009/03/cs-tabs.jpg"><img src="http://blog.mycolorway.com/wp-content/uploads/2009/03/cs-tabs.jpg" alt="C/S模式的tab" width="390" height="95" class="size-full wp-image-60" /></a><p class="wp-caption-text">C/S模式的tab</p></div>
<p>
在探讨C/S模式的Tab之前，我们先总结一下B/S模式的Tab通常是什么样的。web中常见的tab设计通常是用于分节展示大量信息以提高页面空间的利用率，而且这些信息通常是静态的，或者交互比较简单。通过ajax动态加载tab内容的技术也是为这种应用场景设计的。
</p>
<p>
随着Web技术的发展，越来越多的桌面应用都在向Web应用转型。在这个过程中，很多C/S模式的应用场景不可避免的会被移植到Web中。但是B/S模式相对较弱的交互性决定了某些移植很难实现或者效果不好。C/S模式的Tab设计就是其中之一。
</p>
<p><span id="more-33"></span></p>
<p>
所谓C/S模式的Tab实际上是为了在不需要打开多个应用的情况下，可以同时对多个对象进行操作，以提高工作效率。这个应用场景在往B/S移植的过程中，如果沿用B/S常用的tab技术，通过ajax动态加载tab内容，就会有一些技术难点：
</p>
<ul>
<li>在B/S的架构中，同一类型的tab页通常是对应的同一个物理页面，例如订单A和订单B的的tab页实际上都是对应的order.php这个页面，只不过请求的GET参数不一样而已。这样如果同时加载了订单A和订单B的tab页，那么这两个页面的html和js很可能发生冲突。</li>
<li>我们需要用一种标识来区别不同的tab页，并且避免重复打开同一个tab页。例如，在订单A已经被打开的情况下，如果试图再打开订单A，那么订单A的tab应该被激活，而不是再打开一个订单A。</li>
<li>如果打开的tab数量较多，或者tab页中的交互复杂、内容很多，浏览器就很容易出现性能问题，速度变的很慢。</li>
<li>还有很多潜在的、琐碎的问题随时可能让我们抓狂。在这点上，我是有惨痛教训的……</li>
</ul>
<p>
其实解决上面这些问题的方式是很多的。经过一些尝试、失败和总结，我选择了一种现代结合复古的方式：动态生成iframe，并通过iframe的src属性来区分不同的tab。采用这种方案之后，上面难题都迎刃而解，唯一的不足就是tab子页和主页间的交互会变得比较复杂。请猛击<a href="http://blog.mycolorway.com/demo/cstab/" target="_blank">这里</a>看demo。这个demo模拟了一个查看、修改订单的应用场景，主要实现了这些功能：
</p>
<ol>
<li>添加tab的时候，动态生成一个iframe。并且在tab切换的时候，所有iframe都不会刷新。</li>
<li>iframe的高度自适应内容的高度。</li>
<li>在尝试打开一个已经存在的tab的时候，会激活这个tab，不会重复打开相同的tab。</li>
<li>tab可以被关闭，并且关闭的时候tab对应的iframe会被移除。</li>
</ol>
<p>下面我们就一步一步的实现上面的功能。</p>
<h3>第一步：编写demo的框架</h3>
<p>
这个demo用到了jquery和jquery的ui库，文件结构如图：
</p>
<div id="attachment_62" class="wp-caption alignnone" style="width: 214px"><a href="http://blog.mycolorway.com/wp-content/uploads/2009/03/cs-tab-demo-files.jpg"><img src="http://blog.mycolorway.com/wp-content/uploads/2009/03/cs-tab-demo-files.jpg" alt="demo的文件结构" width="204" height="199" class="size-full wp-image-62" /></a><p class="wp-caption-text">demo的文件结构</p></div>
<p>其中：</p>
<ul>
<li><em>index.html</em>是demo的首页。</li>
<li><em>order.php</em>就是订单的详细页面，每个订单详情tab都是加载的这个页面。</li>
<li><em>index.css</em>是首页的样式表。</li>
<li><em>index.js</em>是首页的js脚本。</li>
</ul>
<p>由于篇幅的限制，这里就不贴代码了，demo的源代码在文章<a href="#demoSrc">最后</a>可以下载。</p>
<h3>第二步：初始化jquery tab</h3>
<p>现在我们可以开始编写index.js了。首先是初始化tab：</p>
<pre class="brush: jscript;">
// 初始化tab
$( &quot;#tabs&quot; ).tabs({
    tabTemplate: '&lt;li&gt;&lt;a href=&quot;#{href}&quot;&gt;#{label}&lt;/a&gt;&lt;a class=&quot;close&quot; href=&quot;#&quot;&gt;x&lt;/a&gt;&lt;/li&gt;',
    cache: true
})
.bind( &quot;tabsadd&quot;, function( event, ui ) {
    $( this ).tabs( &quot;select&quot;, &quot;#&quot; + ui.panel.id );
});
</pre>
</p>
<p>初始化参数中的tabTemplate是为后面的关闭tab做准备。这里还绑定了一个tabsadd的事件处理函数，作用是在添加tab之后立即选中新增的tab。</p>
<h3>第三步：动态生成iframe</h3>
<p>如果现在打开页面，只能看到订单列表一个tab，下面我们让列表中的连接被点击之后，添加一个新tab显示对应订单的详情：</p>
<pre class="brush: jscript;">
// 点击添加tab页
$( &quot;.list a&quot; ).click( function( e ) {
    e.preventDefault();
    var href = $( this ).attr( &quot;href&quot; );
    var orderid = href.substring( href.indexOf( &quot;-&quot; ) + 1 );
    var tabid = &quot;order-&quot; + orderid;
    var url = &quot;order.php?orderid=&quot; + orderid;
    var label = &quot;订单详情-&quot; + orderid;
    addTab( tabid, url, label );
});

// 添加tab的接口
function addTab( id, url, label ) {
    var mainTab = $( &quot;#tabs&quot; );
    var panel = $( &quot;&lt;div/&gt;&quot; ).attr({
        &quot;id&quot;: id
    }).appendTo( mainTab );

    mainTab.tabs( &quot;add&quot;, &quot;#&quot; + id, label );

    $( &quot;&lt;iframe/&gt;&quot; ).attr({
        &quot;frameBorder&quot;: &quot;0&quot;,
        &quot;scrolling&quot;: &quot;no&quot;,
        &quot;allowTransparency&quot;: &quot;true&quot;,
        &quot;src&quot;: url
    }).css({
        &quot;width&quot;: &quot;100%&quot;,
        &quot;height&quot;: &quot;100px&quot;
    }).load( function() {
        var iframe = $( this );
        iframe.height( iframe.contents().find( &quot;body&quot; ).height());
    }).appendTo( panel );
}
</pre>
</p>
<p>上面的代码中，我们编写了一个方法作为添加tab的通用接口。在点击某一个订单链接的时候，我们会调用这个添加tab的接口，按顺序做这几件事：</p>
<ol>
<li>生成一个div，作为jquery tab的panel，也就是iframe的容器。</li>
<li>调用jquery tab的接口新增一个tab指向刚才的div，并选中这个tab（刚才绑定的tabsadd事件）。</li>
<li>创建并初始化一个iframe，然后将它添加到刚生成的div里面。其中，在初始化的时候我们给iframe添加了一个load事件的处理函数，用来让iframe自适应内容的高度。</li>
</ol>
<h3>第四步：防止重复打开tab</h3>
<p>
现在如果多次点击订单列表中的同一个链接，我们会打开多个相同的tab。为了避免这种情况发生，我们需要在添加tab之前，通过iframe的src判断这个tab是否已经被打开，如果已经被打开，则选中这个tab（4行至15行）：</p>
<pre class="brush: jscript;">
// 添加tab的接口
function addTab( id, url, label ) {
    var mainTab = $( &quot;#tabs&quot; );
    var added = false;
    $( &quot;iframe&quot;, mainTab ).each( function( i ) {
        var src = this.src.substring( this.src.lastIndexOf( &quot;/&quot; ) + 1 );
        if ( src == url ) {
            added = $( this );
        }
    });

    if ( added ) {
        mainTab.tabs( &quot;select&quot;, &quot;#&quot; + added.parent().attr( &quot;id&quot; ));
        return;
    }

    var panel = $( &quot;&lt;div/&gt;&quot; ).attr({
        &quot;id&quot;: id
    }).appendTo( mainTab );

    mainTab.tabs( &quot;add&quot;, &quot;#&quot; + id, label );

    $( &quot;&lt;iframe/&gt;&quot; ).attr({
        &quot;frameBorder&quot;: &quot;0&quot;,
        &quot;scrolling&quot;: &quot;no&quot;,
        &quot;allowTransparency&quot;: &quot;true&quot;,
        &quot;src&quot;: url
    }).css({
        &quot;width&quot;: &quot;100%&quot;,
        &quot;height&quot;: &quot;100px&quot;
    }).load( function() {
        var iframe = $( this );
        iframe.height( iframe.contents().find( &quot;body&quot; ).height());
    }).appendTo( panel );
}
</pre>
</p>
<h3>第五步：关闭tab</h3>
<p>最后我们让tab上的关闭链接发挥作用。实现这个功能通常的思路是，在每次添加tab的时候（tabsadd事件）绑定关闭tab的处理函数。但是这里我们会使用jquery 1.3中的一个新特性——live event来实现这个功能：</p>
<pre class="brush: jscript;">
// 动态绑定关闭tab的事件
$( &quot;.ui-tabs-nav a.close&quot; ).live( &quot;click&quot;, function( e ) {
    e.preventDefault();
    var index = $( &quot;.ui-tabs-nav li&quot; ).index( $( this ).parent());
    $( &quot;#tabs&quot; ).tabs( &quot;remove&quot;, index );
});
</pre>
</p>
<p>简单的说，live event就是预先给某些目前DOM中可能不存在，但是未来会被动态加入到DOM中的元素绑定事件处理函数。想了解更多关于live event的信息，请参考jquery的<a href="http://docs.jquery.com/Events/live" target="_blank">文档</a>。</p>
<p>至此，demo中的所有功能我们都已经实现了。这种实现C/S模式tab的方案，就目前来说，我觉得不是完美的，但却是可行性最强的。现实的开发中可能出现的一些其他常用需求，比如加载iframe的loading效果，实现起来都会比较容易。</p>
<p>下载：<a href="http://blog.mycolorway.com/download/cstab.rar" name="demoSrc">demo的源代码</a></p>
]]></content:encoded>
			<wfw:commentRss>http://mycolorway.com/blog/2009/03/24/implementation-of-cs-tab/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>
