<?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>ria之家--RIA三部曲：jquery、ext、flex</title>
	<atom:link href="http://www.36ria.com/feed" rel="self" type="application/rss+xml" />
	<link>http://www.36ria.com</link>
	<description>RIA三部曲：jquery、ext、flex</description>
	<lastBuildDate>Sat, 12 May 2012 13:21:55 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.2</generator>
		<item>
		<title>Javascript中的DOM事件</title>
		<link>http://www.36ria.com/5394</link>
		<comments>http://www.36ria.com/5394#comments</comments>
		<pubDate>Sat, 12 May 2012 13:21:55 +0000</pubDate>
		<dc:creator>飞绿</dc:creator>
				<category><![CDATA[javascript]]></category>

		<guid isPermaLink="false">http://www.36ria.com/?p=5394</guid>
		<description><![CDATA[DOM树上可监听的事件如下表： 事件名称 说明 描述 DOMActivate W3C草案 当button、link或其他元素被激活后，浏览器派发该事件。 包括激活的对象和事件的一些信息（）。 DOMAttrModified W3C草案 元素的ATTR.value被编辑，或Attr node添加到元素上或从元素上移除后，浏览器派发该事件。 DOMAttributeNameChanged W3C草案 当Attr node的namespaceURI 或nodeName编辑后，浏览器派发该事件（如，用document.renameNo......]]></description>
			<content:encoded><![CDATA[<p>DOM树上可监听的事件如下表：</p>
<table border="0" cellspacing="0" cellpadding="0" class="tab1">
<colgroup>
<col width="160">
<col width="160">
<col>
	</colgroup>
<thead>
<tr>
<td valign="top">
<p><strong>事件名称</strong></p>
</td>
<td valign="top">
<p><strong>说明</strong></p>
</td>
<td valign="top">
<p><strong>描述</strong></p>
</td>
</tr>
</thead>
<tbody>
<tr>
<td valign="top">
<p><strong>DOMActivate</strong></p>
</td>
<td valign="top"><a target="_blank" href="http://www.w3.org/TR/DOM-Level-3-Events/" title="W3C草案">W3C草案</a></td>
<td valign="top">
<p>当button、link或其他元素被激活后，浏览器派发该事件。</p>
<p>包括激活的对象和事件的一些信息（）。</p>
</td>
</tr>
<tr>
<td valign="top">
<p><strong>DOMAttrModified</strong></p>
</td>
<td valign="top"><a target="_blank" href="http://www.w3.org/TR/DOM-Level-3-Events/" title="W3C草案">W3C草案</a></td>
<td valign="top">
<p>元素的ATTR.value被编辑，或Attr node添加到元素上或从元素上移除后，浏览器派发该事件。</p>
</td>
</tr>
<tr>
<td valign="top">
<p><strong>DOMAttributeNameChanged</strong></p>
</td>
<td valign="top"><a target="_blank" href="http://www.w3.org/TR/DOM-Level-3-Events/" title="W3C草案">W3C草案</a></td>
<td valign="top">
<p>当Attr node的namespaceURI 或nodeName编辑后，浏览器派发该事件（如，用document.renameNode()来对attribute重命名）。</p>
</td>
</tr>
<tr>
<td valign="top">
<p><strong>DOMCharacterDataModified</strong></p>
</td>
<td valign="top"><a target="_blank" href="http://www.w3.org/TR/DOM-Level-3-Events/" title="W3C草案">W3C草案</a></td>
<td valign="top">
<p>前提：node本身没有被插入或删除。</p>
<p>ode的characterData.data或ProcessingInstruction.data被编辑后，浏览器派发。</p>
</td>
</tr>
<tr>
<td valign="top">
<p><strong>DOMContentLoaded</strong></p>
</td>
<td valign="top"><a target="_blank" href="http://www.whatwg.org/specs/web-apps/current-work/multipage/the-end.html" title="HTML5">HTML5</a></td>
<td valign="top">
			</td>
</tr>
<tr>
<td valign="top">
<p><strong>DOMElementNameChanged</strong></p>
</td>
<td valign="top"><a target="_blank" href="http://www.w3.org/TR/DOM-Level-3-Events/" title="W3C草案">W3C草案</a></td>
<td valign="top">
<p>element  node的namespaceURI 或nodeName编辑后，浏览器派发该事件（如，用document.renameNode（）来对元素重命名）。</p>
</td>
</tr>
<tr>
<td valign="top">
<p><strong>DOMFocusIn</strong></p>
</td>
<td valign="top"><a target="_blank" href="http://www.w3.org/TR/DOM-Level-3-Events/" title="W3C草案">W3C草案</a></td>
<td valign="top">
<p>当元素获取焦点时，浏览器派发该事件。</p>
<p>注意：</p>
<p>1、该事件要在事件对象获取焦点前派发。</p>
<p>2、而且该事件在focus事件之后派发。</p>
</td>
</tr>
<tr>
<td valign="top">
<p><strong>DOMFocusOut</strong></p>
</td>
<td valign="top"><a target="_blank" href="http://www.w3.org/TR/DOM-Level-3-Events/" title="W3C草案">W3C草案</a></td>
<td valign="top">
<p>当element失去焦点时，浏览器派发该事件。</p>
<p>注意：</p>
<p>1、事件要在焦点从目标元素移除之前派发；</p>
<p>2、并且该事件是在blur事件之后派发。</p>
</td>
</tr>
<tr>
<td valign="top">
<p><strong>DOMNodeInserted</strong></p>
</td>
<td valign="top"><a target="_blank" href="http://www.w3.org/TR/DOM-Level-3-Events/" title="W3C草案">W3C草案</a></td>
<td valign="top">
<p>1、当一个node（不包括attr node）被添加到另一个node时，浏览器派发该事件；</p>
<p>2、当一个attr node被添加到另一个Element node后，浏览器派发该事件。</p>
<p>注意：该事件是在插入之后派发的（不是插入前）。</p>
</td>
</tr>
<tr>
<td valign="top">
<p><strong>DOMNodeInsertedIntoDocument</strong></p>
</td>
<td valign="top"><a target="_blank" href="http://www.w3.org/TR/DOM-Level-3-Events/" title="W3C草案">W3C草案</a></td>
<td valign="top">
<p>当node插入到document中（直接的或其子节点）时，浏览器派发该事件；</p>
<p>浏览器可以选择性的对待attr node为element的子节点。</p>
<p>注意：该事件是在插入之后派发的。</p>
</td>
</tr>
<tr>
<td valign="top">
<p><strong>DOMNodeRemoved</strong></p>
</td>
<td valign="top"><a target="_blank" href="http://www.w3.org/TR/DOM-Level-3-Events/" title="W3C草案">W3C草案</a></td>
<td valign="top">
<p>1、当一个node（不包括attr node）被移除时，浏览器派发该事件；</p>
<p>2、当一个attr node从其ownerElement移除，浏览器可以选择性的派发该事件<br />
注意：该事件是在移除之前派发的。</p>
</td>
</tr>
<tr>
<td valign="top">
<p><strong>DOMNodeRemovedFromDocument</strong></p>
</td>
<td valign="top"><a target="_blank" href="http://www.w3.org/TR/DOM-Level-3-Events/" title="W3C草案">W3C草案</a></td>
<td valign="top">
<p>当node从document中（直接的或其子节点）移除后，浏览器派发该事件；</p>
<p>浏览器可以选择性的对待attr node为element的子节点；</p>
<p>注意：该事件是在移除之前派发的</p>
</td>
</tr>
<tr>
<td valign="top">
<p><strong>DOMSubtreeModified</strong></p>
</td>
<td valign="top"><a target="_blank" href="http://www.w3.org/TR/DOM-Level-3-Events/" title="W3C草案">W3C草案</a></td>
<td valign="top">
<p>对于document，该事件很常见。只要document的任何地方发生变化，浏览器就会派发该事件。</p>
<p>所以可以用该事件代替以上列举的那些具体的事件。</p>
<p>1、当document发生单一的变化时，浏览器会派发该事件；</p>
<p>2、Document同时或非常快速连续的发生多个变化时，浏览器会根据各自的规则来处理合并这些变化，派发该事件。</p>
<p>事件目标对象 对应 事件所发生node的直接普通父元素。</p>
<p>注意：该事件是在改变之后派发。</p>
</td>
</tr>
</tbody>
</table>
<p>DOMContentLoaded事件在很多js框架源码中都有出现，对应dom ready。<br />
这些事件名称语义上看起来都很清楚，添加事件监听也跟其他事件一样的简单。</p>
<pre class='brush: js; '>
	document.addEventListener("DOMSubtreeModified", function(e) {
	  	// Notify of change!
	  	console.warn("change!", e);
	}, false);

	// Now create a new element to see what it will look like
	var a = document.createElement("a");
	document.body.appendChild(a);

	/*
		Result:

		{
			ADDITION: 2,
			MODIFICATION: 1,
			REMOVAL: 3,
			attrChange: 0,
			attrName: "",
			defaultPrevented: false,
			newValue: "",
			prevValue: "",
			relatedNode: null,
			initMutationEvent: initMutationEvent(),
			bubbles: true,
			cancelable: false,
			constructor: MutationEvent { MODIFICATION=1, ADDITION=2, REMOVAL=3},
			currentTarget: Document en,
			eventPhase: 3,
			explicitOriginalTarget: body.home,
			isTrusted: true,
			originalTarget: body.home,
			target: body.home,
			timeStamp: 0,
			type: "DOMSubtreeModified"
		}

	*/
</pre>
<p>如果你想单独对某个node添加事件监听，代码如下：</p>
<pre class='brush: js; '>
	document.getElementById("slideshowImage").addEventListener("DOMAttrModified", function(e) {
 	// Record the occurrence
  	console.warn(e.attrName + " changed from ", e.prevValue," to: ", e.newValue);
}, false);
</pre>
<p>attrName&#8211;记录哪个属性发生了改变, prevValue—改变前的值,newValue—改变后的值。每个事件都有它各自的属性。详细请看 <a target="_blank" href="http://www.w3.org/TR/DOM-Level-3-Events/" title="spec list">spec list</a> </p>
<p>运用这些DOM事件能更精确的掌控document。但值得注意的一点是这些事件会频繁的产生，所以添加这些事件监听会使应用很复杂、繁重。但在复杂的web应用中，根据需求来灵活应用它们会非常有用。</p>
<p>文章翻译自	<a href="http://davidwalsh.name/dom-events-javascript" title="DOM Events in JavaScript">DOM Events in JavaScript</a>	</p>
]]></content:encoded>
			<wfw:commentRss>http://www.36ria.com/5394/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Bootstrap—由less来架构Bootstrap（3）</title>
		<link>http://www.36ria.com/5272</link>
		<comments>http://www.36ria.com/5272#comments</comments>
		<pubDate>Fri, 11 May 2012 10:21:55 +0000</pubDate>
		<dc:creator>苏河</dc:creator>
				<category><![CDATA[css]]></category>
		<category><![CDATA[javascript]]></category>

		<guid isPermaLink="false">http://www.36ria.com/?p=5272</guid>
		<description><![CDATA[众所周知，less是一种动态样式语言， bootstrap基于less来编写是为了让bootstrap能够继承less的优势，如变量，继承，运算，函数。如果大家想了解或者回顾下less可以看下以前苏河介绍的less 让css动起来—-lesscss（1） 让css动起来—-lesscss（2） 用less编写bootstrap 为什么使用less？ Bootstrap的核心是用less来编写的，这里允许我介绍下less的作者：Alexis Sellier（他的个人网站貌似被墙了）。Le......]]></description>
			<content:encoded><![CDATA[<style>
.swatch {
    border-radius: 3px 3px 3px 3px;
    display: inline-block;
    height: 20px;
    margin: -6px 0;
    width: 30px;
}
.entry-content table td{
    border-bottom:none;
}
.table-bordered {
    -moz-border-bottom-colors: none;
    -moz-border-image: none;
    -moz-border-left-colors: none;
    -moz-border-right-colors: none;
    -moz-border-top-colors: none;
    border-collapse: separate;
    border-radius: 4px;
    background:#ddd;
margin-bottom:15px;
}
</style>
<p>众所周知，less是一种动态样式语言， bootstrap基于less来编写是为了让bootstrap能够继承less的优势，如变量，继承，运算，函数。如果大家想了解或者回顾下less可以看下以前苏河介绍的less</p>
<ul>
<li><a href="http://www.google.com/url?q=http://www.36ria.com/4648&#038;sa=U&#038;ei=demhT-fuOsnimAWroMzzBw&#038;ved=0CAkQFjAC&#038;client=internal-uds-cse&#038;usg=AFQjCNGoUZuPTCVDUToAfP_U1Bd60pA7ew">让css动起来—-lesscss（1）</a></li>
<li><a href="http://www.google.com/url?q=http://www.36ria.com/5011&#038;sa=U&#038;ei=demhT-fuOsnimAWroMzzBw&#038;ved=0CAcQFjAB&#038;client=internal-uds-cse&#038;usg=AFQjCNGONLyrgoF2-9uHxOgpRTFupxKvdA">让css动起来—-lesscss（2）</a></li>
</ul>
<h2>用less编写bootstrap</h2>
<h3>为什么使用less？</h3>
<p>Bootstrap的核心是用less来编写的，这里允许我介绍下less的作者：<a href="http://cloudhead.io/">Alexis Sellier</a>（他的个人网站貌似被墙了）。Less让我们编写css代码更具乐趣，更加方便和迅速。</p>
<h3>Less包含什么？</h3>
<p>Less包含变量，混合，对可重用代码的继承以及一些数学的简单操作，甚至是一些颜色的函数。</p>
<h3>学习更多</h3>
<p>如果你想学习更多，可以直接去官方网站了解<a href="http://lesscss.org">http://lesscss.org</a> ，（附中文官网：<a href="http://www.lesscss.net">http://www.lesscss.net</a>/ ）</p>
<h2>less的特性</h2>
<h3>变量</h3>
<p>如何管理网站的主体颜色和主体容器的高度和宽度切实让人有点头疼，大家一定有不断的做ctrl+c和ctrl+v的操作来反复替换这些常量吧，但是一旦我们用了less来管理这些变量，就能达到牵一发而动全身的效果，管理起来非常方便</p>
<h3>混合</h3>
<p>还记得你写border-radius需要申明冗余的类似-moz-border-radius和-webkit-border-radius等属性吧，但是如果我用混合的特征来管理border-radius来达到重用的效果，那么，代码看起来就会非常简洁了。</p>
<h3>函数</h3>
<p>针对一些复杂的操作，比如栅格布局，数学的加减乘除计算，颜色的变化等等，我们都可以用函数来进行</p>
<h3>&nbsp;</h3>
<p>介绍完less部分，该介绍主体的部分了，既然bootstrap继承less，那么它有哪些特点呢？<br />
bootstrap对less进行了二次封装，提供了很多基础的less变量和函数，个人觉得非常有用，下面就来具体看下bootstrap为我们提供了哪些常用的变量和函数吧。</p>
<h2>Bootstrap变量</h2>
<div class="span6">
<h3>基础设置</h3>
<table class="table table-bordered table-striped">
<tbody>
<tr>
<td class="span2"><code>@bodyBackground</code></td>
<td><code>@white</code></td>
<td>页面背景色</td>
<td class="swatch-col"><span style="background-color: #fff;" class="swatch"></span></td>
</tr>
<tr>
<td><code>@textColor</code></td>
<td><code>@grayDark</code></td>
<td>默认的文字颜色</td>
<td class="swatch-col"><span style="background-color: #333;" class="swatch"></span></td>
</tr>
<tr>
<td><code>@linkColor</code></td>
<td><code>#08c</code></td>
<td>默认的链接颜色</td>
<td class="swatch-col"><span style="background-color: #08c;" class="swatch"></span></td>
</tr>
<tr>
<td><code>@linkColorHover</code></td>
<td><code>darken(@linkColor, 15%)</code></td>
<td>默认链接hover样式</td>
<td><span style="background-color: #005580;" class="swatch"></span></td>
</tr>
</tbody>
</table>
<h3>页面栅格</h3>
<table class="table table-bordered table-striped">
<tbody>
<tr>
<td class="span2"><code>@gridColumns</code></td>
<td>12</td>
</tr>
<tr>
<td><code>@gridColumnWidth</code></td>
<td>60px</td>
</tr>
<tr>
<td><code>@gridGutterWidth</code></td>
<td>20px</td>
</tr>
<tr>
<td><code>@fluidGridColumnWidth</code></td>
<td>6.382978723%</td>
</tr>
<tr>
<td><code>@fluidGridGutterWidth</code></td>
<td>2.127659574%</td>
</tr>
</tbody>
</table>
<h3>字体</h3>
<table class="table table-bordered table-striped">
<tbody>
<tr>
<td class="span2"><code>@sansFontFamily</code></td>
<td colspan="2">“Helvetica Neue”, Helvetica, Arial, sans-serif</td>
</tr>
<tr>
<td><code>@serifFontFamily</code></td>
<td colspan="2"><code>Georgia, "Times New Roman", Times, serif</code></td>
</tr>
<tr>
<td><code>@monoFontFamily</code></td>
<td colspan="2">Menlo, Monaco, “Courier New”, monospace</td>
</tr>
<tr>
<td class="span2"><code>@baseFontSize</code></td>
<td>13px</td>
<td><em class="muted">以像素为单位</em></td>
</tr>
<tr>
<td><code>@baseFontFamily</code></td>
<td colspan="2"><code>@sansFontFamily</code></td>
</tr>
<tr>
<td><code>@baseLineHeight</code></td>
<td>18px</td>
<td><em class="muted">以像素为单位</em></td>
</tr>
<tr>
<td><code>@altFontFamily</code></td>
<td colspan="2"><code>@serifFontFamily</code></td>
</tr>
<tr>
<td class="span2"><code>@headingsFontFamily</code></td>
<td colspan="2"><code>inherit</code></td>
</tr>
<tr>
<td><code>@headingsFontWeight</code></td>
<td colspan="2"><code>bold</code></td>
</tr>
<tr>
<td><code>@headingsColor</code></td>
<td colspan="2"><code>inherit</code></td>
</tr>
</tbody>
</table>
<h3>表格tables</h3>
<table class="table table-bordered table-striped">
<tbody>
<tr>
<td class="span2"><code>@tableBackground</code></td>
<td><code>transparent</code></td>
</tr>
<tr>
<td><code>@tableBackgroundAccent</code></td>
<td><code>#f9f9f9</code></td>
</tr>
<tr>
<td><code>@tableBackgroundHover</code></td>
<td><code>#f5f5f5</code></td>
</tr>
<tr>
<td><code>@tableBorder</code></td>
<td><code>ddd</code></td>
</tr>
</tbody>
</table></div>
<div class="span6">
<h3>冷色调</h3>
<table class="table table-bordered table-striped">
<tbody>
<tr>
<td class="span2"><code>@black</code></td>
<td>#000</td>
<td class="swatch-col"><span style="background-color: #000;" class="swatch"></span></td>
</tr>
<tr>
<td><code>@grayDarker</code></td>
<td>#222</td>
<td><span style="background-color: #222;" class="swatch"></span></td>
</tr>
<tr>
<td><code>@grayDark</code></td>
<td>#333</td>
<td><span style="background-color: #333;" class="swatch"></span></td>
</tr>
<tr>
<td><code>@gray</code></td>
<td>#555</td>
<td><span style="background-color: #555;" class="swatch"></span></td>
</tr>
<tr>
<td><code>@grayLight</code></td>
<td>#999</td>
<td><span style="background-color: #999;" class="swatch"></span></td>
</tr>
<tr>
<td><code>@grayLighter</code></td>
<td>#eee</td>
<td><span style="background-color: #eee;" class="swatch"></span></td>
</tr>
<tr>
<td><code>@white</code></td>
<td>#fff</td>
<td><span style="background-color: #fff;" class="swatch swatch-bordered"></span></td>
</tr>
</tbody>
</table>
<h3>暖色调</h3>
<table class="table table-bordered table-striped">
<tbody>
<tr>
<td class="span2"><code>@blue</code></td>
<td>#049cdb</td>
<td class="swatch-col"><span style="background-color: #049cdb;" class="swatch"></span></td>
</tr>
<tr>
<td><code>@green</code></td>
<td>#46a546</td>
<td><span style="background-color: #46a546;" class="swatch"></span></td>
</tr>
<tr>
<td><code>@red</code></td>
<td>#9d261d</td>
<td><span style="background-color: #9d261d;" class="swatch"></span></td>
</tr>
<tr>
<td><code>@yellow</code></td>
<td>#ffc40d</td>
<td><span style="background-color: #ffc40d;" class="swatch"></span></td>
</tr>
<tr>
<td><code>@orange</code></td>
<td>#f89406</td>
<td><span style="background-color: #f89406;" class="swatch"></span></td>
</tr>
<tr>
<td><code>@pink</code></td>
<td>#c3325f</td>
<td><span style="background-color: #c3325f;" class="swatch"></span></td>
</tr>
<tr>
<td><code>@purple</code></td>
<td>#7a43b6</td>
<td><span style="background-color: #7a43b6;" class="swatch"></span></td>
</tr>
</tbody>
</table></div>
<h3>组件</h3>
<div class="span6">
      <strong>按钮buttons</strong></p>
<table class="table table-bordered table-striped">
<tbody>
<tr>
<td class="span3"><code>@btnBackground</code></td>
<td><code>@white</code></td>
<td class="swatch-col"><span style="background-color: #fff;" class="swatch"></span></td>
</tr>
<tr>
<td class="span3"><code>@btnBackgroundHighlight</code></td>
<td><code>darken(@white, 10%)</code></td>
<td class="swatch-col"><span style="background-color: #e6e6e6;" class="swatch"></span></td>
</tr>
<tr>
<td class="span3"><code>@btnBorder</code></td>
<td><code>darken(@white, 20%)</code></td>
<td class="swatch-col"><span style="background-color: #ccc;" class="swatch"></span></td>
</tr>
<tr>
<td class="span3"><code>@btnPrimaryBackground</code></td>
<td><code>@linkColor</code></td>
<td class="swatch-col"><span style="background-color: #08c;" class="swatch"></span></td>
</tr>
<tr>
<td class="span3"><code>@btnPrimaryBackgroundHighlight</code></td>
<td><code>spin(@btnPrimaryBackground, 15%)</code></td>
<td class="swatch-col"><span style="background-color: #05c;" class="swatch"></span></td>
</tr>
<tr>
<td class="span3"><code>@btnInfoBackground</code></td>
<td><code>#5bc0de</code></td>
<td class="swatch-col"><span style="background-color: #5bc0de;" class="swatch"></span></td>
</tr>
<tr>
<td class="span3"><code>@btnInfoBackgroundHighlight</code></td>
<td><code>#2f96b4</code></td>
<td class="swatch-col"><span style="background-color: #2f96b4;" class="swatch"></span></td>
</tr>
<tr>
<td class="span3"><code>@btnSuccessBackground</code></td>
<td><code>#62c462</code></td>
<td class="swatch-col"><span style="background-color: #62c462;" class="swatch"></span></td>
</tr>
<tr>
<td class="span3"><code>@btnSuccessBackgroundHighlight</code></td>
<td><code>51a351</code></td>
<td class="swatch-col"><span style="background-color: #51a351;" class="swatch"></span></td>
</tr>
<tr>
<td class="span3"><code>@btnWarningBackground</code></td>
<td><code>lighten(@orange, 15%)</code></td>
<td class="swatch-col"><span style="background-color: #fbb450;" class="swatch"></span></td>
</tr>
<tr>
<td class="span3"><code>@btnWarningBackgroundHighlight</code></td>
<td><code>@orange</code></td>
<td class="swatch-col"><span style="background-color: #f89406;" class="swatch"></span></td>
</tr>
<tr>
<td class="span3"><code>@btnDangerBackground</code></td>
<td><code>#ee5f5b</code></td>
<td class="swatch-col"><span style="background-color: #ee5f5b;" class="swatch"></span></td>
</tr>
<tr>
<td class="span3"><code>@btnDangerBackgroundHighlight</code></td>
<td><code>#bd362f</code></td>
<td class="swatch-col"><span style="background-color: #bd362f;" class="swatch"></span></td>
</tr>
<tr>
<td class="span3"><code>@btnInverseBackground</code></td>
<td><code>@gray</code></td>
<td class="swatch-col"><span style="background-color: #555;" class="swatch"></span></td>
</tr>
<tr>
<td class="span3"><code>@btnInverseBackgroundHighlight</code></td>
<td><code>@grayDarker</code></td>
<td class="swatch-col"><span style="background-color: #222;" class="swatch"></span></td>
</tr>
</tbody>
</table>
<p>      <strong>表单Forms</strong></p>
<table class="table table-bordered table-striped">
<tbody>
<tr>
<td class="span3"><code>@placeholderText</code></td>
<td><code>@grayLight</code></td>
</tr>
<tr>
<td><code>@inputBackground</code></td>
<td><code>@white</code></td>
</tr>
<tr>
<td><code>@inputBorder</code></td>
<td><code>#ccc</code></td>
</tr>
<tr>
<td><code>@inputBorderRadius</code></td>
<td><code>3px</code></td>
</tr>
<tr>
<td><code>@inputDisabledBackground</code></td>
<td><code>@grayLighter</code></td>
</tr>
<tr>
<td><code>@formActionsBackground</code></td>
<td><code>#f5f5f5</code></td>
</tr>
</tbody>
</table>
<p>      <strong>表单Form提示背景及文字颜色</strong></p>
<table class="table table-bordered table-striped">
<tbody>
<tr>
<td class="span3"><code>@warningText</code></td>
<td>#c09853</td>
<td><span style="background-color: #c09853;" class="swatch"></span></td>
</tr>
<tr>
<td><code>@warningBackground</code></td>
<td>#f3edd2</td>
<td class="swatch-col"><span style="background-color: #f3edd2;" class="swatch"></span></td>
</tr>
<tr>
<td><code>@errorText</code></td>
<td>#b94a48</td>
<td><span style="background-color: #b94a48;" class="swatch"></span></td>
</tr>
<tr>
<td><code>@errorBackground</code></td>
<td>#f2dede</td>
<td><span style="background-color: #f2dede;" class="swatch"></span></td>
</tr>
<tr>
<td><code>@successText</code></td>
<td>#468847</td>
<td><span style="background-color: #468847;" class="swatch"></span></td>
</tr>
<tr>
<td><code>@successBackground</code></td>
<td>#dff0d8</td>
<td><span style="background-color: #dff0d8;" class="swatch"></span></td>
</tr>
<tr>
<td><code>@infoText</code></td>
<td>#3a87ad</td>
<td><span style="background-color: #3a87ad;" class="swatch"></span></td>
</tr>
<tr>
<td><code>@infoBackground</code></td>
<td>#d9edf7</td>
<td><span style="background-color: #d9edf7;" class="swatch"></span></td>
</tr>
</tbody>
</table></div>
<div class="span6">
      <strong>导航栏</strong></p>
<table class="table table-bordered table-striped">
<tbody>
<tr>
<td class="span3"><code>@navbarHeight</code></td>
<td>40px</td>
<td class="swatch-col"></td>
</tr>
<tr>
<td><code>@navbarBackground</code></td>
<td><code>@grayDarker</code></td>
<td><span style="background-color: #222;" class="swatch"></span></td>
</tr>
<tr>
<td><code>@navbarBackgroundHighlight</code></td>
<td><code>@grayDark</code></td>
<td><span style="background-color: #333;" class="swatch"></span></td>
</tr>
<tr>
<td><code>@navbarText</code></td>
<td><code>@grayLight</code></td>
<td><span style="background-color: #999;" class="swatch"></span></td>
</tr>
<tr>
<td><code>@navbarLinkColor</code></td>
<td><code>@grayLight</code></td>
<td><span style="background-color: #999;" class="swatch"></span></td>
</tr>
<tr>
<td><code>@navbarLinkColorHover</code></td>
<td><code>@white</code></td>
<td><span style="background-color: #fff;" class="swatch swatch-bordered"></span></td>
</tr>
<tr>
<td><code>@navbarLinkColorActive</code></td>
<td><code>@navbarLinkColorHover</code></td>
<td><span style="background-color: #fff;" class="swatch swatch-bordered"></span></td>
</tr>
<tr>
<td><code>@navbarLinkBackgroundHover</code></td>
<td><code>transparent</code></td>
<td><span style="background-color: transparent;" class="swatch swatch-bordered"></span></td>
</tr>
<tr>
<td><code>@navbarLinkBackgroundActive</code></td>
<td><code>@navbarBackground</code></td>
<td><span style="background-color: #fff;" class="swatch swatch-bordered"></span></td>
</tr>
<tr>
<td><code>@navbarSearchBackground</code></td>
<td><code>lighten(@navbarBackground, 25%)</code></td>
<td><span style="background-color: #666;" class="swatch"></span></td>
</tr>
<tr>
<td><code>@navbarSearchBackgroundFocus</code></td>
<td><code>@white</code></td>
<td><span style="background-color: #fff;" class="swatch swatch-bordered"></span></td>
</tr>
<tr>
<td><code>@navbarSearchBorder</code></td>
<td><code>darken(@navbarSearchBackground, 30%)</code></td>
<td><span style="background-color: #111;" class="swatch"></span></td>
</tr>
<tr>
<td><code>@navbarSearchPlaceholderColor</code></td>
<td><code>#ccc</code></td>
<td><span style="background-color: #ccc;" class="swatch"></span></td>
</tr>
<tr>
<td><code>@navbarBrandColor</code></td>
<td><code>@navbarLinkColor</code></td>
<td><span style="background-color: #fff;" class="swatch swatch-bordered"></span></td>
</tr>
</tbody>
</table>
<p>      <strong>下拉Dropdowns</strong></p>
<table class="table table-bordered table-striped">
<tbody>
<tr>
<td class="span2"><code>@dropdownBackground</code></td>
<td><code>@white</code></td>
</tr>
<tr>
<td><code>@dropdownBorder</code></td>
<td><code>rgba(0,0,0,.2)</code></td>
</tr>
<tr>
<td><code>@dropdownLinkColor</code></td>
<td><code>@grayDark</code></td>
</tr>
<tr>
<td><code>@dropdownLinkColorHover</code></td>
<td><code>@white</code></td>
</tr>
<tr>
<td><code>@dropdownLinkBackgroundHover</code></td>
<td><code>@linkColor</code></td>
</tr>
</tbody>
</table>
<p>      <strong>Hero unit</strong></p>
<table class="table table-bordered table-striped">
<tbody>
<tr>
<td class="span3"><code>@heroUnitBackground</code></td>
<td><code>@grayLighter</code></td>
<td class="swatch-col"><span style="background-color: #eee;" class="swatch"></span></td>
</tr>
<tr>
<td class="span2"><code>@heroUnitHeadingColor</code></td>
<td><code>inherit</code></td>
<td></td>
</tr>
<tr>
<td><code>@heroUnitLeadColor</code></td>
<td><code>inhereit</code></td>
<td></td>
</tr>
</tbody>
</table></div>
<h2>Bootstrap混合</h2>
<h3>关于混合</h3>
<p><strong>基础的混合</strong><br />
混合就是将一段需要进行合并的样式通过less的一种申明方式写到一起，它可以方便的被其他样式调用，从而达到能够重用的目的。</p>
<pre class='brush: css; '>
    .element {
    .clearfix();
    }
</pre>
<p><strong>带参数的混合</strong><br />
这种混合和基础混合比较类似，它增加接受参数的功能，当然如果你不传任何参数，它会提供一个默认值</p>
<pre class='brush: css; '>
    .element {
    .border-radius(4px);
    }
</pre>
<p><strong>易于扩展</strong><br />
所有的混合都是存储在mixins.less中的，如果各位有什么需要增加的混合可以直接集成到utilities.less中，方便调用。</p>
<h3>bootstrap包含的混合</h3>
<p><strong>常用混合</strong></p>
<table class="table table-bordered table-striped">
<thead>
<tr>
<th class="span4">混合</th>
<th>参数</th>
<th>用途</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>.clearfix()</code></td>
<td><em class="muted">none</em></td>
<td>清除浮动</td>
</tr>
<tr>
<td><code>.tab-focus()</code></td>
<td><em class="muted">none</em></td>
<td>自动聚焦</td>
</tr>
<tr>
<td><code>.center-block()</code></td>
<td><em class="muted">none</em></td>
<td>居中，相当于<code>margin: auto</code></td>
</tr>
<tr>
<td><code>.ie7-inline-block()</code></td>
<td><em class="muted">none</em></td>
<td>让IE6,7支持<code>display: inline-block</code></td>
</tr>
<tr>
<td><code>.size()</code></td>
<td><code>@height @width</code></td>
<td>设置容器宽高</td>
</tr>
<tr>
<td><code>.square()</code></td>
<td><code>@size</code></td>
<td>设置该容器为正方形，参数为边长</td>
</tr>
<tr>
<td><code>.opacity()</code></td>
<td><code>@opacity</code></td>
<td>设置容器透明度</td>
</tr>
</tbody>
</table>
<p><strong>表单forms</strong></p>
<table class="table table-bordered table-striped">
<thead>
<tr>
<th class="span4">混合</th>
<th>参数</th>
<th>用途</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>.placeholder()</code></td>
<td><code>@color: @placeholderText</code></td>
<td>设置输入框的默认文案</td>
</tr>
</tbody>
</table>
<p><strong>字体</strong></p>
<table class="table table-bordered table-striped">
<thead>
<tr>
<th class="span4">混合</th>
<th>参数</th>
<th>用途</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>#font &gt; #family &gt; .serif()</code></td>
<td><em class="muted">none</em></td>
<td>设置这个元素的字体为有衬线字体</td>
</tr>
<tr>
<td><code>#font &gt; #family &gt; .sans-serif()</code></td>
<td><em class="muted">none</em></td>
<td>设置这个元素的字体为无衬线字体</td>
</tr>
<tr>
<td><code>#font &gt; #family &gt; .monospace()</code></td>
<td><em class="muted">none</em></td>
<td>设置这个元素的字体为等宽字体</td>
</tr>
<tr>
<td><code>#font &gt; .shorthand()</code></td>
<td><code>@size: @baseFontSize, @weight: normal, @lineHeight: @baseLineHeight</code></td>
<td>简单的设置字体的大小粗细等等</td>
</tr>
<tr>
<td><code>#font &gt; .serif()</code></td>
<td><code>@size: @baseFontSize, @weight: normal, @lineHeight: @baseLineHeight</code></td>
<td>设置该字体为有衬线字体，并设置字体的大小粗细等等</td>
</tr>
<tr>
<td><code>#font &gt; .sans-serif()</code></td>
<td><code>@size: @baseFontSize, @weight: normal, @lineHeight: @baseLineHeight</code></td>
<td>设置该字体为无衬线字体，并设置字体的大小粗细等等</td>
</tr>
<tr>
<td><code>#font &gt; .monospace()</code></td>
<td><code>@size: @baseFontSize, @weight: normal, @lineHeight: @baseLineHeight</code></td>
<td>设置该字体为等宽字体，并设置字体的大小粗细等等</td>
</tr>
</tbody>
</table>
<p><strong>栅格系统</strong><br />
相关的less代码在mixins.less中</p>
<table class="table table-bordered table-striped">
<thead>
<tr>
<th class="span4">混合</th>
<th>参数</th>
<th>用途</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>.container-fixed()</code></td>
<td><em class="muted">none</em></td>
<td>指定该容器为居中</td>
</tr>
<tr>
<td><code>#grid &gt; .core()</code></td>
<td><code>@gridColumnWidth, @gridGutterWidth</code></td>
<td>初始化栅格系统，参数传递分别为栅格的列宽和栅格之间的距离</td>
</tr>
<tr>
<td><code>#grid &gt; .fluid()</code></td>
<td><code>@fluidGridColumnWidth, @fluidGridGutterWidth</code></td>
<td>初始化栅格系统，参数传递分别为每个栅格的所占栅格总宽度的百分比和栅格之间的距离所占栅格总宽度的百分比</td>
</tr>
<tr>
<td><code>#grid &gt; .input()</code></td>
<td><code>@gridColumnWidth, @gridGutterWidth</code></td>
<td>生成<code>input</code>相关元素的栅格布局，参数传递分别为栅格的列宽和栅格之间的距离</td>
</tr>
<tr>
<td><code>.makeColumn</code></td>
<td><code>@columns: 1, @offset: 0</code></td>
<td>在栅格系统中初始化一个占几列的div容器，columns为该容器跨域的列数，offset为改容器的左偏移</td>
</tr>
</tbody>
</table>
<p><strong><br />
css3属性<br />
</strong></p>
<table class="table table-bordered table-striped">
<thead>
<tr>
<th class="span3">混合</th>
<th>参数</th>
<th>用途</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>.border-radius()</code></td>
<td><code>@radius</code></td>
<td>css3圆角，参数为圆角像素</td>
</tr>
<tr>
<td><code>.box-shadow()</code></td>
<td><code>@shadow</code></td>
<td>css3阴影</td>
</tr>
<tr>
<td><code>.transition()</code></td>
<td><code>@transition</code></td>
<td>css3动画，(如, <code>all .2s linear</code>)</td>
</tr>
<tr>
<td><code>.rotate()</code></td>
<td><code>@degrees</code></td>
<td>旋转一个元素，参数为旋转的度数</td>
</tr>
<tr>
<td><code>.scale()</code></td>
<td><code>@ratio</code></td>
<td>缩放元素，参数为缩放后和元尺寸的比列</td>
</tr>
<tr>
<td><code>.translate()</code></td>
<td><code>@x, @y</code></td>
<td>在平面上移动元素，参数对应分别为相对于x轴和y轴的移动距离</td>
</tr>
<tr>
<td><code>.background-clip()</code></td>
<td><code>@clip</code></td>
<td>背景裁剪，传入clip，clip选择border | padding | content</td>
</tr>
<tr>
<td><code>.background-size()</code></td>
<td><code>@size</code></td>
<td>通过css3来控制背景图片的尺寸</td>
</tr>
<tr>
<td><code>.box-sizing()</code></td>
<td><code>@boxmodel</code></td>
<td>改变容器的盒模型，例如我们可以改变类似input button的盒模型为传统的IE模型，即设置第一个参数为border-box就可以达到所有浏览器兼容的目的</td>
</tr>
<tr>
<td><code>.user-select()</code></td>
<td><code>@select</code></td>
<td>用来控制内容的可选择性</td>
</tr>
<tr>
<td><code>.backface-visibility()</code></td>
<td><code>@visibility: visible</code></td>
<td>css3D动画效果是否隐藏内容的背面，</td>
</tr>
<tr>
<td><code>.resizable()</code></td>
<td><code>@direction: both</code></td>
<td>让元素可以进行向右和向下的拉伸缩放</td>
</tr>
<tr>
<td><code>.content-columns()</code></td>
<td><code>@columnCount, @columnGap: @gridGutterWidth</code></td>
<td>让容器具有css3的属性content-count和column-gap，第一个参数为列数，第二个参数为列数之间的间距</td>
</tr>
</tbody>
</table>
<p><strong>背景和渐变</strong></p>
<table class="table table-bordered table-striped">
<thead>
<tr>
<th class="span4">混合</th>
<th>参数</th>
<th>用途</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>#translucent &gt; .background()</code></td>
<td><code>@color: @white, @alpha: 1</code></td>
<td>给元素半透明的背景色，第一个参数为背景色，第二个参数为透明度</td>
</tr>
<tr>
<td><code>#translucent &gt; .border()</code></td>
<td><code>@color: @white, @alpha: 1</code></td>
<td>给元素半透明的边框色，第一个参数为边框颜色，第二个参数为透明度</td>
</tr>
<tr>
<td><code>#gradient &gt; .vertical()</code></td>
<td><code>@startColor, @endColor</code></td>
<td>让一个容器从自上而下颜色渐变，兼容任何浏览器，第一个参数是开始的颜色，第二个参数是结束的颜色</td>
</tr>
<tr>
<td><code>#gradient &gt; .horizontal()</code></td>
<td><code>@startColor, @endColor</code></td>
<td>让一个容器从自左而右颜色渐变，兼容任何浏览器，第一个参数是开始的颜色，第二个参数是结束的颜色</td>
</tr>
<tr>
<td><code>#gradient &gt; .directional()</code></td>
<td><code>@startColor, @endColor, @deg</code></td>
<td>让一个容器按照一个角度进行渐变，第一个参数是开始的演示，第二个参数是结束的颜色，第三个参数是进行渐变的角度</td>
</tr>
<tr>
<td><code>#gradient &gt; .vertical-three-colors()</code></td>
<td><code>@startColor, @midColor, @colorStop, @endColor</code></td>
<td>让一个容器按照开始颜色和中间颜色以及结束颜色进行渐变，第一个参数是开始的颜色，第二个参数是中间的颜色，第三个参数是中间渐变结束的位置，最后一个参数是渐变结束的颜色</td>
</tr>
<tr>
<td><code>#gradient &gt; .radial()</code></td>
<td><code>@innerColor, @outerColor</code></td>
<td>让一个容器放射性渐变，第一个参数是容器中心的颜色，第二个参数是容器最外层的颜色</td>
</tr>
<tr>
<td><code>#gradient &gt; .striped()</code></td>
<td><code>@color, @angle</code></td>
<td>条纹渐变，第一个参数为渐变的颜色，第二个参数为渐变的角度</td>
</tr>
<tr>
<td><code>#gradientBar()</code></td>
<td><code>@primaryColor, @secondaryColor</code></td>
<td>主要用于按钮和提示框的垂直颜色渐变</td>
</tr>
</tbody>
</table>
<h2>关于less的编译</h2>
<p>如果你从githib上下载了源码并对bootstrap进行了修改，你必须针对bootstrap进行编译。关于less的编译我有话要说，现在针对less的编译已经有很多工具了，<a href="http://less.cnodejs.net/tools ">http://less.cnodejs.net/tools</a> 大家可以访问中文官网对这些工具逐一认识，个人推荐simpleless，非常方便。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.36ria.com/5272/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>关键点说明—KF/Uploader快速使用指南</title>
		<link>http://www.36ria.com/5370</link>
		<comments>http://www.36ria.com/5370#comments</comments>
		<pubDate>Thu, 10 May 2012 08:07:46 +0000</pubDate>
		<dc:creator>明河</dc:creator>
				<category><![CDATA[kissy]]></category>
		<category><![CDATA[KF/Uploader]]></category>

		<guid isPermaLink="false">http://www.36ria.com/?p=5370</guid>
		<description><![CDATA[组件生成html结构说明 未实例化组件前上传按钮的结构类似： 选择要上传的文件 组件实例化代码如下： KISSY.use('gallery/form/1.2/uploader/index', function (S, RenderUploader) { new RenderUploader('#J_UploaderBtn', '#J_UploaderQueue',{ serverConfig:{ action:"upload.php" }, name:"Filedata", urlsInputName:"fileUrls" }); }) 实例化后的结构： 如果是采用ajax上传（firefox/chrome） 选择要上传的文件 对应js配置：name:"Filedata"，必须存......]]></description>
			<content:encoded><![CDATA[<h2>组件生成html结构说明</h2>
<p>未实例化组件前上传按钮的结构类似：</p>
<pre class='brush: xml; '>
 <a id="J_UploaderBtn" class="uploader-button" href="#"> 选择要上传的文件 </a>
</pre>
<p>组件实例化代码如下：</p>
<pre class='brush: js; '>
    KISSY.use('gallery/form/1.2/uploader/index', function (S, RenderUploader) {
        new RenderUploader('#J_UploaderBtn', '#J_UploaderQueue',{
            serverConfig:{
                action:"upload.php"
            },
            name:"Filedata",
            urlsInputName:"fileUrls"
        });
    })
</pre>
<p>实例化后的结构：</p>
<h5>如果是采用ajax上传（firefox/chrome）</h5>
<pre class='brush: xml; '>
<a href="#" class="uploader-button defaultTheme-button" id="J_UploaderBtn">
    选择要上传的文件
<div style="overflow: hidden;" class="file-input-wrapper">
<input type="file" style="font-size: 400px; " class="file-input" hidefocus="true" name="fileInput">
    </div>
<input type="hidden" value="" name="fileUrls" id="fileUrls">
</a>
</pre>
<pre class='brush: xml; '>
<input type="file" style="font-size: 400px; " class="file-input" hidefocus="true" name="fileInput">
</pre>
<p>对应js配置：<code>name:"Filedata"</code>，必须存在的一个参数，在ajax上传中，组件会生成一个透明度为0，占满模拟按钮的文件域。<br />
服务器端通过这个参数来获取文件的信息，执行上传动作。</p>
<pre class='brush: xml; '>
<input type="hidden" value="" name="fileUrls" id="fileUrls">
</pre>
<p>为放服务器端返回的路径的隐藏域，比如用户成功上传一个文件后，服务器端返回url，组件会把此url放入这个隐藏域内，多个url以<code>,</code>号隔开。对应的js配置就是：<code>urlsInputName:"fileUrls"</code>。</p>
<h5>如果是采用flash上传（IE）</h5>
<pre class='brush: xml; '>
<a href="#"  id="J_UploaderBtn" style="position: relative;">
    选择要上传的文件
<div style="position: absolute; top: 0px; left: 0px; z-index: 2000;" class="uploader-button-swf" id="swf-uploader-wrapper-67">
        <embed width="110" height="24" flashvars="btn=true&#038;hand=true&#038;jsEntry=KISSY.AJBridge.eventHandler&#038;swfID=swfUploader"
               allowscriptaccess="always" wmode="transparent" bgcolor="#fff" type="application/x-shockwave-flash"
               id="swfUploader"
               src="http://a.tbcdn.cn/s/kissy/gallery/form/1.1/uploader/plugins/ajbridge/uploader.swf">
    </div>
<input type="hidden" value="" name="fileUrls" id="fileUrls">
</a>
</pre>
<p>flash上传生成的不是一个文件上传域，而是一个swf对象。关于此flash生成的信息，详情可以看<a href="http://docs.kissyui.com/kissy-ajbridge/docs/uploader/index.html" target="_blank">KISSY.AJBridge</a>。<br />
（PS:从结构中来看，并没有关键的Filedata的传递，这是因为组件是通过脚本获取这个字段，然后post过去。）</p>
<h2>服务器端返回数据说明</h2>
<p>上传成功后返回：</p>
<pre class='brush: js; '>
{"status":1,"data":{"name":"minghe.jpg","url":"www.36ria.com/minghe.jpg"}}
</pre>
<p>上传失败后返回：</p>
<pre class='brush: js; '>
{"status":0,"message":"图片过大！"}
</pre>
<p>留意必须使用上述的json格式，目前组件不支持自定义格式。<br />
<code>"status":1</code>，才是上传成功的标识，其他任何状态码都认定为失败。</p>
<p>当然有些场景服务器端除了返回文件名和路径外，还需要返回id或其他字段，这时候如何获取这些字段，并予以处理呢。<br />
加入服务器端返回：</p>
<pre class='brush: js; '>
{"status":1,"data":{"name":"minghe.jpg","url":"www.36ria.com/minghe.jpg","id":"minghe"}}
</pre>
<p>监听uploader的success事件，或在主题内的_successHandler获取服务器返回数据：<br />
<a href="http://www.36ria.com/5370/uploader-5" rel="attachment wp-att-5382"><img src="http://www.36ria.com/wp-content/uploads/2012/05/uploader-5.png" alt="" title="uploader-5" width="664" height="346" class="alignnone size-full wp-image-5382" /></a></p>
<h2>flash的跨域策略处理</h2>
<p>如果你在使用uploader中遇到IE下进度条不走的情况，多半的原因是由于在域名根目录下没有放跨域策略文件<strong>crossdomain.xml</strong>导致的。</p>
<p>以淘宝网的跨域策略为例</p>
<div class="hl-surround"><ol class="hl-main ln-show" title="Double click to hide line number." ondblclick = "linenumber(this)"><li class="hl-firstline"><span style="color: Olive;">&lt;?</span><span style="color: Green;">xml</span><span style="color: Gray;"> </span><span style="color: #00008b;">version</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">1.0</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">?&gt;</span></li>
<li><span style="color: Olive;">&lt;</span><span style="color: Green;">cross-domain-policy</span><span style="color: Olive;">&gt;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Olive;">&lt;</span><span style="color: Green;">allow-access-from</span><span style="color: Gray;">&nbsp;</span><span style="color: #00008b;">domain</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">*.taobao.com</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;"> </span><span style="color: Olive;">/&gt;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Olive;">&lt;</span><span style="color: Green;">allow-access-from</span><span style="color: Gray;">&nbsp;</span><span style="color: #00008b;">domain</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">*.taobao.net</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">/&gt;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Olive;">&lt;</span><span style="color: Green;">allow-access-from</span><span style="color: Gray;">&nbsp;</span><span style="color: #00008b;">domain</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">*.taobaocdn.com</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">/&gt;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Olive;">&lt;</span><span style="color: Green;">allow-access-from</span><span style="color: Gray;">&nbsp;</span><span style="color: #00008b;">domain</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">*.allyes.com</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">/&gt;</span></li>
<li><span style="color: Gray;">&nbsp;</span></li>
<li><span style="color: Olive;">&lt;/</span><span style="color: Green;">cross-domain-policy</span><span style="color: Olive;">&gt;</span></li></ol></div>
<p>当不存在crossdomain.xml文件时，控制台会打印错误消息，比如：<br />
<a href="http://www.36ria.com/5337/uploader-v1-2" rel="attachment wp-att-5351"><img src="http://www.36ria.com/wp-content/uploads/2012/05/uploader-v1.2.png" alt="" title="uploader-v1.2" width="306" height="73" class="alignnone size-full wp-image-5351" /></a><br />
上传成功后，会打印服务器返回的json数据。<br />
<a href="http://www.36ria.com/5337/uploader-v1-2-2" rel="attachment wp-att-5352"><img src="http://www.36ria.com/wp-content/uploads/2012/05/uploader-v1.2-2.png" alt="" title="uploader-v1.2-2" width="384" height="31" class="alignnone size-full wp-image-5352" /></a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.36ria.com/5370/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>KF/Uploader v1.2更新说明</title>
		<link>http://www.36ria.com/5337</link>
		<comments>http://www.36ria.com/5337#comments</comments>
		<pubDate>Wed, 09 May 2012 02:14:44 +0000</pubDate>
		<dc:creator>明河</dc:creator>
				<category><![CDATA[kissy]]></category>
		<category><![CDATA[KF/Uploader]]></category>

		<guid isPermaLink="false">http://www.36ria.com/?p=5337</guid>
		<description><![CDATA[KF/Uploader（异步文件上传组件）发布1个月以来收到不少使用者的反馈建议，暴露了一些bug，明河做了次集中优化，发布V1.2版。 （特别感谢下：承玉、紫英、林谦、祁幽、卢石、方元、文龙的反馈。） 使用V1.2的uploader KISSY.use('gallery/form/1.2/uploader/index', function (S, RenderUploader) { var ru = new RenderUploader('#J_UploaderBtn', '#J_UploaderQueue'); }) 修改下use的路径中的版本号即可。 V1.2重要更新说......]]></description>
			<content:encoded><![CDATA[<p>KF/Uploader（异步文件上传组件）发布1个月以来收到不少使用者的反馈建议，暴露了一些bug，明河做了次集中优化，发布V1.2版。</p>
<p>（特别感谢下：承玉、紫英、林谦、祁幽、卢石、方元、文龙的反馈。）</p>
<h2>使用V1.2的uploader</h2>
<pre class='brush: js;'>
    KISSY.use('gallery/form/1.2/uploader/index', function (S, RenderUploader) {
        var ru = new RenderUploader('#J_UploaderBtn', '#J_UploaderQueue');
    })
</pre>
<p>修改下use的路径中的版本号即可。</p>
<h2>V1.2重要更新说明</h2>
<h5>1.IE降级处理优先使用flash方式</h5>
<p>旧的上传配置，当<code>“type” : “auto”</code>，等价于["ajax","iframe"]，现在等价于<code>["ajax","flash","iframe"]</code>，也就是不支持ajax上传方式的浏览器将切换成flash上传，如果浏览器也不支持flash，将切换成iframe。<br />
<strong>不再推荐手动配置type参数</strong>，如果你希望兼容旧的处理方式（IE下使用iframe），请配置<code>“type” : ["ajax","iframe"]</code>。</p>
<p>flash上传，就必须在域名根目录下存在跨域策略文件<strong>crossdomain.xml</strong>。</p>
<p>以淘宝网的跨域策略为例</p>
<div class="hl-surround"><ol class="hl-main ln-show" title="Double click to hide line number." ondblclick = "linenumber(this)"><li class="hl-firstline"><span style="color: Olive;">&lt;?</span><span style="color: Green;">xml</span><span style="color: Gray;"> </span><span style="color: #00008b;">version</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">1.0</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">?&gt;</span></li>
<li><span style="color: Olive;">&lt;</span><span style="color: Green;">cross-domain-policy</span><span style="color: Olive;">&gt;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Olive;">&lt;</span><span style="color: Green;">allow-access-from</span><span style="color: Gray;">&nbsp;</span><span style="color: #00008b;">domain</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">*.taobao.com</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;"> </span><span style="color: Olive;">/&gt;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Olive;">&lt;</span><span style="color: Green;">allow-access-from</span><span style="color: Gray;">&nbsp;</span><span style="color: #00008b;">domain</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">*.taobao.net</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">/&gt;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Olive;">&lt;</span><span style="color: Green;">allow-access-from</span><span style="color: Gray;">&nbsp;</span><span style="color: #00008b;">domain</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">*.taobaocdn.com</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">/&gt;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Olive;">&lt;</span><span style="color: Green;">allow-access-from</span><span style="color: Gray;">&nbsp;</span><span style="color: #00008b;">domain</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">*.allyes.com</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">/&gt;</span></li>
<li><span style="color: Gray;">&nbsp;</span></li>
<li><span style="color: Olive;">&lt;/</span><span style="color: Green;">cross-domain-policy</span><span style="color: Olive;">&gt;</span></li></ol></div>
<p>当不存在crossdomain.xml文件时，控制台会打印错误消息，比如：<br />
<a href="http://www.36ria.com/5337/uploader-v1-2" rel="attachment wp-att-5351"><img src="http://www.36ria.com/wp-content/uploads/2012/05/uploader-v1.2.png" alt="" title="uploader-v1.2" width="306" height="73" class="alignnone size-full wp-image-5351" /></a><br />
上传成功后，会打印服务器返回的json数据。<br />
<a href="http://www.36ria.com/5337/uploader-v1-2-2" rel="attachment wp-att-5352"><img src="http://www.36ria.com/wp-content/uploads/2012/05/uploader-v1.2-2.png" alt="" title="uploader-v1.2-2" width="384" height="31" class="alignnone size-full wp-image-5352" /></a></p>
<h5>2.uploader增加multiple和disabled二个属性</h5>
<p>v1.2前设置按钮的多选和禁用，需要先获取button的实例，比较繁琐。<br />
v1.2后uploader增加<code>multiple</code>和<code>disabled</code>配置，如下代码：</p>
<pre class='brush: js;'>
        ru.on("init", function (ev) {
            var uploader = ev.uploader;
            uploader.set('disabled',true);
            uploader.set('multiple',false);
        })
</pre>
<p>（ru为RenderUploader的实例）<br />
<strong>不再推荐对button的实例进行操作。</strong></p>
<h5>3.可以通过js传配置theme（主题）和auth（验证）</h5>
<p>详细请看<a href="http://www.36ria.com/demo/gal/gallery/form/1.2/demo/form/uploader/extra-config.html" target="_blank">使用js配置参数的示例</a>。<br />
v1.2以前设置主题和验证配置，必须采用伪属性的方式（<code>data-theme-config</code>和<code>data-auth</code>），这是明河的设计失误。<br />
v1.2后不再推荐使用伪属性配置的方式，请使用js方式传参，比如：</p>
<pre class='brush: js;'>
        var ru = new RenderUploader('#J_UploaderBtn', '#J_UploaderQueue',{
           //主题配置
            themeConfig:{
                cssUrl:'gallery/form/1.2/uploader/themes/default/style.css'
            },
            //验证配置
            authConfig: {
                allowExts:[
                    {desc:"JPG,JPEG,PNG,GIF,BMP", ext:"*.jpg;*.jpeg;*.png;*.gif;*.bmp"},
                    '不支持{ext}格式的文件上传！'
                ],
                max:[3, '每次最多上传{max}个文件！']
            }
        });
</pre>
<p>配置<code>themeConfig</code>和<code>authConfig</code>参数即可。</p>
<h5>4.小更新</h5>
<ul>
<li>图片预览在多选下存在bug，先予以禁用（预计在下一个版本解决）</li>
<li>Filedrop增加isSupport属性</li>
</ul>
<h5>5.重要的bugfix</h5>
<ul>
<li>修正取消操作无用的bug，感谢<strong>文龙</strong>反馈这个问题</li>
<li>修正IE6/IE7会报缺少）的错误的bug，这个bug主要是由于google的压缩器引起的</li>
<li>修正IE6下可点击区域过小无法调整的bug，感谢<strong>方元</strong>和我一起探讨解决方案</li>
<li>修正进度条消失过快bug，感谢<strong>祁幽</strong>反馈该问题</li>
<li>修正type设置有flash，却不实例化flash按钮的bug，感谢<strong>承玉</strong>反馈该问题</li>
</ul>
<p>相关bug有兴趣的朋友可以看<a href="https://github.com/kissyteam/kissy-gallery/issues?direction=desc&#038;sort=created&#038;state=open" target="_blank">https://github.com/kissyteam/kissy-gallery/issues?direction=desc&#038;sort=created&#038;state=open</a> 里面有bugfix的追溯。</p>
<p>KF/Uploader还在不断完善中，欢迎使用者反馈建议或提交bug，可以提交到kissy-gallery的issues列表上。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.36ria.com/5337/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>全局样式和grid布局—Bootstrap中文使用指南（2）</title>
		<link>http://www.36ria.com/5230</link>
		<comments>http://www.36ria.com/5230#comments</comments>
		<pubDate>Fri, 04 May 2012 12:56:39 +0000</pubDate>
		<dc:creator>明河</dc:creator>
				<category><![CDATA[javascript]]></category>
		<category><![CDATA[Bootstrap]]></category>

		<guid isPermaLink="false">http://www.36ria.com/?p=5230</guid>
		<description><![CDATA[点此查看demo （文档中的所有demo都在这个页面内） 全局样式 1.要求html5文档类型 Bootstrap使用的css属性和html元素依赖于html5的文档类型声明，请确保每个Bootstrap的页面包含下面的代码： &#60;!DOCTYPE html&#62; &#60;html&#62; &#160; ... &#60;/html&#62; 2.排版和链接样式 全局的排版和链接样式放在scaffolding.less文件内（关于less教程后面会有详细说明）。默认做了如下处理： 移除body的外边距 设置......]]></description>
			<content:encoded><![CDATA[<p><a style="float:none;" href="http://www.36ria.com/demo/javascript/bootstrap/index.html" class="btn-view-demo" target="_blank">点此查看demo</a><br />
（文档中的所有demo都在这个页面内）</p>
<h4>全局样式</h4>
<h5>1.要求html5文档类型</h5>
<p>Bootstrap使用的css属性和html元素依赖于html5的文档类型声明，请确保每个Bootstrap的页面包含下面的代码：</p>
<div class="hl-surround"><ol class="hl-main ln-show" title="Double click to hide line number." ondblclick = "linenumber(this)"><li class="hl-firstline"><span style="color: Olive;">&lt;</span><span style="color: Gray;">!</span><span style="color: #00008b;">DOCTYPE</span><span style="color: Gray;"> </span><span style="color: #00008b;">html</span><span style="color: Olive;">&gt;</span></li>
<li><span style="color: Olive;">&lt;</span><span style="color: Green;">html</span><span style="color: Olive;">&gt;</span></li>
<li><span style="color: Gray;">&nbsp; ...</span></li>
<li><span style="color: Olive;">&lt;/</span><span style="color: Green;">html</span><span style="color: Olive;">&gt;</span></li></ol></div>
<h5>2.排版和链接样式</h5>
<p>全局的排版和链接样式放在<strong>scaffolding.less</strong>文件内（关于less教程后面会有详细说明）。默认做了如下处理：</p>
<ul>
<li>移除body的外边距</li>
<li>设置body的背景颜色为白色<code>background-color: white;</code></li>
<li>使用<code>@baseFone</code>，<code>@baseFontSize</code>，<code>@baseLineHeight</code>属性作为排版基础</li>
<li>使用<code>@linkColor</code>设置了全局链接颜色和<code>:hover</code>伪属性的下划线</li>
</ul>
<h5>3.默认样式重置</h5>
<p>从 Bootstrap 2开始，CSS重置样式基于<a href="http://necolas.github.com/normalize.css/" target="_blank">Normalize.css</a>，新的重置样式，可以在<strong>reset.less</strong>中找到（Bootstrap做了许多的简化）。</p>
<h4>默认栅格布局系统</h4>
<p>Bootstrap的默认布局系统由总宽度为940px的12列组成。<br />
它能够适应各个分辨率的显示设备，比如手机、平板、超高分辨率屏幕等。<br />
（ps：请看demo）</p>
<pre class='brush: xml;'>
<div class="row">
<div class="span4">...</div>
<div class="span8">...</div>
</div>
</pre>
<p>上面的代码将创建二列栅格，span4容器占总宽度的4/12即（1/3）。</p>
<h5>1.如何处理列的偏移</h5>
<p>比如我们希望有个栅格是右靠齐。</p>
<pre class='brush: xml;'>
<div class="row">
<div class="span4">...</div>
<div class="span4 offset4">...</div>
</div>
</pre>
<p>第二个span4容器，增加个offset4样式名，表示跟前一个容器相隔4个列距离。</p>
<h5>2.处理列的嵌套</h5>
<p>（ps：请看demo）<br />
在Bootstrap中使用静态（非浮动）的布局处理栅格的嵌套是非常简单的事。</p>
<pre class='brush: xml;'>
<div class="row">
<div class="span12">
    Level 1 of column
<div class="row">
<div class="span6">Level 2</div>
<div class="span6">Level 2</div>
</div>
</div>
</div>
</pre>
<p>.row的容器内部是一个占满12列的层(.span12)，下面嵌套个新的.row容器，内部是span6二列布局。</p>
<h4>浮动布局系统</h4>
<p>浮动布局系统，就是我们经常使用的<strong>float:left;</strong>布局方式，比较特殊的是bootstrap使用百分比来定义栅格的宽度。</p>
<h5>1.浮动栅格的行容器</h5>
<p>（ps：请看demo）</p>
<pre class='brush: xml;'>
<div class="row-fluid">
<div class="span4">...</div>
<div class="span8">...</div>
</div>
</pre>
<p>流动布局，行容器使用<strong>. row-fluid </strong>样式名，其他地方不变。</p>
<pre class='brush: css;'>
.row-fluid {
    width: 100%;
}
.row-fluid:before, .row-fluid:after {
    content: "";
    display: table;
}
.row-fluid:after {
    clear: both;
}
</pre>
<h5>2.宽度使用百分比，而不是像素值</h5>
<p>浮动布局系统比静态布局系统，拥有更强的适应性，同样适应不同分辨率的屏幕。</p>
<pre class='brush: css;'>
.row-fluid > [class*="span"] {
    float: left;
    margin-left: 2.5641%;
}
.row-fluid > [class*="span"]:first-child {
    margin-left: 0;
}
</pre>
<h5>3.浮动布局中处理容器的嵌套</h5>
<p>（ps：请看demo）<br />
浮动布局中的嵌套处理有点不大一样:嵌套的栅格不需要匹配父容器的栅格数，每一行的宽度都占用父容器的100%宽度。</p>
<pre class='brush: xml;'>
<div class="row-fluid">
<div class="span12">
  Level 1 of column
<div class="row-fluid">
<div class="span6">Level 2</div>
<div class="span6">Level 2</div>
</div>
</div>
</div>
</pre>
<h4>定制栅格</h4>
<table border="0" cellspacing="0" cellpadding="0" class="tab1">
<colgroup>
<col width="160">
<col width="160">
<col>
</colgroup>
<thead>
<tr>
<td valign="top">
<p><strong>变量</strong></p>
</td>
<td valign="top">
<p><strong>默认值</strong></p>
</td>
<td valign="top">
<p><strong>描述</strong></p>
</td>
</tr>
</thead>
<tbody>
<tr>
<td valign="top">
<p><strong>@gridColumns</strong></p>
</td>
<td valign="top">12</td>
<td valign="top">列的数量</td>
</tr>
<tr>
<td valign="top">
<p><strong>@gridColumnWidth</strong></p>
</td>
<td valign="top">60px</td>
<td valign="top">列的宽度</td>
</tr>
<tr>
<td valign="top">
<p><strong>@gridGutterWidth</strong></p>
</td>
<td valign="top">20px</td>
<td valign="top">列的间隔</td>
</tr>
</tbody>
</table>
<h5>LESS中的变量</h5>
<p>Bootstrap中定制一套自己的940px栅格系统，只需要很少的less变量。这些变量可以在<strong>variables.less</strong>中找到。</p>
<h5>如何定制</h5>
<p>你需要修改@grid*三个变量（指的是上面表格中的三个变量），并重新编译Bootstrap（less重新编译出新的css文件）。关于less的编译可以看 <a href="http://twitter.github.com/bootstrap/less.html#compiling" target="_blank">four ways documented to recompile</a>，如果新增了列，务必在<strong>grid.less</strong>增加上对应的样式。</p>
<h5>保留适应性</h5>
<p>自适应的栅格系统只能用于默认的940px栅格。为了维持Bootstrap的自适应性，需要额外在<strong> responsive.less</strong>中自定义栅格样式。</p>
<h4>布局</h4>
<h5>静态布局</h5>
<pre class='brush: xml;'>
<div class="container">
    ...
  </div>
</pre>
<h5>浮动布局</h5>
<p>使用container-fluid样式名，产生浮动页面结构，下面的demo中演示了生成常用的2列布局。</p>
<pre class='brush: xml;'>
<div class="container-fluid">
<div class="row-fluid">
<div class="span2">
      <!--Sidebar content-->
    </div>
<div class="span10">
      <!--Body content-->
    </div>
</div>
</div>
</pre>
<p>效果如下图：<br />
<a href="http://www.36ria.com/5230/fluid-layout" rel="attachment wp-att-5319"><img src="http://www.36ria.com/wp-content/uploads/2012/05/fluid-layout.png" alt="" title="fluid-layout" width="560" height="253" class="alignnone size-full wp-image-5319" /></a></p>
<h4>自适应设计</h4>
<p><img alt="" src="http://twitter.github.com/bootstrap/assets/img/responsive-illustrations.png" class="alignnone" width="300" height="145" /></p>
<h5>如何让栅格布局系统适应不同分辨率的屏幕？</h5>
<p>需要用到css3的<strong>media queries</strong>，严重推荐阅读<a href="http://www.zhangxinxu.com/css3/css3-media-queries.php" target="_blank">《CSS3 media queries使用参考指南》</a>和<a href="http://www.swordair.com/blog/2010/08/431/" target="_blank">《CSS3 Media Queries 详解》</a>。Media Queries的引用，让你可以针对不同的设备定制不一样的css样式，可以很方便的让布局系统适应不同的媒体设备。<br />
原文讲得比较晦涩，明河借用《CSS3 Media Queries 详解》举个简单例子：</p>
<pre class='brush: xml;'>
<link rel="stylesheet" type="text/css" href="swordair.css" media="screen and (min-width: 400px)">
</pre>
<p>样式表引用增加media属性。</p>
<ul>
<li>screen： 媒体类型里的一种，<a href="http://www.w3.org/TR/CSS2/media.html#media-types" target="_blank">10种媒体类型</a></li>
<li>and 被称为关键字，其他关键字还包括 not(排除某种设备)，only(限定某种设备)</li>
<li>(min-width: 400px) 就是媒体特性，其被放置在一对圆括号中。完整的特性参看 <a href="http://www.w3.org/TR/css3-mediaqueries/#media1" target="_blank">相关的Media features部分</a></li>
</ul>
<p><strong>screen and (min-width: 400px)</strong>的意思是当屏幕的宽度大于等于400px的时候，应用此条CSS，也就是说media非常像<strong>条件语句</strong>。</p>
<h5>bootstrap支持的设备</h5>
<table border="0" cellspacing="0" cellpadding="0" class="tab1">
<colgroup>
<col width="160">
<col width="160">
<col width="160">
<col>
</colgroup>
<thead>
<tr>
<td valign="top">
<p><strong>Label</strong></p>
</td>
<td valign="top">
<p><strong>Layout width</strong></p>
</td>
<td valign="top">
<p><strong>Column width</strong></p>
</td>
<td valign="top">
<p><strong>Gutter width</strong></p>
</td>
</tr>
</thead>
<tbody>
<tr>
<td valign="top">智能手机</td>
<td valign="top">等于小于480px</td>
<td valign="top">无固定宽度</td>
<td valign="top">无固定宽度</td>
</tr>
<tr>
<td valign="top">介于智能手机和平板电脑之间</td>
<td valign="top">等于小于767px</td>
<td valign="top">无固定宽度</td>
<td valign="top">无固定宽度</td>
</tr>
<tr>
<td valign="top">平板电脑</td>
<td valign="top">等于大于768px</td>
<td valign="top">42px</td>
<td valign="top">20px</td>
</tr>
<tr>
<td valign="top">默认</td>
<td valign="top">等于大于980px</td>
<td valign="top">60px</td>
<td valign="top">20px</td>
</tr>
<tr>
<td valign="top">超分辨率</td>
<td valign="top">等于大于1200px</td>
<td valign="top">70px</td>
<td valign="top">30px</td>
</tr>
</tbody>
</table>
<h5>需要meta标签</h5>
<pre class='brush: xml;'>
 <meta name="viewport" content="width=device-width, initial-scale=1.0">
</pre>
<h5>使用media queries</h5>
<p>Bootstrap默认不包含这些media queries的样式，你可以通过下列的方式引入：</p>
<ul>
<li>页面引入<strong>bootstrap-responsive.css</strong></li>
<li>重编译bootstrap时，增加<strong>@import “responsive.less”</strong></li>
<li>修改和单独编译responsive.less为一个独立的文件</li>
</ul>
<p>Bootstrap 的media queries代码</p>
<pre class='brush: css;'>
 // Landscape phones and down
  @media (max-width: 480px) { ... }

  // Landscape phone to portrait tablet
  @media (max-width: 767px) { ... }

  // Portrait tablet to landscape and desktop
  @media (min-width: 768px) and (max-width: 979px) { ... }

  // Large desktop
  @media (min-width: 1200px) { ... }
</pre>
]]></content:encoded>
			<wfw:commentRss>http://www.36ria.com/5230/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Bootstrap—快速开发Web应用的前端工具包（1）</title>
		<link>http://www.36ria.com/5323</link>
		<comments>http://www.36ria.com/5323#comments</comments>
		<pubDate>Fri, 04 May 2012 09:44:50 +0000</pubDate>
		<dc:creator>天河</dc:creator>
				<category><![CDATA[javascript]]></category>

		<guid isPermaLink="false">http://www.36ria.com/?p=5323</guid>
		<description><![CDATA[Bootstrap是一个快速开发Web应用的前端工具包，它为开发者提供了下面三种工具。 基础：样式重置，栅格系统，响应式设计支持等 零件：按钮，导航，面包屑，分页，进度条，各种常用icon等 组件：对话框，下列菜单，tabs，浮出提示，轮播等 有了这样一套风格统一的基础工具、小零件、成品组件，快速搭建美观易用的Web应用会让你轻松不少。 点此查看demo 点此下载 Bootstrap开源......]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.36ria.com/5323/bootstrap" rel="attachment wp-att-5327"><img src="http://www.36ria.com/wp-content/uploads/2012/05/bootstrap.png" alt="" title="bootstrap" width="680" height="200" class="alignnone size-full wp-image-5327" /></a><br />
<strong>Bootstrap</strong>是一个快速开发Web应用的前端工具包，它为开发者提供了下面三种工具。</p>
<ul>
<li>基础：样式重置，栅格系统，响应式设计支持等</li>
<li>零件：按钮，导航，面包屑，分页，进度条，各种常用icon等</li>
<li>组件：对话框，下列菜单，tabs，浮出提示，轮播等</li>
</ul>
<p>有了这样一套风格统一的基础工具、小零件、成品组件，快速搭建美观易用的Web应用会让你轻松不少。</p>
<ul class="tow-columns clearfix">
<li class="l"><a href="http://twitter.github.com/bootstrap/" class="btn-view-demo" target="_blank">点此查看demo</a></li>
<li class="l"><a class="btn-download"  href="http://twitter.github.com/bootstrap/assets/bootstrap.zip">点此下载</a></li>
</ul>
<p>Bootstrap开源不久，很快就成为GitHub上最热门的项目之一。许多开发者们也把它应用在了自己维护的站点上。事实上，在Bootstrap推出前，前端工具包已经有很多了，也不乏非常流行的如 jQuery + jQuery UI, YUI 等。为什么Bootstrap依然能脱颖而出呢？我们先大致看下它是怎么设计的吧。</p>
<p>Bootstrap现在已经发布了2.0版本，架构更加清晰。其核心部分是在less.css的基础上构建的，入口文件有2个：<strong>bootstrap.less</strong> 和<strong> responsive.less </strong>。后者是Bootstrap实现响应式设计的配置文件；前者是它的主入口文件，依序包含了下面几部分：</p>
<ul>
<li>CSS Reset</li>
<li>Core variables and mixins</li>
<li>Grid system and page structure</li>
<li>Base CSS</li>
<li>Components</li>
<li>Utilities</li>
</ul>
<p>这里第1，第3部分是许多其他前端工具包都有的部分，Bootstrap也提供了自己的版本。</p>
<p>第2部分是less.css扩展的变量、混入功能的应用。它为Bootstrap提供了最大的灵活性，给二次开发带来了许多便利。这是许多其他前端工具包所没有的优势。</p>
<p>第4，第5部分是Twitter贡献的各种零部件风格。其中4是各种基础元素——字型、表单、表格等。而第5部分是各种自定义零部件，其中有十分全面的图标，有各种按钮，以及各种复杂的组件风格等。</p>
<p>Bootstrap发布的是less编译后的文件，bootstrap.css 与 bootstrap-responsive.css。另外，Bootstrap还提供了一些自己风格的jQuery插件。</p>
<p>用户使用时，只要依葫芦画瓢，按Bootstrap提供的demo，写上同样的class，美观、统一的页面就生成了。得益于Bootstrap零部件的全面，只关心html，无需在htlml/css/js间切换，给页面开发带来一气呵成的快感。如果你要自定义风格，修改几个less变量即可实现，极大地解放了生产力。</p>
<p>当然，Bootstrap还有许多其他优点，比如文档丰富、跨平台、社区发展势头好等，这些都可以让开发者放心大胆地选择Bootstrap。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.36ria.com/5323/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>google的html/css规范指南</title>
		<link>http://www.36ria.com/5249</link>
		<comments>http://www.36ria.com/5249#comments</comments>
		<pubDate>Wed, 25 Apr 2012 08:13:14 +0000</pubDate>
		<dc:creator>明河</dc:creator>
				<category><![CDATA[html5]]></category>
		<category><![CDATA[css规范]]></category>
		<category><![CDATA[google]]></category>

		<guid isPermaLink="false">http://www.36ria.com/?p=5249</guid>
		<description><![CDATA[google之前出了javascript规范指南，中文翻译传送门在此，现在有了html/css规范指南，明河开始翻译时版本是2.1。后续如果google有新的内容补充，明河也会跟进。 常规样式规则 协议 引入的assets资源文件（js、css、图片文件）忽略协议（http:, https:），比如： 不推荐的写法： 推荐的写法： 不推荐的写法： .example { background: url(http://www.google.com/images/example); } 推荐的写法： .example { back......]]></description>
			<content:encoded><![CDATA[<p>google之前出了javascript规范指南，中文翻译<a href="http://docs.kissyui.com/docs/html/styleguide/google-js-style.html" target="_blank">传送门在此</a>，现在有了html/css规范指南，明河开始翻译时版本是2.1。后续如果google有新的内容补充，明河也会跟进。</p>
<h4>常规样式规则</h4>
<h5>协议</h5>
<p>引入的assets资源文件（js、css、图片文件）<strong>忽略协议</strong>（<strong>http:, https:</strong>），比如：<br />
不推荐的写法：</p>
<pre class='brush: xml;'>
<script src="http://www.google.com/js/gweb/analytics/autotrack.js"></script>
</pre>
<p>推荐的写法：</p>
<pre class='brush: xml;'>
<script src="//www.google.com/js/gweb/analytics/autotrack.js"></script>
</pre>
<p>不推荐的写法：</p>
<pre class='brush: css;'>
.example {
  background: url(http://www.google.com/images/example);
}
</pre>
<p>推荐的写法：</p>
<pre class='brush: css;'>
.example {
  background: url(//www.google.com/images/example);
}
</pre>
<p>关于google的这点建议，明河倒是觉得有待商榷，有兴趣的朋友看<a href="http://stackoverflow.com/questions/4831741/can-i-change-all-my-http-links-to-just" target="_blank">http://stackoverflow.com/questions/4831741/can-i-change-all-my-http-links-to-just</a>，里面有详细的讨论，根据一位网友的测试，相对url在IE7、IE8下存在二次加载的问题。</p>
<h4>常规格式规则</h4>
<h5> 缩进</h5>
<p>使用二个空格缩进（PS：明河一般使用四个空格缩进-_-!）</p>
<div class="hl-surround"><ol class="hl-main ln-show" title="Double click to hide line number." ondblclick = "linenumber(this)"><li class="hl-firstline"><span style="color: Olive;">&lt;</span><span style="color: Green;">ul</span><span style="color: Olive;">&gt;</span></li>
<li><span style="color: Gray;">&nbsp; </span><span style="color: Olive;">&lt;</span><span style="color: Green;">li</span><span style="color: Olive;">&gt;</span><span style="color: Gray;">Fantastic</span><span style="color: Olive;">&lt;/</span><span style="color: Green;">li</span><span style="color: Olive;">&gt;</span></li>
<li><span style="color: Gray;">&nbsp; </span><span style="color: Olive;">&lt;</span><span style="color: Green;">li</span><span style="color: Olive;">&gt;</span><span style="color: Gray;">Great</span><span style="color: Olive;">&lt;/</span><span style="color: Green;">li</span><span style="color: Olive;">&gt;</span></li>
<li><span style="color: Olive;">&lt;/</span><span style="color: Green;">ul</span><span style="color: Olive;">&gt;</span></li></ol></div>
<pre class='brush: css;'>
.example {
  color: blue;
}
</pre>
<h5>大写</h5>
<p>只使用小写。<br />
所有的代码只使用小写字母（PS:淘宝的做法是如果跟js的DOM操作相关，作为钩子使用J_Trigger类似的方式）：包括元素名称、样式名、属性名（除了text/CDATA）。<br />
不推荐的写法：</p>
<div class="hl-surround"><ol class="hl-main ln-show" title="Double click to hide line number." ondblclick = "linenumber(this)"><li class="hl-firstline"><span style="color: Olive;">&lt;</span><span style="color: Green;">A</span><span style="color: Gray;"> </span><span style="color: #00008b;">HREF</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">/</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">&gt;</span><span style="color: Gray;">Home</span><span style="color: Olive;">&lt;/</span><span style="color: Green;">A</span><span style="color: Olive;">&gt;</span></li></ol></div>
<p>推荐的写法：</p>
<pre class='brush: xml;'>
<img src="google.png" alt="Google">
</pre>
<h5>尾部空白</h5>
<p>删掉冗余的行尾空格。<br />
不推荐的写法：</p>
<pre class='brush: xml;'>

What?_
</pre>
<p>推荐的写法：</p>
<pre class='brush: xml;'>

Yes please.
</pre>
<h4>常规Meta规则</h4>
<h5>编码</h5>
<p>使用<strong>utf-8</strong>编码。<br />
指定页面的文档编码为utf-8</p>
<pre class='brush: xml;'>
<meta charset="utf-8">
</pre>
<p>不需要特别指定样式引用的编码为utf-8。<br />
（ps：关于html编码指定方面的内容，可以看<a href="http://www.w3.org/International/tutorials/tutorial-char-enc/en/all.html" target="_blank">《 Character Sets &#038; Encodings in XHTML, HTML and CSS》</a>）</p>
<h5>注释</h5>
<p>如果可能，注释还是必不可少的。<br />
使用注释说明下代码：它包括了什么，它的目的是什么，为什么优先使用它。</p>
<h5>行动项目</h5>
<p>（ps：推荐使用）<br />
google建议养成写TODO的习惯，特别是在项目中，记录下一些要改，但来不及修改的地方，或指派其他同事做修改。<br />
高亮TODO，不同的编辑器有不一样的方式，比如idea是TODO:。</p>
<pre class='brush:xml;'>
{# TODO(john.doe): revisit centering #}
<center>Test</center>
</pre>
<pre class='brush: xml;'>
<!-- TODO: remove optional tags -->
<ul>
<li>Apples</li>
<li>Oranges</li>
</ul>
</pre>
<h4>常规html设计规则</h4>
<h5>文档类型</h5>
<p>使用html5文档声明：</p>
<div class="hl-surround"><ol class="hl-main ln-show" title="Double click to hide line number." ondblclick = "linenumber(this)"><li class="hl-firstline"><span style="color: Olive;">&lt;</span><span style="color: Gray;">!</span><span style="color: #00008b;">DOCTYPE</span><span style="color: Gray;"> </span><span style="color: #00008b;">html</span><span style="color: Olive;">&gt;</span></li></ol></div>
<p>不再使用XHTML（ application/xhtml+xml）。</p>
<h5> HTML 的正确性</h5>
<p>可以使用一些工具，检验你html的正确性，比如<a href="http://validator.w3.org/" target="_blank"> W3C HTML validator</a>。<br />
不推荐的写法：</p>
<pre class='brush:xml;'>
<article>This is only a test.
</pre>
<p>推荐的写法：</p>
<div class="hl-surround"><ol class="hl-main ln-show" title="Double click to hide line number." ondblclick = "linenumber(this)"><li class="hl-firstline"><span style="color: Olive;">&lt;</span><span style="color: Gray;">!</span><span style="color: #00008b;">DOCTYPE</span><span style="color: Gray;"> </span><span style="color: #00008b;">html</span><span style="color: Olive;">&gt;</span></li>
<li><span style="color: Olive;">&lt;</span><span style="color: Green;">meta</span><span style="color: Gray;">&nbsp;</span><span style="color: #00008b;">charset</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">utf-8</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">&gt;</span></li>
<li><span style="color: Olive;">&lt;</span><span style="color: Green;">title</span><span style="color: Olive;">&gt;</span><span style="color: Gray;">Test</span><span style="color: Olive;">&lt;/</span><span style="color: Green;">title</span><span style="color: Olive;">&gt;</span></li>
<li><span style="color: Olive;">&lt;</span><span style="color: Green;">article</span><span style="color: Olive;">&gt;</span><span style="color: Gray;">This is only a test.</span><span style="color: Olive;">&lt;/</span><span style="color: Green;">article</span><span style="color: Olive;">&gt;</span></li></ol></div>
<h5> HTML 的语义性</h5>
<p>使用富含语义性的标签（ps:建议掌握html5新增的部分语义标签）。<br />
google特别指出了要确保html的可用性，看下面的代码<br />
不推荐的写法：</p>
<pre class='brush:xml;'>
<div onclick="goToRecommendations();">All recommendations</div>
</pre>
<p>推荐的写法：</p>
<pre class='brush:xml;'>
<a href="recommendations/">All recommendations</a>
</pre>
<h5>多媒体元素降级处理</h5>
<p>给多媒体元素，比如canvas、videos、 images增加alt属性，提高可用性（特别是常用的img标签，尽可量得加上alt属性，提供图片的描述信息）。<br />
不推荐的写法：</p>
<pre class='brush:xml;'>
<img src="spreadsheet.png">
</pre>
<p>推荐的写法：</p>
<pre class='brush:xml;'>
<img src="spreadsheet.png" alt="Spreadsheet screenshot.">
</pre>
<h5>html、css、javascript三层分离</h5>
<p>尽可能保持结构（html结构标签）、描述（css）、行为（javascript）的分离，并且让他们尽可能少的交互。确保html文档内容只有html的结构，将css和javascript以资源的方式引入。<br />
不推荐的写法：</p>
<div class="hl-surround"><ol class="hl-main ln-show" title="Double click to hide line number." ondblclick = "linenumber(this)"><li class="hl-firstline"><span style="color: Olive;">&lt;</span><span style="color: Gray;">!</span><span style="color: #00008b;">DOCTYPE</span><span style="color: Gray;"> </span><span style="color: #00008b;">html</span><span style="color: Olive;">&gt;</span></li>
<li><span style="color: Olive;">&lt;</span><span style="color: Green;">title</span><span style="color: Olive;">&gt;</span><span style="color: Gray;">HTML sucks</span><span style="color: Olive;">&lt;/</span><span style="color: Green;">title</span><span style="color: Olive;">&gt;</span></li>
<li><span style="color: Olive;">&lt;</span><span style="color: Green;">link</span><span style="color: Gray;">&nbsp;</span><span style="color: #00008b;">rel</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">stylesheet</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;"> </span><span style="color: #00008b;">href</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">base.css</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;"> </span><span style="color: #00008b;">media</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">screen</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">&gt;</span></li>
<li><span style="color: Olive;">&lt;</span><span style="color: Green;">link</span><span style="color: Gray;">&nbsp;</span><span style="color: #00008b;">rel</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">stylesheet</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;"> </span><span style="color: #00008b;">href</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">grid.css</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;"> </span><span style="color: #00008b;">media</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">screen</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">&gt;</span></li>
<li><span style="color: Olive;">&lt;</span><span style="color: Green;">link</span><span style="color: Gray;">&nbsp;</span><span style="color: #00008b;">rel</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">stylesheet</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;"> </span><span style="color: #00008b;">href</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">print.css</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;"> </span><span style="color: #00008b;">media</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">print</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">&gt;</span></li>
<li><span style="color: Olive;">&lt;</span><span style="color: Green;">h1</span><span style="color: Gray;">&nbsp;</span><span style="color: #00008b;">style</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">font-size: 1em;</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">&gt;</span><span style="color: Gray;">HTML sucks</span><span style="color: Olive;">&lt;/</span><span style="color: Green;">h1</span><span style="color: Olive;">&gt;</span></li>
<li><span style="color: Olive;">&lt;</span><span style="color: Green;">p</span><span style="color: Olive;">&gt;</span><span style="color: Gray;">I’ve read about this on a few sites but now I’m sure:</span></li>
<li><span style="color: Gray;">&nbsp; </span><span style="color: Olive;">&lt;</span><span style="color: Green;">u</span><span style="color: Olive;">&gt;</span><span style="color: Gray;">HTML is stupid!!1</span><span style="color: Olive;">&lt;/</span><span style="color: Green;">u</span><span style="color: Olive;">&gt;</span></li>
<li><span style="color: Olive;">&lt;</span><span style="color: Green;">center</span><span style="color: Olive;">&gt;</span><span style="color: Gray;">I can’t believe there’s no way to control the styling of</span></li>
<li><span style="color: Gray;">&nbsp; my website without doing everything all over again!</span><span style="color: Olive;">&lt;/</span><span style="color: Green;">center</span><span style="color: Olive;">&gt;</span></li></ol></div>
<p>推荐的写法：</p>
<div class="hl-surround"><ol class="hl-main ln-show" title="Double click to hide line number." ondblclick = "linenumber(this)"><li class="hl-firstline"><span style="color: Olive;">&lt;</span><span style="color: Gray;">!</span><span style="color: #00008b;">DOCTYPE</span><span style="color: Gray;"> </span><span style="color: #00008b;">html</span><span style="color: Olive;">&gt;</span></li>
<li><span style="color: Olive;">&lt;</span><span style="color: Green;">title</span><span style="color: Olive;">&gt;</span><span style="color: Gray;">My first CSS-only redesign</span><span style="color: Olive;">&lt;/</span><span style="color: Green;">title</span><span style="color: Olive;">&gt;</span></li>
<li><span style="color: Olive;">&lt;</span><span style="color: Green;">link</span><span style="color: Gray;">&nbsp;</span><span style="color: #00008b;">rel</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">stylesheet</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;"> </span><span style="color: #00008b;">href</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">default.css</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">&gt;</span></li>
<li><span style="color: Olive;">&lt;</span><span style="color: Green;">h1</span><span style="color: Olive;">&gt;</span><span style="color: Gray;">My first CSS-only redesign</span><span style="color: Olive;">&lt;/</span><span style="color: Green;">h1</span><span style="color: Olive;">&gt;</span></li>
<li><span style="color: Olive;">&lt;</span><span style="color: Green;">p</span><span style="color: Olive;">&gt;</span><span style="color: Gray;">I’ve read about this on a few sites but today I’m actually</span></li>
<li><span style="color: Gray;">&nbsp; doing it: separating concerns and avoiding anything in the HTML of</span></li>
<li><span style="color: Gray;">&nbsp; my website that is presentational.</span></li>
<li><span style="color: Olive;">&lt;</span><span style="color: Green;">p</span><span style="color: Olive;">&gt;</span><span style="color: Gray;">It’s awesome!</span></li></ol></div>
<h5>实体引用</h5>
<p>在html页面中避免使用实体引用。<br />
如果你的文件是utf-8编码，就不需要使用像<strong> &mdash;</strong>, <strong>&rdquo;</strong>, or <strong>&#x263a;</strong>的实体引用。<br />
不推荐的写法：</p>
<pre class='brush:xml;'>
The currency symbol for the Euro is &ldquo;&eur;&rdquo;.
</pre>
<p>推荐的写法：</p>
<pre class='brush:xml;'>
The currency symbol for the Euro is “€”.
</pre>
<h5>可选的标签</h5>
<p>忽略一些可选的标签，比如<br />
不推荐的写法：</p>
<div class="hl-surround"><ol class="hl-main ln-show" title="Double click to hide line number." ondblclick = "linenumber(this)"><li class="hl-firstline"><span style="color: Olive;">&lt;</span><span style="color: Gray;">!</span><span style="color: #00008b;">DOCTYPE</span><span style="color: Gray;"> </span><span style="color: #00008b;">html</span><span style="color: Olive;">&gt;</span></li>
<li><span style="color: Olive;">&lt;</span><span style="color: Green;">html</span><span style="color: Olive;">&gt;</span></li>
<li><span style="color: Gray;">&nbsp; </span><span style="color: Olive;">&lt;</span><span style="color: Green;">head</span><span style="color: Olive;">&gt;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Olive;">&lt;</span><span style="color: Green;">title</span><span style="color: Olive;">&gt;</span><span style="color: Gray;">Spending money, spending bytes</span><span style="color: Olive;">&lt;/</span><span style="color: Green;">title</span><span style="color: Olive;">&gt;</span></li>
<li><span style="color: Gray;">&nbsp; </span><span style="color: Olive;">&lt;/</span><span style="color: Green;">head</span><span style="color: Olive;">&gt;</span></li>
<li><span style="color: Gray;">&nbsp; </span><span style="color: Olive;">&lt;</span><span style="color: Green;">body</span><span style="color: Olive;">&gt;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Olive;">&lt;</span><span style="color: Green;">p</span><span style="color: Olive;">&gt;</span><span style="color: Gray;">Sic.</span><span style="color: Olive;">&lt;/</span><span style="color: Green;">p</span><span style="color: Olive;">&gt;</span></li>
<li><span style="color: Gray;">&nbsp; </span><span style="color: Olive;">&lt;/</span><span style="color: Green;">body</span><span style="color: Olive;">&gt;</span></li>
<li><span style="color: Olive;">&lt;/</span><span style="color: Green;">html</span><span style="color: Olive;">&gt;</span></li></ol></div>
<p>推荐的写法：</p>
<div class="hl-surround"><ol class="hl-main ln-show" title="Double click to hide line number." ondblclick = "linenumber(this)"><li class="hl-firstline"><span style="color: Olive;">&lt;</span><span style="color: Gray;">!</span><span style="color: #00008b;">DOCTYPE</span><span style="color: Gray;"> </span><span style="color: #00008b;">html</span><span style="color: Olive;">&gt;</span></li>
<li><span style="color: Olive;">&lt;</span><span style="color: Green;">title</span><span style="color: Olive;">&gt;</span><span style="color: Gray;">Saving money, saving bytes</span><span style="color: Olive;">&lt;/</span><span style="color: Green;">title</span><span style="color: Olive;">&gt;</span></li>
<li><span style="color: Olive;">&lt;</span><span style="color: Green;">p</span><span style="color: Olive;">&gt;</span><span style="color: Gray;">Qed.</span></li></ol></div>
<p>html5的文档，可以忽略head、body标签。<br />
所有可忽略的标签，可以看<a href="http://www.whatwg.org/specs/web-apps/current-work/multipage/syntax.html#syntax-tag-omission" target="_blank">《 HTML5 specification 》</a>，</p>
<h5>type属性</h5>
<p>样式和脚本引用可以忽略type属性。<br />
不推荐的写法：</p>
<pre class='brush:xml;'>
<link rel="stylesheet" href="//www.google.com/css/maia.css"
  type="text/css">
</pre>
<p>推荐的写法：</p>
<pre class='brush:xml;'>
<link rel="stylesheet" href="//www.google.com/css/maia.css">
</pre>
<p>不推荐的写法：</p>
<pre class='brush:xml;'>
<script src="//www.google.com/js/gweb/analytics/autotrack.js"
  type="text/javascript"></script>
</pre>
<p>推荐的写法：</p>
<pre class='brush:xml;'>
<script src="//www.google.com/js/gweb/analytics/autotrack.js"></script>
</pre>
<h4>html格式规则</h4>
<h5>常规格式</h5>
<p>每一块、每一列表、每一表格元素都需要另起一行，并缩进每个子元素。</p>
<div class="hl-surround"><ol class="hl-main ln-show" title="Double click to hide line number." ondblclick = "linenumber(this)"><li class="hl-firstline"><span style="color: Olive;">&lt;</span><span style="color: Green;">blockquote</span><span style="color: Olive;">&gt;</span></li>
<li><span style="color: Gray;">&nbsp; </span><span style="color: Olive;">&lt;</span><span style="color: Green;">p</span><span style="color: Olive;">&gt;&lt;</span><span style="color: Green;">em</span><span style="color: Olive;">&gt;</span><span style="color: Gray;">Space</span><span style="color: Olive;">&lt;/</span><span style="color: Green;">em</span><span style="color: Olive;">&gt;</span><span style="color: Gray;">, the final frontier.</span><span style="color: Olive;">&lt;/</span><span style="color: Green;">p</span><span style="color: Olive;">&gt;</span></li>
<li><span style="color: Olive;">&lt;/</span><span style="color: Green;">blockquote</span><span style="color: Olive;">&gt;</span></li></ol></div>
<div class="hl-surround"><ol class="hl-main ln-show" title="Double click to hide line number." ondblclick = "linenumber(this)"><li class="hl-firstline"><span style="color: Olive;">&lt;</span><span style="color: Green;">ul</span><span style="color: Olive;">&gt;</span></li>
<li><span style="color: Gray;">&nbsp; </span><span style="color: Olive;">&lt;</span><span style="color: Green;">li</span><span style="color: Olive;">&gt;</span><span style="color: Gray;">Moe</span></li>
<li><span style="color: Gray;">&nbsp; </span><span style="color: Olive;">&lt;</span><span style="color: Green;">li</span><span style="color: Olive;">&gt;</span><span style="color: Gray;">Larry</span></li>
<li><span style="color: Gray;">&nbsp; </span><span style="color: Olive;">&lt;</span><span style="color: Green;">li</span><span style="color: Olive;">&gt;</span><span style="color: Gray;">Curly</span></li>
<li><span style="color: Olive;">&lt;/</span><span style="color: Green;">ul</span><span style="color: Olive;">&gt;</span></li></ol></div>
<div class="hl-surround"><ol class="hl-main ln-show" title="Double click to hide line number." ondblclick = "linenumber(this)"><li class="hl-firstline"><span style="color: Olive;">&lt;</span><span style="color: Green;">table</span><span style="color: Olive;">&gt;</span></li>
<li><span style="color: Gray;">&nbsp; </span><span style="color: Olive;">&lt;</span><span style="color: Green;">thead</span><span style="color: Olive;">&gt;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Olive;">&lt;</span><span style="color: Green;">tr</span><span style="color: Olive;">&gt;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; </span><span style="color: Olive;">&lt;</span><span style="color: Green;">th</span><span style="color: Gray;">&nbsp;</span><span style="color: #00008b;">scope</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">col</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">&gt;</span><span style="color: Gray;">Income</span><span style="color: Olive;">&lt;/</span><span style="color: Green;">th</span><span style="color: Olive;">&gt;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; </span><span style="color: Olive;">&lt;</span><span style="color: Green;">th</span><span style="color: Gray;">&nbsp;</span><span style="color: #00008b;">scope</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">col</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">&gt;</span><span style="color: Gray;">Taxes</span><span style="color: Olive;">&lt;/</span><span style="color: Green;">th</span><span style="color: Olive;">&gt;</span></li>
<li><span style="color: Gray;">&nbsp; </span><span style="color: Olive;">&lt;</span><span style="color: Green;">tbody</span><span style="color: Olive;">&gt;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Olive;">&lt;</span><span style="color: Green;">tr</span><span style="color: Olive;">&gt;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; </span><span style="color: Olive;">&lt;</span><span style="color: Green;">td</span><span style="color: Olive;">&gt;</span><span style="color: Gray;">$ 5.00</span><span style="color: Olive;">&lt;/</span><span style="color: Green;">td</span><span style="color: Olive;">&gt;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; </span><span style="color: Olive;">&lt;</span><span style="color: Green;">td</span><span style="color: Olive;">&gt;</span><span style="color: Gray;">$ 4.50</span><span style="color: Olive;">&lt;/</span><span style="color: Green;">td</span><span style="color: Olive;">&gt;</span></li>
<li><span style="color: Olive;">&lt;/</span><span style="color: Green;">table</span><span style="color: Olive;">&gt;</span></li></ol></div>
<h4>css样式规则</h4>
<h5>css验证</h5>
<p>尽可能验证css的合法性，可以使用 <a href="http://jigsaw.w3.org/css-validator/" target="_blank">W3C CSS validator</a>。</p>
<h5>id和class名</h5>
<p>使用富有含义和通用的id和class名。<br />
(ps：明河经常听周围的同事感慨，取好名字，也是个学问，有时候有些命名会让你很纠结，但好的命名的确可以提高可读性和可维护性。)<br />
使用功能性和通用性的命名方式减少文档或模板的不必要的改动。<br />
不推荐的写法：</p>
<pre class='brush:css;'>
/* Not recommended: meaningless */
#yee-1901 {}

/* Not recommended: presentational */
.button-green {}
.clear {}
</pre>
<p>推荐的写法：</p>
<pre class='brush:css;'>
/* Recommended: specific */
#gallery {}
#login {}
.video {}

/* Recommended: generic */
.aux {}
.alt {}
</pre>
<h5>id和class的命名风格</h5>
<p>id和class的命名在保持语义性的同时尽可能的短。<br />
不推荐的写法：</p>
<pre class='brush:css;'>
#navigation {}
.atr {}
</pre>
<p>推荐的写法：</p>
<pre class='brush:css;'>
#nav {}
.author {}
</pre>
<p>可以缩写单词，但缩写后务必能让人明白其含义。比如author缩写成atr就非常费解。</p>
<h5>选择器</h5>
<p>避免出现多余的祖先选择器。（存在性能上的差异问题，可以看<a href="http://www.stevesouders.com/blog/2009/06/18/simplifying-css-selectors/" target="_blank"> performance reasons</a>）<br />
避免出现元素标签名作为选择器的一部分。<br />
不推荐的写法：</p>
<pre class='brush:css;'>
ul#example {}
div.error {}
</pre>
<p>推荐的写法：</p>
<pre class='brush:css;'>
#example {}
.error {}
</pre>
<h5>简化css属性写法</h5>
<p>不推荐的写法：</p>
<pre class='brush:css;'>
border-top-style: none;
font-family: palatino, georgia, serif;
font-size: 100%;
line-height: 1.6;
padding-bottom: 2em;
padding-left: 1em;
padding-right: 1em;
padding-top: 0;
</pre>
<p>推荐的写法：</p>
<pre class='brush:css;'>
border-top: 0;
font: 100%/1.6 palatino, georgia, serif;
padding: 0 1em 2em;
</pre>
<p>使用简洁的属性写法有利于提高可读性和解析效率。</p>
<h5>0和单位</h5>
<p>属性值为0时，忽略单位。</p>
<pre class='brush:css;'>
margin: 0;
padding: 0;
</pre>
<h5>属性值出现小数点忽略0</h5>
<pre class='brush:css;'>
font-size: .8em;
</pre>
<h5>url的引用</h5>
<p>使用url()时忽略刮号中的”"。</p>
<pre class='brush:css;'>
@import url(//www.google.com/css/go.css);
</pre>
<h5>16进制符号</h5>
<p>不推荐的写法：</p>
<pre class='brush:css;'>
color: #eebbcc;
</pre>
<p>推荐的写法：</p>
<pre class='brush:css;'>
color: #ebc;
</pre>
<h5>前缀</h5>
<p>给选择器样式名增加前缀（可选）。<br />
在大的项目（多人协作）中使用前缀可以减少样式冲突，同时可以明确选择器归属含义。</p>
<pre class='brush:css;'>
.adw-help {} /* AdWords */
#maia-note {} /* Maia */
</pre>
<p>（PS:一般明河使用前缀来定位样式的归属，比如.nav-item，表明是nav导航下的子元素样式。）</p>
<h5>id和class名的分隔符</h5>
<p>单词使用“-”来连接。<br />
不推荐的写法：</p>
<pre class='brush:css;'>
/* Not recommended: does not separate the words “demo” and “image” */
.demoimage {}

/* Not recommended: uses underscore instead of hyphen */
.error_status {}
</pre>
<p>推荐的写法：</p>
<pre class='brush:css;'>
#video-id {}
.ads-sample {}
</pre>
<h5> Hacks </h5>
<p>尽可能地避免使用hack的方式解决浏览器样式兼容性问题。<br />
（ps：明河觉得这个很难，毕竟IE横在那里。）<br />
尽量避免使用CSS filters。</p>
<h4>css格式规则</h4>
<h5>css属性按字母顺序书写</h5>
<p>（PS：排序忽略浏览器前缀，比如-moz-，-webkit-）</p>
<pre class='brush:css;'>
background: fuchsia;
border: 1px solid;
-moz-border-radius: 4px;
-webkit-border-radius: 4px;
border-radius: 4px;
color: black;
text-align: center;
text-indent: 2em;
</pre>
<h5>块内容缩进</h5>
<pre class='brush:css;'>
@media screen, projection {

  html {
    background: #fff;
    color: #444;
  }

}
</pre>
<p>缩进所有的<a href="http://www.w3.org/TR/CSS21/syndata.html#block" target="_blank">块状内容</a>。</p>
<h5>不可缺少的;</h5>
<p>不推荐的写法：</p>
<pre class='brush:css;'>
.test {
  display: block;
  height: 100px
}
</pre>
<p>推荐的写法：</p>
<pre class='brush:css;'>
.test {
  display: block;
  height: 100px;
}
</pre>
<h5>属性值前增加个空格</h5>
<p>不推荐的写法：</p>
<pre class='brush:css;'>
h3 {
  font-weight:bold;
}
</pre>
<p>推荐的写法：</p>
<pre class='brush:css;'>
h3 {
  font-weight: bold;
}
</pre>
<h5>分隔选择器</h5>
<p>不推荐的写法：</p>
<pre class='brush:css;'>
a:focus, a:active {
  position: relative; top: 1px;
}
</pre>
<p>推荐的写法：</p>
<pre class='brush:css;'>
h1,
h2,
h3 {
  font-weight: normal;
  line-height: 1.2;
}
</pre>
<h5>1行只有一个css属性，二个规则间有一个空行</h5>
<pre class='brush:css;'>
html {
  background: #fff;
}

body {
  margin: auto;
  width: 50%;
}
</pre>
]]></content:encoded>
			<wfw:commentRss>http://www.36ria.com/5249/feed</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
		<item>
		<title>KF/Uploader使用和设计PPT</title>
		<link>http://www.36ria.com/5214</link>
		<comments>http://www.36ria.com/5214#comments</comments>
		<pubDate>Sun, 22 Apr 2012 03:54:39 +0000</pubDate>
		<dc:creator>明河</dc:creator>
				<category><![CDATA[kissy]]></category>
		<category><![CDATA[uploader]]></category>

		<guid isPermaLink="false">http://www.36ria.com/?p=5214</guid>
		<description><![CDATA[这周五明河和紫英在淘宝的懒懒分享会上分享了《KF/Uploader使用和设计》，现在把PPT放出来，有兴趣的同学可以下载查阅。 PPT共有2部分内容：明河讲解Uploader的使用和设计，紫英讲解Uploader的主题制作......]]></description>
			<content:encoded><![CDATA[<p>这周五明河和紫英在淘宝的懒懒分享会上分享了《KF/Uploader使用和设计》，现在把PPT放出来，有兴趣的同学可以下载查阅。<br />
<strong><a href="http://www.36ria.com/wp-content/plugins/download-monitor/download.php?id=230" title="名称：uploader-ppt，下载次数：77，文件大小：3.31 MB" class="btn-download">点此下载</a></strong><br />
<a href="http://www.36ria.com/5214/uploader-ppt" rel="attachment wp-att-5215"><img src="http://www.36ria.com/wp-content/uploads/2012/04/uploader-ppt.png" alt="" title="uploader-ppt" width="533" height="400" class="alignnone size-full wp-image-5215" /></a></p>
<p>PPT共有2部分内容：明河讲解Uploader的使用和设计，紫英讲解Uploader的主题制作。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.36ria.com/5214/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>less在Bootstrap中的应用</title>
		<link>http://www.36ria.com/5209</link>
		<comments>http://www.36ria.com/5209#comments</comments>
		<pubDate>Thu, 19 Apr 2012 07:06:20 +0000</pubDate>
		<dc:creator>天河</dc:creator>
				<category><![CDATA[javascript]]></category>

		<guid isPermaLink="false">http://www.36ria.com/?p=5209</guid>
		<description><![CDATA[个人觉得比较赞的： colors 变量。一般是主体色+辅色，Bootstrap的定义主要像navbarLinkColor，navbarBackground这种，许多辅色是主色的50%，也应用了less。个人认为这与设计师习惯相符，便于在不同频道间复用。但第一次书写成本可能会增加10%，复用时可以同时减少设计师与前端的工作量。 .broder-radius，.bos-shadow等函数在Bootstrap中都有定义。个人觉得这对提高开发效率有不少帮助。 Boots......]]></description>
			<content:encoded><![CDATA[<p>个人觉得比较赞的：</p>
<ol>
<li>colors 变量。一般是主体色+辅色，Bootstrap的定义主要像navbarLinkColor，navbarBackground这种，许多辅色是主色的50%，也应用了less。个人认为这与设计师习惯相符，便于在不同频道间复用。但第一次书写成本可能会增加10%，复用时可以同时减少设计师与前端的工作量。</li>
<li>.broder-radius，.bos-shadow等函数在Bootstrap中都有定义。个人觉得这对提高开发效率有不少帮助。</li>
<li>Bootstrap是利用 less 的 import 来组织代码的，既便于调试，也便于打包。书写优雅，学习成本较低。</li>
</ol>
<p>其他细节：</p>
<ol>
<li>zindex，Bootsrtap里有十分细致的 zindexDropdown，zindexTooltip等。个人认为与全站z-index约定不同，这个涉及范围小一些，在多人维护的项目中可以减少调试工作。</li>
<li>Bootstrap中许多小模块的组织使用了嵌套的方式，个人觉得这种方式用来组织小模块还是很方便的。但是不宜滥用，太深的嵌套会导致性能下降。</li>
<li>less其实还有命名空间可以使用，Bootsrtap在定义 gradient(horizontal、vertical、radial等)，popoverArrow(top、left、bottom、right) 等mixin时采用了这种组织方式。</li>
</ol>
<div>这是天河目前感觉到的好处，同学们不知有没有其它心得，欢迎分享。</div>
]]></content:encoded>
			<wfw:commentRss>http://www.36ria.com/5209/feed</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>kissy1.2DOM关键改进总结</title>
		<link>http://www.36ria.com/4595</link>
		<comments>http://www.36ria.com/4595#comments</comments>
		<pubDate>Tue, 17 Apr 2012 08:15:30 +0000</pubDate>
		<dc:creator>明河</dc:creator>
				<category><![CDATA[kissy]]></category>

		<guid isPermaLink="false">http://www.36ria.com/?p=4595</guid>
		<description><![CDATA[kissy1.2已经发布有一段时间了，淘宝的不少应用已经从1.1.6升级到1.2，kissy1.2相对于1.1.6是全面性的加强，特别是改进的loader机制，推荐升级。这个系列教程明河和飞绿将向大家介绍KISSY1.2在API的变更。 loader机制，是kissy1.2最重要的变更，明河这里先放下，日后会专门发篇文章讲解，教程的名字《kissy1.2最佳实践》，呵呵这名字应该挺酷的。 kissy1.2coreAPI所有的变更 seed模块变更 1.......]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.36ria.com/4595/kissy1-2-change-2" rel="attachment wp-att-4613"><img src="http://www.36ria.com/wp-content/uploads/2011/11/kissy1.2-change1.png" alt="" title="kissy1.2-change" width="680" height="200" class="alignnone size-full wp-image-4613" /></a><br />
kissy1.2已经发布有一段时间了，淘宝的不少应用已经从1.1.6升级到1.2，kissy1.2相对于1.1.6是全面性的加强，特别是改进的loader机制，推荐升级。这个系列教程明河和飞绿将向大家介绍KISSY1.2在API的变更。<br />
loader机制，是kissy1.2最重要的变更，明河这里先放下，日后会专门发篇文章讲解，教程的名字《kissy1.2最佳实践》，呵呵这名字应该挺酷的。</p>
<h4>kissy1.2coreAPI所有的变更</h4>
<p><a href="http://www.36ria.com/4595/kissy1-2%e6%a0%b8%e5%bf%83api%e5%8f%98%e6%9b%b4-2" rel="attachment wp-att-4619"><img src="http://www.36ria.com/wp-content/uploads/2011/11/kissy1.2核心API变更1.png" alt="" title="kissy1.2核心API变更" width="680" height="466" class="alignnone size-full wp-image-4619" /></a></p>
<h2>seed模块变更</h2>
<h4>1.弃用KISSY.app()</h4>
<p>app方法用于创建应用命名空间，1.1.6中常用到，比如明河维护的是淘宝退款业务，业务代码开头是KISSY.app(&#8216;refund&#8217;)，创建一个refund应用。这样所有的页面模块都添加在refund命名空间下，而避免直接污染KISSY这个全局变量。<br />
app作为1.1.6最基本的代码组织方式，<strong>在kissy1.2已经不再推荐使用</strong>。由于kissy1.2引入全新的loader机制实现命名空间隔离，每个模块都是封闭的，直接使用KISSY.add 加入KISSY环境中，不再需要额外的应用命名空间。</p>
<h4>2.KISSY.error()</h4>
<p>抛出错误异常，留意下面的代码，当抛出错误后，不会再执行后来的js代码（没有弹出2），实际上只对script标签内的代码起作用，所以demo后面的js依旧有效。</p>
<div class="hl-surround"><ol class="hl-main ln-show" title="Double click to hide line number." ondblclick = "linenumber(this)"><li class="hl-firstline"><span style="color: Blue;">S</span><span style="color: Gray;">.</span><span style="color: Blue;">error</span><span style="color: Olive;">(</span><span style="color: #8b0000;">'</span><span style="color: Red;">error</span><span style="color: #8b0000;">'</span><span style="color: Olive;">)</span><span style="color: Gray;">;</span></li>
<li><span style="color: Blue;">alert</span><span style="color: Olive;">(</span><span style="color: Maroon;">2</span><span style="color: Olive;">)</span><span style="color: Gray;">;</span></li></ol></div>
<p><a href="http://www.36ria.com/4595/2011-11-9-19-37-26" rel="attachment wp-att-4597"><img src="http://www.36ria.com/wp-content/uploads/2011/11/2011-11-9-19-37-26.png" alt="" title="2011-11-9 19-37-26" width="235" height="94" class="alignnone size-full wp-image-4597" /></a><br />
（ps：请看demo页）</p>
<h2>dom模块变更</h2>
<p>（PS：以下文章中的DOM指代KISSY.DOM）</p>
<h4>1.<a href="http://docs.kissyui.com/docs/html/api/core/dom/clone.html" target="_bank">DOM.clone()</a></h4>
<p>这是非常实用的方法，严重推荐掌握。<br />
<strong>DOM.clone()</strong>用于克隆元素，原生的DOM克隆方法存在浏览器差异，比如深度拷贝上的差异，有些浏览器无法克隆源元素的事件监听，有兴趣的朋友可以看<a href="http://www.w3help.org/zh-cn/causes/SD9029" target="_bank">http://www.w3help.org/zh-cn/causes/SD9029</a>。kissy的DOM.clone()，只要设置第三个参数，即<strong>withDataAndEvent=true</strong>，克隆元素的同时可以把源元素的事件和data一并克隆过来，而且当你设置第二个参数，即<strong>deep=true</strong>时可以开启深度克隆，将克隆源元素的子节点（文本也算子节点哦）。<br />
看下面的demo代码（demo页中）：</p>
<div class="hl-surround"><ol class="hl-main ln-show" title="Double click to hide line number." ondblclick = "linenumber(this)"><li class="hl-firstline"><span style="color: Olive;">&lt;</span><span style="color: Green;">button</span><span style="color: Gray;"> </span><span style="color: #00008b;">id</span><span style="color: Gray;">='</span><span style="color: #00008b;">J_Button</span><span style="color: Gray;">'</span><span style="color: Olive;">&gt;</span><span style="color: Gray;">克隆</span><span style="color: Olive;">&lt;/</span><span style="color: Green;">button</span><span style="color: Olive;">&gt;</span></li>
<li><span style="color: Olive;">&lt;</span><span style="color: Green;">div</span><span style="color: Gray;">&nbsp;</span><span style="color: #00008b;">id</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">J_DemoWrapper</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">&gt;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Olive;">&lt;</span><span style="color: Green;">div</span><span style="color: Gray;">&nbsp;</span><span style="color: #00008b;">class</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">J_Demo</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">&gt;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp; 234234</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Olive;">&lt;/</span><span style="color: Green;">div</span><span style="color: Olive;">&gt;</span></li>
<li><span style="color: Olive;">&lt;/</span><span style="color: Green;">div</span><span style="color: Olive;">&gt;</span></li></ol></div>
<div class="hl-surround"><ol class="hl-main ln-show" title="Double click to hide line number." ondblclick = "linenumber(this)"><li class="hl-firstline"><span style="color: Blue;">S</span><span style="color: Gray;">.</span><span style="color: Blue;">use</span><span style="color: Olive;">(</span><span style="color: #8b0000;">'</span><span style="color: Red;">dom,event</span><span style="color: #8b0000;">'</span><span style="color: Gray;">,</span><span style="color: Green;">function</span><span style="color: Olive;">(</span><span style="color: Blue;">S</span><span style="color: Gray;">,</span><span style="color: Blue;">DOM</span><span style="color: Gray;">,</span><span style="color: Blue;">Event</span><span style="color: Olive;">){</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Green;">var</span><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">elDemo</span><span style="color: Gray;"> = </span><span style="color: Blue;">S</span><span style="color: Gray;">.</span><span style="color: Blue;">get</span><span style="color: Olive;">(</span><span style="color: #8b0000;">'</span><span style="color: Red;">.J_Demo</span><span style="color: #8b0000;">'</span><span style="color: Olive;">)</span><span style="color: Gray;">,</span><span style="color: Blue;">elDemoClone</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Blue;">Event</span><span style="color: Gray;">.</span><span style="color: Blue;">on</span><span style="color: Olive;">(</span><span style="color: Blue;">elDemo</span><span style="color: Gray;">,</span><span style="color: #8b0000;">'</span><span style="color: Red;">click</span><span style="color: #8b0000;">'</span><span style="color: Gray;">,</span><span style="color: Green;">function</span><span style="color: Olive;">(</span><span style="color: Blue;">ev</span><span style="color: Olive;">){</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Blue;">alert</span><span style="color: Olive;">(</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">明河</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">)</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Olive;">})</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Blue;">Event</span><span style="color: Gray;">.</span><span style="color: Blue;">on</span><span style="color: Olive;">(</span><span style="color: #8b0000;">'</span><span style="color: Red;">#J_Button</span><span style="color: #8b0000;">'</span><span style="color: Gray;">,</span><span style="color: #8b0000;">'</span><span style="color: Red;">click</span><span style="color: #8b0000;">'</span><span style="color: Gray;">,</span><span style="color: Green;">function</span><span style="color: Olive;">(){</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: #ffa500;">//elDemoClone =&nbsp; DOM.clone(elDemo,false,true);</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Blue;">elDemoClone</span><span style="color: Gray;"> =&nbsp; </span><span style="color: Blue;">DOM</span><span style="color: Gray;">.</span><span style="color: Blue;">clone</span><span style="color: Olive;">(</span><span style="color: Blue;">elDemo</span><span style="color: Gray;">,</span><span style="color: Green;">true</span><span style="color: Gray;">,</span><span style="color: Green;">true</span><span style="color: Olive;">)</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Blue;">DOM</span><span style="color: Gray;">.</span><span style="color: Blue;">append</span><span style="color: Olive;">(</span><span style="color: Blue;">elDemoClone</span><span style="color: Gray;">,</span><span style="color: #8b0000;">'</span><span style="color: Red;">#J_DemoWrapper</span><span style="color: #8b0000;">'</span><span style="color: Olive;">)</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Olive;">})</span></li>
<li><span style="color: Olive;">})</span></li></ol></div>
<p>可以把elDemoClone =  DOM.clone(elDemo,true,true);换成elDemoClone =  DOM.clone(elDemo,false,true);试下效果，你就发现没有任何东西加入到id为J_DemoWrapper的层，使用firebug查看下，你会发现，其实有加入
<div class="J_Demo"></div>
<p>，只是这个层的内容为空，如下图：<br />
<a href="http://www.36ria.com/4595/2011-11-9-20-07-42" rel="attachment wp-att-4602"><img src="http://www.36ria.com/wp-content/uploads/2011/11/2011-11-9-20-07-42.png" alt="" title="2011-11-9 20-07-42" width="256" height="83" class="alignnone size-full wp-image-4602" /></a><br />
这就印证了明河前面说的，<strong>文本也是子节点</strong>，当第二个参数，即<strong>deep=false</strong>时，没有开启深度拷贝，那么将<strong>不会克隆任何子节点</strong>。<br />
（PS：留意<strong>KISSY.clone()</strong>用于克隆数组或对象，作用与KISSY.DOM.clone()并不相同，不是同一个方法。）</p>
<h4>2.<a href="http://docs.kissyui.com/docs/html/api/core/dom/outerWidth.html" target="_bank">DOM.outerWidth()</a>/<a href="http://docs.kissyui.com/docs/html/api/core/dom/innerWidth.html" target="_bank">DOM.innerWidth()</a></h4>
<p>非常实用的更新，严重推荐掌握。<br />
DOM.outerWidth()用于获取元素的完整盒容器宽度（可以理解为<strong>width+padding+border（+margin）</strong>）；<br />
而DOM.innerWidth()用于获取元素盒容器内部空间宽度（可以理解为<strong>width+padding</strong>），请留意二者的区别。<br />
在1.1.6中没有这二个方法的时获取真实盒模型宽度或者盒模型高度，需要手动通过DOM.css(XXX,”paddingLeft”)等，非常的繁琐，而且DOM.width()还存在display:none的元素获取的宽度为负数的bug，1.2后已经不存在这个问题。</p>
<h5>来看demo代码：</h5>
<p>下面是一个测试层</p>
<div class="hl-surround"><ol class="hl-main ln-show" title="Double click to hide line number." ondblclick = "linenumber(this)"><li class="hl-firstline"><span style="color: Olive;">&lt;</span><span style="color: Green;">div</span><span style="color: Gray;"> </span><span style="color: #00008b;">id</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">J_DemoOuterWidth</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;"> </span><span style="color: #00008b;">style</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">width:200px;height:200px;padding:10px;margin:20px;border:1px solid #ccc;background-color: red;</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">&gt;</span><span style="color: Gray;"> </span><span style="color: Olive;">&lt;/</span><span style="color: Green;">div</span><span style="color: Olive;">&gt;</span></li></ol></div>
<div class="hl-surround"><ol class="hl-main ln-show" title="Double click to hide line number." ondblclick = "linenumber(this)"><li class="hl-firstline"><span style="color: Blue;">S</span><span style="color: Gray;">.</span><span style="color: Blue;">use</span><span style="color: Olive;">(</span><span style="color: #8b0000;">'</span><span style="color: Red;">dom,event</span><span style="color: #8b0000;">'</span><span style="color: Gray;">,</span><span style="color: Green;">function</span><span style="color: Olive;">(</span><span style="color: Blue;">S</span><span style="color: Gray;">,</span><span style="color: Blue;">DOM</span><span style="color: Gray;">,</span><span style="color: Blue;">Event</span><span style="color: Olive;">){</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Blue;">Event</span><span style="color: Gray;">.</span><span style="color: Blue;">on</span><span style="color: Olive;">(</span><span style="color: #8b0000;">'</span><span style="color: Red;">#J_ButtonOuterWidth</span><span style="color: #8b0000;">'</span><span style="color: Gray;">,</span><span style="color: #8b0000;">'</span><span style="color: Red;">click</span><span style="color: #8b0000;">'</span><span style="color: Gray;">,</span><span style="color: Green;">function</span><span style="color: Olive;">(</span><span style="color: Blue;">ev</span><span style="color: Olive;">){</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Green;">var</span><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">elDemo</span><span style="color: Gray;"> = </span><span style="color: Blue;">S</span><span style="color: Gray;">.</span><span style="color: Blue;">get</span><span style="color: Olive;">(</span><span style="color: #8b0000;">'</span><span style="color: Red;">#J_DemoOuterWidth</span><span style="color: #8b0000;">'</span><span style="color: Olive;">)</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Blue;">alert</span><span style="color: Olive;">(</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">style：</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;"> + </span><span style="color: Blue;">DOM</span><span style="color: Gray;">.</span><span style="color: Blue;">style</span><span style="color: Olive;">(</span><span style="color: Blue;">elDemo</span><span style="color: Gray;">,</span><span style="color: #8b0000;">'</span><span style="color: Red;">width</span><span style="color: #8b0000;">'</span><span style="color: Olive;">))</span><span style="color: Gray;">;</span><span style="color: #ffa500;">//200px</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Blue;">alert</span><span style="color: Olive;">(</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">width：</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;"> + </span><span style="color: Blue;">DOM</span><span style="color: Gray;">.</span><span style="color: Blue;">width</span><span style="color: Olive;">(</span><span style="color: Blue;">elDemo</span><span style="color: Olive;">))</span><span style="color: Gray;">;</span><span style="color: #ffa500;">//200</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Blue;">alert</span><span style="color: Olive;">(</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">innerWidth：</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;"> + </span><span style="color: Blue;">DOM</span><span style="color: Gray;">.</span><span style="color: Blue;">innerWidth</span><span style="color: Olive;">(</span><span style="color: Blue;">elDemo</span><span style="color: Olive;">))</span><span style="color: Gray;">;</span><span style="color: #ffa500;">//220</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Blue;">alert</span><span style="color: Olive;">(</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">outerWidth（不含margin）：</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;"> + </span><span style="color: Blue;">DOM</span><span style="color: Gray;">.</span><span style="color: Blue;">outerWidth</span><span style="color: Olive;">(</span><span style="color: Blue;">elDemo</span><span style="color: Olive;">))</span><span style="color: Gray;">;</span><span style="color: #ffa500;">//222</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Blue;">alert</span><span style="color: Olive;">(</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">outerWidth（含margin）：</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;"> + </span><span style="color: Blue;">DOM</span><span style="color: Gray;">.</span><span style="color: Blue;">outerWidth</span><span style="color: Olive;">(</span><span style="color: Blue;">elDemo</span><span style="color: Gray;">,</span><span style="color: Green;">true</span><span style="color: Olive;">))</span><span style="color: Gray;">;</span><span style="color: #ffa500;">//262</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Olive;">})</span><span style="color: Gray;">;</span></li>
<li><span style="color: Olive;">})</span></li></ol></div>
<p>在这个demo中明河测试所有可以获取宽度（但获取的值并不相同）的方法，留意<strong>DOM.style()</strong>，这也是KISSY1.2新增方法，用于获取元素<strong>style属性中name的值</strong>。<br />
也许你会有如下疑惑，既然有了DOM.css()方法了，为什么还需要DOM.style()呢？二者的用途不是差不多吗？<br />
二者的差异在于DOM.css()获取的永远是计算后值，典型的特征是元素的宽度设置是width:50%，使用DOM.css(XXX,”width”)返回的值是真实的宽度，比如200px，如果你使用DOM.style(XXX,”width”)，那么获取的将是width:50%。<br />
demo中还有一个地方需要特别留意下：</p>
<div class="hl-surround"><ol class="hl-main ln-show" title="Double click to hide line number." ondblclick = "linenumber(this)"><li class="hl-firstline"><span style="color: Blue;">alert</span><span style="color: Olive;">(</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">outerWidth（不含margin）：</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;"> + </span><span style="color: Blue;">DOM</span><span style="color: Gray;">.</span><span style="color: Blue;">outerWidth</span><span style="color: Olive;">(</span><span style="color: Blue;">elDemo</span><span style="color: Olive;">))</span><span style="color: Gray;">;</span><span style="color: #ffa500;">//222</span></li>
<li><span style="color: Blue;">alert</span><span style="color: Olive;">(</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">outerWidth（含margin）：</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;"> + </span><span style="color: Blue;">DOM</span><span style="color: Gray;">.</span><span style="color: Blue;">outerWidth</span><span style="color: Olive;">(</span><span style="color: Blue;">elDemo</span><span style="color: Gray;">,</span><span style="color: Green;">true</span><span style="color: Olive;">))</span><span style="color: Gray;">;</span><span style="color: #ffa500;">//262</span></li></ol></div>
<p>DOM.outerWidth()的<strong>第二个参数为true</strong>，表明宽度加上外边距即margin的值，demo中左右外边距分别都为20，所以加上后是262。</p>
<h4>3.<a href="http://docs.kissyui.com/docs/html/api/core/dom/hasAttr.html" target="_bank">DOM.hasAttr()</a></h4>
<p>判断元素是否含有特定属性，非常简单的方法，文档讲解的很详细，明河不在累述。</p>
<h4>4.<a href="http://docs.kissyui.com/docs/html/api/core/dom/hasAttr.html" target="_bank">DOM.prop()</a>/<a href="http://docs.kissyui.com/docs/html/api/core/dom/hasProp.html" target="_bank">DOM.hasProp()</a></h4>
<p>DOM.prop()和DOM.attr()的功能极其相似，都是用于获取/设置元素的特定属性，区别在哪呢？</p>
<h5>来看下面的demo代码：</h5>
<div class="hl-surround"><ol class="hl-main ln-show" title="Double click to hide line number." ondblclick = "linenumber(this)"><li class="hl-firstline"><span style="color: Olive;">&lt;</span><span style="color: Green;">p</span><span style="color: Olive;">&gt;&lt;</span><span style="color: Green;">input</span><span style="color: Gray;"> </span><span style="color: #00008b;">id</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">J_DemoProp</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;"> </span><span style="color: #00008b;">type</span><span style="color: Gray;">='</span><span style="color: #00008b;">checkbox</span><span style="color: Gray;">' </span><span style="color: #00008b;">checked</span><span style="color: Gray;">='</span><span style="color: #00008b;">checked</span><span style="color: Gray;">'</span><span style="color: Olive;">/&gt;</span><span style="color: Gray;">这是一个测试多选框</span><span style="color: Olive;">&lt;/</span><span style="color: Green;">p</span><span style="color: Olive;">&gt;</span></li></ol></div>
<div class="hl-surround"><ol class="hl-main ln-show" title="Double click to hide line number." ondblclick = "linenumber(this)"><li class="hl-firstline"><span style="color: Blue;">S</span><span style="color: Gray;">.</span><span style="color: Blue;">use</span><span style="color: Olive;">(</span><span style="color: #8b0000;">'</span><span style="color: Red;">dom,event</span><span style="color: #8b0000;">'</span><span style="color: Gray;">,</span><span style="color: Green;">function</span><span style="color: Olive;">(</span><span style="color: Blue;">S</span><span style="color: Gray;">,</span><span style="color: Blue;">DOM</span><span style="color: Gray;">,</span><span style="color: Blue;">Event</span><span style="color: Olive;">){</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Blue;">Event</span><span style="color: Gray;">.</span><span style="color: Blue;">on</span><span style="color: Olive;">(</span><span style="color: #8b0000;">'</span><span style="color: Red;">#J_ButtonProp</span><span style="color: #8b0000;">'</span><span style="color: Gray;">,</span><span style="color: #8b0000;">'</span><span style="color: Red;">click</span><span style="color: #8b0000;">'</span><span style="color: Gray;">,</span><span style="color: Green;">function</span><span style="color: Olive;">(</span><span style="color: Blue;">ev</span><span style="color: Olive;">){</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Green;">var</span><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">checkbox</span><span style="color: Gray;"> = </span><span style="color: Blue;">S</span><span style="color: Gray;">.</span><span style="color: Blue;">get</span><span style="color: Olive;">(</span><span style="color: #8b0000;">'</span><span style="color: Red;">#J_DemoProp</span><span style="color: #8b0000;">'</span><span style="color: Olive;">)</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Blue;">alert</span><span style="color: Olive;">(</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">attr：</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;"> + </span><span style="color: Blue;">DOM</span><span style="color: Gray;">.</span><span style="color: Blue;">attr</span><span style="color: Olive;">(</span><span style="color: Blue;">checkbox</span><span style="color: Gray;">,</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">checked</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">))</span><span style="color: Gray;">;</span><span style="color: #ffa500;">//checked</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Blue;">alert</span><span style="color: Olive;">(</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">prop：</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;"> + </span><span style="color: Blue;">DOM</span><span style="color: Gray;">.</span><span style="color: Blue;">prop</span><span style="color: Olive;">(</span><span style="color: Blue;">checkbox</span><span style="color: Gray;">,</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">checked</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">))</span><span style="color: Gray;">;</span><span style="color: #ffa500;">//true</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Blue;">alert</span><span style="color: Olive;">(</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">attr：</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;"> + </span><span style="color: Blue;">DOM</span><span style="color: Gray;">.</span><span style="color: Blue;">attr</span><span style="color: Olive;">(</span><span style="color: Blue;">checkbox</span><span style="color: Gray;">,</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">disabled</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">))</span><span style="color: Gray;">;</span><span style="color: #ffa500;">//undefined</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Blue;">alert</span><span style="color: Olive;">(</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">prop：</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;"> + </span><span style="color: Blue;">DOM</span><span style="color: Gray;">.</span><span style="color: Blue;">prop</span><span style="color: Olive;">(</span><span style="color: Blue;">checkbox</span><span style="color: Gray;">,</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">disabled</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">))</span><span style="color: Gray;">;</span><span style="color: #ffa500;">//false</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Olive;">})</span><span style="color: Gray;">;</span></li>
<li><span style="color: Olive;">})</span></li></ol></div>
<p>特别留意的是使用DOM.attr()获取disabled属性时返回的是undefined，而通过DOM.prop()可以成功获取。<br />
使用DOM.prop()可以获取DOM节点的任意属性，如下图的DOM的属性内容：<br />
<a href="http://www.36ria.com/4595/2011-11-9-21-42-46" rel="attachment wp-att-4607"><img src="http://www.36ria.com/wp-content/uploads/2011/11/2011-11-9-21-42-46.png" alt="" title="2011-11-9 21-42-46" width="248" height="228" class="alignnone size-full wp-image-4607" /></a><br />
而DOM.attr()却只能获取html标签有指定的属性，所以从通用性来讲DOM.prop()更好，特别在获取checked或disabled属性时。</p>
<h5>DOM.hasProp()</h5>
<p>这个方法相对简单，用于判断元素是否含有特定 property 属性，不再累述，可以看文档。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.36ria.com/4595/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>主题制作下—KF/Uploader快速使用指南</title>
		<link>http://www.36ria.com/5188</link>
		<comments>http://www.36ria.com/5188#comments</comments>
		<pubDate>Tue, 10 Apr 2012 11:44:37 +0000</pubDate>
		<dc:creator>明河</dc:creator>
				<category><![CDATA[kissy]]></category>

		<guid isPermaLink="false">http://www.36ria.com/?p=5188</guid>
		<description><![CDATA[上一篇教程，明河简单讲解了主题的基础结构，接下来深入主题细节，讲解在主题内控制上传组件。 1.主题模板说明 /** * 队列使用的模板 * @type String * @default "" */ fileTpl:{value: ' ' + ' ' + '' + ' ' + ' ' + ' ' + ' 等待上传，请稍候 ' + ' ' + ' 上传中... ' + ' ' + ' ' + '上传成功！' + ' ' + ' ' + [.........]]></description>
			<content:encoded><![CDATA[<p>上一篇教程，明河简单讲解了主题的基础结构，接下来深入主题细节，讲解在主题内控制上传组件。</p>
<h4>1.主题模板说明</h4>
<pre class='brush: js; '>
        /**
         * 队列使用的模板
         * @type String
         * @default ""
         */
        fileTpl:{value:
            '
<li id="queue-file-{id}" class="clearfix" data-name="{name}">' +
                '
<div class="tb-pic120">' +
                    '<a href="javascript:void(0);"><img class="J_Pic_{id}" src="" /></a>' +
                '</div>

' +
                '
<div class=" J_Mask_{id} pic-mask"></div>

' +
                '
<div class="status-wrapper J_FileStatus">' +
                    '
<div class="status waiting-status tips-upload-waiting">
<p class="tips-text">等待上传，请稍候
</div>

' +
                    '
<div class="status start-status progress-status tips-uploading">' +
                        '
<div class="J_ProgressBar_{id}"><s class="loading-icon"></s>上传中...</div>

' +
                    '</div>

' +
                    '
<div class="status success-status tips-upload-success">' +
                      '上传成功！' +
                    '</div>

' +
                    '
<div class="status error-status tips-upload-error">' +
                        '
<p class="J_ErrorMsg_{id} tips-text">上传失败，请重试！
</div>

' +
                '</div>

' +
                '<a class="J_Del_{id} del-pic" href="#">删除</a>' +
            '</li>

'
        }
</pre>
<p>一般为li元素，当向队列添加一个文件数据后，会往queueTarget队列目标容器添加DOM，显示文件信息。<br />
（ps：如果你不希望添加数据后添加dom，可以不设置<strong>queueTarget</strong>属性。—V1.1.2新增）</p>
<h5>状态模板</h5>
<p>状态部分的模板最后输出会类似：</p>
<pre class='brush: xml; '>
<div class="status-wrapper J_FileStatus">
<div class="status waiting-status tips-upload-waiting" style="display: none;">
<p class="tips-text">等待上传，请稍候
</div>
<div class="status start-status progress-status tips-uploading" style="display: none;">
<div class="J_ProgressBar_file-92"><s class="loading-icon"></s>上传中...</div>
</div>
<div class="status success-status tips-upload-success" style="">上传成功！</div>
<div class="status error-status tips-upload-error" style="display: none;">
<p class="J_ErrorMsg_file-92 tips-text">上传失败，请重试！
</div></div>
</pre>
<p><strong>J_FileStatus</strong>为状态层容器的钩子，建议加上。</p>
<h5>指定状态层容器</h5>
<pre class='brush: js; '>
        /**
         * 获取状态容器
         * @param {KISSY.NodeList} target 文件的对应的dom（一般是li元素）
         * @return {KISSY.NodeList}
         */
        _getStatusWrapper:function (target) {
            return target.children('.J_FileStatus');
        }
</pre>
<p>target会指向li元素。</p>
<h5>在状态监听器中处理状态层</h5>
<pre class='brush: js; '>
_errorHandler:function (ev) {
            var self = this,file = ev.file,
                 $statusWrapper = file.statusWrapper ;
            $statusWrapper.hide();
}
</pre>
<p>statusWrapper就是我们之前指定的状态层容器，存储在file数据集合中。<br />
之后就可以控制状态层的显隐了。</p>
<h5>模板中id的妙用</h5>
<p>模板中，有时我们需要给按钮绑定事件，比如“删除”、“取消”等，这时候需要指定个钩子，方便查找对应的元素，最快速的方式就是给该元素增加文件id，文件id是唯一的，永不会重复。</p>
<pre class='brush: xml; '>
    <a href="javascript:void(0);"><img class="J_Pic_{id}" src="" /></a>
</pre>
<pre class='brush: js; '>
        /**
         * 将服务器返回的图片路径写到预览图片区域，部分浏览器不支持图片预览
         * @param {String} id  文件id
         * @param {Object} result  服务器端返回的结果集
          */
        _changeImageSrc:function(id,result){
            var data = result.data,url,
                $img = $('.J_Pic_' + id);
            if(!S.isObject(data)) return false;
            url = data.url;
            //不存在预览图片，IE8使用滤镜处理图片预览有问题
            if($img.attr('src') == EMPTY || S.UA.ie == 8){
                $img.attr('src',url);
            }
        }
</pre>
<p>（上面这个函数的用途是：不支持图片预览的浏览器，使用服务器端图片替换）</p>
<h4>2.主题内与Auth（验证类）的交互</h4>
<h5>如何获取验证实例？</h5>
<p>组件会把验证类Auth的实例写入到主题类属性，可以通过this.get(&#8216;auth&#8217;)直接获取到。<br />
来看个控制上传个数的例子：</p>
<pre class='brush: js; '>
/**
         * 显示“你还可以上传几张图片”
         */
        _setCount:function(){
            var self = this,
                //用于显示上传数的容器
                elCount = $(self.get('elCount')),
                len = self.getFilesLen(),
                auth = self.get('auth');
            if(!elCount.length || !auth) return false;
            var rules = auth.get('rules'),
                //max的值类似[5, '最多上传{max}个文件！']
                max = rules.max;
            if(!max) return false;
            elCount.text(max[0]-len);
        },
</pre>
<p>需要知道还可以上传几张图片，需要知道验证类中的规则：max，即最大上传数。</p>
<pre class='brush: js; '>

            var auth = self.get('auth')，
                  rules = auth.get('rules'),
                //max的值类似[5, '最多上传{max}个文件！']
                max = rules.max;
</pre>
<p>获取的max是数组，第一个值才是真正的上传数，第二个值是错误消息。</p>
<h5>监听验证的error事件，达到最大上传数，隐藏上传按钮</h5>
<pre class='brush: js; '>
/**
         * 达到最大允许上传数隐藏按钮
         * @param {Uploader} uploader
         */
        _maxHideBtn:function(uploader){
            //监听上传验证的error事件
            var self = this,auth = self.get('auth');
            auth.on('error',function(ev){
                var rule = ev.rule,button = uploader.get('button'),$btn = button.get('target');
                //图片达到最大允许上传数，隐藏按钮
                if(rule == 'max'){
                    button.hide();
                    //隐藏按钮之上的li容器
                    $btn.parent('li').hide();
                }
            })
        }
</pre>
<h4>3.主题内引入插件</h4>
<p>v1.1.2做了改变，插件不再需要用户手动写requires，引用插件模块路劲。只要增加个plugins属性即可：</p>
<pre class='brush: js; '>
        /**
         * 需要加载的插件，需要手动实例化
         * @type Array
         * @default ['preview','progressBar','filedrop'] 图片预览、进度条、文件拖拽
         */
        plugins:{
          value:['preview','progressBar','filedrop']
        }
</pre>
<p>plugins值为数组，数组值为插件名（插件目录名）。组件会自动加载相应的插件类，然后保存在<strong>oPlugin</strong>属性内。（并不实例化，用户自行控制实例化时机。）<br />
<a href="http://www.36ria.com/5188/theme-1" rel="attachment wp-att-5191"><img src="http://www.36ria.com/wp-content/uploads/2012/04/theme-1.png" alt="" title="theme-1" width="562" height="96" class="alignnone size-full wp-image-5191" /></a></p>
<h5>如何在主题内使用插件</h5>
<p>以图片预览插件为例：<br />
在uploader实例化结束后，实例化Preview。</p>
<pre class='brush: js; '>
afterUploaderRender:function (uploader) {
            var self = this,
                Preview = self.get('oPlugin').preview,
                preview = new Preview();
            //图片预览
            self.set('preview',preview);
}
</pre>
<p><strong>this.get(&#8216;oPlugin&#8217;)</strong>获取到插件类集合，然后取到<strong>preview</strong>，就是插件类了。<br />
<strong>_waitingHandler</strong>在等待上传状态监听中，调用图片预览：</p>
<pre class='brush: js; '>
 /**
         * 文件处于等待上传状态时触发
         */
        _waitingHandler:function (ev) {
            var self = this,preview = self.get('preview'),
                file = ev.file,input = file.input,
                $imageWrapper = $('.J_Pic_'+file.id);
            if(preview &#038;&#038; input &#038;&#038; $imageWrapper.length){
                preview.preview(ev.file.input, $imageWrapper);
            }
        }
</pre>
<p><strong>preview.preview()</strong>接受2个参数，第一个为文件上传域（一般是input），第二个为图片容器。<br />
 _waitingHandler的事件对象ev包含<strong>file</strong>文件数据，通过file.input可以获取到文件上传域元素<br />
<strong>$imageWrapper</strong>为图片容器，可以看下fileTpl文件的模板。<br />
其他插件的处理与之类似。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.36ria.com/5188/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>【思考】函数参数检测</title>
		<link>http://www.36ria.com/5162</link>
		<comments>http://www.36ria.com/5162#comments</comments>
		<pubDate>Sun, 01 Apr 2012 08:58:07 +0000</pubDate>
		<dc:creator>飞绿</dc:creator>
				<category><![CDATA[javascript]]></category>

		<guid isPermaLink="false">http://www.36ria.com/?p=5162</guid>
		<description><![CDATA[起因：代码review中暴露出的一个突出严重的问题&#8211;函数参数缺少检测。故找同事讨论一下这个小小话题。下面是我从讨论中总结出的点。 1、那么首先为什么要做函数参数的检测呢？ 让js代码更健壮！ 2、函数参数的检测是必须的吗？ 严格的来讲是建议任何只要有参数的地方就需要检测，理由：任何的输入操作都是不可靠的，尤其是对javascript这种弱类型的语言来说。 简单......]]></description>
			<content:encoded><![CDATA[<p>起因：代码review中暴露出的一个突出严重的问题&#8211;函数参数缺少检测。故找同事讨论一下这个小小话题。下面是我从讨论中总结出的点。</p>
<h5>1、那么首先为什么要做函数参数的检测呢？</h5>
<p><strong>让js代码更健壮！</strong></p>
<h5>2、函数参数的检测是必须的吗？</h5>
<p>严格的来讲是建议任何只要有参数的地方就需要检测，理由：<strong>任何的输入操作都是不可靠的</strong>，尤其是对javascript这种弱类型的语言来说。<br />
简单来做呢，供外部调用的接口参数进行检测很必要，因为不能确保外部怎么用；内部的方法参数可以按约定，省略检测，可以提高一些性能。</p>
<h5>3、然后，该怎么做呢？从哪方面着手呢？</h5>
<p>对参数的存在性和类型检测的检测是基础。参数个数的检测根据代码逻辑来判断是否加以检测，与代码设计相关，不是必须要做的。<br />
存在性和类型的检测可以通过，如下：</p>
<pre class='brush: js; '>
if(param &#038;&#038; typeof param == 'xxx'){

}
</pre>
<p>一些js框架提供一些api来检测，如：KISSY 的 isObject()、isArray()等，jQuery的isFunction()、isPlainObject()等。<br />
<strong>参数个数</strong>，通过函数的<strong>arguments.lenght</strong>来获得实际传入函数的参数个数。函数的形参个数可以通过函数的length属性获得（<strong>arguments.callee.length</strong>）。例如：</p>
<pre class='brush: js; '>
	function check(args) {
		var actual = args.length,			//the actual number of arguments
			expected = args.callee.length;	//the expected number of arguments
		if(actual != expected) {	//throw an exception if they do not match
			thow new Error('wrong number of arguments: expected: ' + expected + '; actually passed ' + actual);
		}
	}

	function f(x, y, z) {
		//check that the actual # of args matches the expected # of args
		//thow an exception if they do not match
		check(arguments);
		//now do the reset of the function normally
		return x + y + z;
	}
</pre>
<h5>4、接下来处理检测结果，此处阐述检测出错的处理。</h5>
<p>出错后一般会<strong>return false</strong>，但建议在返回前多做一步，<strong>打log</strong>。log帮助调用函数的使用者，知道哪里出错，帮助快速定位问题。KISSY的debug模式在开启的情况下输出日志，这种处理也不错。</p>
<p>大家有什么观点、想法，欢迎评论~! <img src='http://www.36ria.com/wp-includes/images/smilies/icon_exclaim.gif' alt=':!:' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://www.36ria.com/5162/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>如何制作属于自己的主题—KF/Uploader快速使用指南</title>
		<link>http://www.36ria.com/5137</link>
		<comments>http://www.36ria.com/5137#comments</comments>
		<pubDate>Fri, 30 Mar 2012 07:40:10 +0000</pubDate>
		<dc:creator>明河</dc:creator>
				<category><![CDATA[javascript]]></category>

		<guid isPermaLink="false">http://www.36ria.com/?p=5137</guid>
		<description><![CDATA[根据这段时间，各个uploader需求者发给明河的设计图来看，uploader的差异性非常大，不是只要定制下皮肤（css）就可以搞定的，有各种差异性的行为。 imageUploader主题最早来源于苏河同学的love.taobao.com（爱逛街）的需求。 default主题来源于明河的refund.taobao.com（退款）的需求。 lineQueue主题来源于紫英同学的ershou.taobao.com（二手市场）的需求 林谦同学正在开发 lemonlwz306正在开发仿......]]></description>
			<content:encoded><![CDATA[<p>根据这段时间，各个uploader需求者发给明河的设计图来看，uploader的差异性非常大，不是只要定制下皮肤（css）就可以搞定的，有各种差异性的行为。<br />
<a href="http://www.36ria.com/5137/uploader-theme-1" rel="attachment wp-att-5139"><img src="http://www.36ria.com/wp-content/uploads/2012/03/uploader-theme-1.png" alt="" title="uploader-theme-1" width="643" height="176" class="alignnone size-full wp-image-5139" /></a><br />
imageUploader主题最早来源于苏河同学的love.taobao.com（爱逛街）的需求。<br />
<a href="http://www.36ria.com/5137/uploader-theme-2" rel="attachment wp-att-5140"><img src="http://www.36ria.com/wp-content/uploads/2012/03/uploader-theme-2.png" alt="" title="uploader-theme-2" width="371" height="90" class="alignnone size-full wp-image-5140" /></a><br />
default主题来源于明河的refund.taobao.com（退款）的需求。<br />
<a href="http://www.36ria.com/5137/uploader-theme-3" rel="attachment wp-att-5141"><img src="http://www.36ria.com/wp-content/uploads/2012/03/uploader-theme-3.png" alt="" title="uploader-theme-3" width="596" height="207" class="alignnone size-full wp-image-5141" /></a><br />
lineQueue主题来源于紫英同学的ershou.taobao.com（二手市场）的需求<br />
<a href="http://www.36ria.com/5137/uploader-theme-4" rel="attachment wp-att-5142"><img src="http://www.36ria.com/wp-content/uploads/2012/03/uploader-theme-4.jpg" alt="" title="uploader-theme-4" width="566" height="208" class="alignnone size-full wp-image-5142" /></a><br />
林谦同学正在开发<br />
<a href="http://www.36ria.com/5137/uploader-theme-5" rel="attachment wp-att-5143"><img src="http://www.36ria.com/wp-content/uploads/2012/03/uploader-theme-5.png" alt="" title="uploader-theme-5" width="351" height="160" class="alignnone size-full wp-image-5143" /></a><br />
lemonlwz306正在开发仿微博图片上传的主题。</p>
<p><strong>这篇教程明河将以ImageUploader的拷贝主题为例讲解如何使用制作属于自己的uploader主题。</strong><br />
我们将这个本地主题命名为<strong>newImageUploader</strong>。<br />
猛击<a href="http://www.36ria.com/wp-content/plugins/download-monitor/download.php?id=229" title="名称：make-theme-demo-1.1.2，下载次数：16，文件大小：38.2 kB" class="btn-download">点此下载</a>下载demo。<br />
<strong>（PS:1.1.2后组件有做了部分修改，文章页修改了部分内容。）</strong><br />
假设目录结构如下图：<br />
<a href="http://www.36ria.com/5137/make-theme-demo" rel="attachment wp-att-5146"><img src="http://www.36ria.com/wp-content/uploads/2012/03/make-theme-demo.png" alt="" title="make-theme-demo" width="170" height="183" class="alignnone size-full wp-image-5146" /></a><br />
每个主题都必须有个index.js，而style.css主题样式，可以自行通过index.js中的配置更换（满足换肤的需求）。</p>
<h4>主题js模板</h4>
<p>（可以打开demo包中的theme-tpl.js文件）</p>
<h5>1.你需要定义下主题模块路径，和模块依赖</h5>
<pre class='brush: js; '>
KISSY.add('make-theme-demo/newImageUploader/index', function (S, Node, Theme, ProgressBar) {

}, {requires:['node', 'gallery/form/1.1/uploader/theme', 'gallery/form/1.1/uploader/plugins/progressBar/progressBar']});
</pre>
<p>主题模块路径非常重要，要根据你本地的实际情况自行配置。比如示例包中的<strong>&#8216;make-theme-demo/newImageUploader/index&#8217;</strong>。<br />
<strong>requires</strong>定义模块依赖，<strong> &#8216;gallery/form/1.1/uploader/theme&#8217;</strong>是主题基类，必不可少，定制的主题必须继承这个基类。<br />
<del datetime="2012-04-10T09:28:52+00:00"><strong>&#8216;gallery/form/1.1/uploader/plugins/progressBar/progressBar&#8217;</strong>是进度条插件路径，留意模块路径起始为gallery，内置主题使用的是&#8217;../../&#8217;相对路径。</del><br />
V1.1.2更新：无需在requires中引用插件模块，做了简化处理，只要配置下主题的plugins属性，比如：</p>
<pre class='brush: js; '>
        /**
         * 需要加载的插件，需要手动实例化
         * @type Array
         * @default ['preview','progressBar','filedrop'] 图片预览、进度条、文件拖拽
         */
        plugins:{
          value:['preview','progressBar','filedrop']
        }
</pre>
<h5>2.主题构造函数</h5>
<pre class='brush: js; '>
    /**
     * @name NewImageUploader
     * @class 图片上传本地主题demo
     * @constructor
     * @extends Theme
     * @requires Theme
     * @requires  ProgressBar
     * @author 明河
     */
    function NewImageUploader(config) {
        var self = this;
        //调用父类构造函数
        NewImageUploader.superclass.constructor.call(self, config);
    }

    S.extend(NewImageUploader, Theme, /** @lends NewImageUploader.prototype*/{

    }, {ATTRS:/** @lends NewImageUploader.prototype*/{

    }});
    return NewImageUploader;
</pre>
<p>构造函数必须继承Theme类，Theme继承于KISSY的Base，所以使用<strong>ATTRS</strong>来定义属性。如果你要获取主题属性，就必须使用get()。</p>
<h5>3.主题必备方法</h5>
<pre class='brush: js; '>
S.extend(NewImageUploader, Theme, /** @lends NewImageUploader.prototype*/{
        /**
         * 在上传组件运行完毕后执行的方法（对上传组件所有的控制都应该在这个函数内）
         * @param {Uploader} uploader
         */
        afterUploaderRender:function (uploader) {

        },
        /**
         * 获取状态容器
         * @param {KISSY.NodeList} target 文件的对应的dom（一般是li元素）
         * @return {KISSY.NodeList}
         */
        _getStatusWrapper:function (target) {

        },
        /**
         * 文件处于等待上传状态时触发
         */
        _waitingHandler:function (ev) {

        },
        /**
         * 文件处于开始上传状态时触发
         */
        _startHandler:function (ev) {

        },
        /**
         * 文件处于正在上传状态时触发
         */
        _progressHandler:function (ev) {

        },
        /**
         * 文件处于上传成功状态时触发
         */
        _successHandler:function (ev) {

        },
         /**
         * 文件处于上传错误状态时触发
         */
        _errorHandler:function (ev) {

        }
    })
</pre>
<p><strong>afterUploaderRender()</strong>非常重要，由于主题是异步载入的，Uploader实例化时机是有延迟的，当主题加载结束，Uploader实例成功后，组件会自动调用主题的afterUploaderRender方法。<br />
所以对<strong>Uploader</strong>和<strong>Queue</strong>的事件监听，都必须在这个函数。<br />
比如：<br />
监听queue的添加事件</p>
<pre class='brush: js; '>
afterUploaderRender:function (uploader) {
            var self = this,
                queue = self.get('queue');
            queue.on('add',self._queueAddHandler,self);
        }
</pre>
<p><strong>_getStatusWrapper()</strong>是主题用于获取状态容器的定义，所谓状态容器，指的是主题html模板中的状态提示的容器，比如</p>
<pre class='brush: xml; '>
<div class="status-wrapper J_FileStatus">
<div class="status waiting-status tips-upload-waiting" style="display: none;">
<p class="tips-text">等待上传，请稍候
</div>
<div class="status start-status progress-status tips-uploading" style="display: none;">
<div class="J_ProgressBar_file-94 ks-progress-bar" style="width: 100px;" role="progressbar"
                 aria-valuemin="0" aria-valuemax="100" aria-valuenow="0">
<div data-value="0" class="ks-progress-bar-value"></div>
</div>
</div>
<div class="status success-status tips-upload-success" style="">上传成功！</div>
<div class="status error-status tips-upload-error" >
<p
                class="J_ErrorMsg_file-94 tips-text">上传失败，请重试！
</div></div>
</pre>
<p>class=”J_FileStatus”对应的div就是状态容器。<br />
<strong>waitingHandler/startHandler</strong>等一系列的状态监听器，会在文件改变状态后触发，可以在每个监听器内打个S.log，体会下整个过程。状态监听器的作用在于主题开发者，无需手动监听uploader的各个事件，主题拥有自动触发对应监听器的能力。</p>
<h5>主题属性配置</h5>
<pre class='brush: js; '>
 {ATTRS:/** @lends NewImageUploader.prototype*/{
        /**
         *  主题名（文件名），此名称跟样式息息相关
         * @type String
         * @default "newImageUploader-queue"
         */
        name:{value:'newImageUploader'},
        /**
         * 是否引用css文件
         * @type Boolean
         * @default true
         */
        isUseCss:{value:true},
        /**
         * css模块路径
         * @type String
         * @default "gallery/form/1.1/uploader/themes/imageUploader/style.css"
         */
        cssUrl:{value:'make-theme-demo/newImageUploader/style.css'},
        /**
         * 队列使用的模板
         * @type String
         * @default ""
         */
        fileTpl:{value:
            '
<li id="queue-file-{id}" class="clearfix" data-name="{name}">' +
                '
<div class="tb-pic120">' +
                    '<a href="javascript:void(0);"><img class="J_Pic_{id}" src="" /></a>' +
                '</div>

' +
                '
<div class=" J_Mask_{id} pic-mask"></div>

' +
                '
<div class="status-wrapper J_FileStatus">' +
                    '
<div class="status waiting-status tips-upload-waiting">
<p class="tips-text">等待上传，请稍候
</div>

' +
                    '
<div class="status start-status progress-status tips-uploading">' +
                        '
<div class="J_ProgressBar_{id}"><s class="loading-icon"></s>上传中...</div>

' +
                    '</div>

' +
                    '
<div class="status success-status tips-upload-success">' +
                      '上传成功！' +
                    '</div>

' +
                    '
<div class="status error-status tips-upload-error">' +
                        '
<p class="J_ErrorMsg_{id} tips-text">上传失败，请重试！
</div>

' +
                '</div>

' +
                '<a class="J_Del_{id} del-pic" href="#">删除</a>' +
            '</li>

'
        }，
        /**
         * 需要加载的插件，需要手动实例化
         * @type Array
         * @default ['preview','progressBar','filedrop'] 图片预览、进度条、文件拖拽
         */
        plugins:{
            value:['preview','progressBar','filedrop']
        }
    }
</pre>
<ul>
<li>name：主题名，务必设置，组件会自动将此名拼给队列，比如queue会是newImageUploader-queue</li>
<li>isUseCss：是否自动加载css样式，为了减少请求数，可以设置为false，然后在项目css中加上上传样式</li>
<li>cssUrl：非常重要，css的路径名，留意不需要完整路径</li>
<li>fileTpl：主题模板，留意这里{id}的用法，用于取指定节点非常有用</li>
<li><strong>plugins</strong>：1.1.2版新增属性，配置要加载的插件，用户无需手动在<strong>requires</strong>中引用插件路径</li>
</ul>
<h4>主题调用</h4>
<p>配置包路径：</p>
<pre class='brush: js; '>
        var S = KISSY;
        S.config({
            packages:[
                {
                    name:"gallery",
                    path:"http://a.tbcdn.cn/s/kissy/",
                    charset:"utf-8"
                }
            ]
        });
        S.config({
            packages:[
                {
                    name:"make-theme-demo",
                    path:"http://localhost/",
                    charset:"utf-8"
                }
            ]
        });
</pre>
<p>初始化组件</p>
<pre class='brush: js; '>
        S.use('gallery/form/1.1/uploader/index', function (S, RenderUploader) {
            new RenderUploader('#J_UploaderBtn', '#J_UploaderQueue');
        })
</pre>
<p>配置伪属性：</p>
<pre class='brush: xml; '>
<div id="J_UploadBg" class="unupload-area">
                <a class="unupload" id="J_UploaderBtn"
                   data-config='{
                             "theme" : "make-theme-demo/newImageUploader",
                             "urlsInputName":"urlsInput",
                             "serverConfig":{"action":"./upload.php","data":{"iid":77010,"fieldId":132338},"dataType" : "json"},
                             "name":"Filedata"
                       }'
                   data-auth='{
                             "require":[true,"必须至少上传一个文件！"],
                                        "maxSize":[500, "文件大小为{size}，文件太大！"],
                                        "allowExts":[
                                            {"desc":"JPG,JPEG,PNG,GIF,BMP", "ext":"*.jpg;*.jpeg;*.png;*.gif;*.bmp"},
                                            "文件格式错误！"],
                                        "max":[5,"最多允许上传五张图片！"]
                       }'
                        >
                    <span class="count"> 还可以上传<em id="J_UploadCount">5</em>图片！ </span>
                    <s class="bg"></s>
                </a>
            </div>
</pre>
<p>留意<strong>“theme” : “make-theme-demo/newImageUploader”</strong>。<br />
下一篇教程，明河将深入主题的逻辑，讲解主题和uploader个API的交互。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.36ria.com/5137/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>核心类API调用—KF/Uploader快速使用指南</title>
		<link>http://www.36ria.com/5120</link>
		<comments>http://www.36ria.com/5120#comments</comments>
		<pubDate>Tue, 27 Mar 2012 15:04:29 +0000</pubDate>
		<dc:creator>明河</dc:creator>
				<category><![CDATA[kissy]]></category>
		<category><![CDATA[KF/Uploader]]></category>

		<guid isPermaLink="false">http://www.36ria.com/?p=5120</guid>
		<description><![CDATA[RenderUploader(buttonTarget, queueTarget, config) RenderUploader是Uploader的门面类，由于Uploader本身的调用比较复杂，明河就设计了这个类，来简化用户操作。 参数buttonTarget（按钮目标元素）和queueTarget（队列目标元素）是必须的。 RenderUploader自动会从按钮目标元素上的data-config抓取Uploader配置，你还可以配置第三个参数config来覆盖data-config的配置。 KISSY.use('gallery/form/1.1/uploader/index', function (S, ......]]></description>
			<content:encoded><![CDATA[<h4><a href="http://www.36ria.com/demo/gal/gallery/form/1.1/doc/symbols/RenderUploader.html" title="RenderUploader文档" target="_blank">RenderUploader(buttonTarget, queueTarget, config)</a></h4>
<p>RenderUploader是Uploader的门面类，由于Uploader本身的调用比较复杂，明河就设计了这个类，来简化用户操作。<br />
参数<strong>buttonTarget</strong>（按钮目标元素）和<strong>queueTarget</strong>（队列目标元素）是必须的。<br />
RenderUploader自动会从按钮目标元素上的data-config抓取Uploader配置，你还可以配置第三个参数<strong>config</strong>来覆盖data-config的配置。</p>
<pre class='brush: js; '>
KISSY.use('gallery/form/1.1/uploader/index', function (S, RenderUploader) {
     var ru = new RenderUploader('#J_UploaderBtn', '#J_UploaderQueue');
     ru.on("init", function (ev) {
        var uploader = ev.uploader;
     })
})
</pre>
<p>RenderUploader有个非常核心的事件<strong>init</strong>,在Uploader初始化结束后触发，如果你需要监听uploader的事件，或操作uploader的API，务必是在init事件监听器内。<br />
init会有个uploader数据（Uploader的实例）。<br />
<strong>通过uploader，你可以获取queue和button二个核心子类实例。</strong></p>
<pre class='brush: js; '>
     ru.on("init", function (ev) {
        var uploader = ev.uploader,
              button = uploader.get("button"),
              queue = uploader.get("queue");
     })
</pre>
<h4><a href="http://www.36ria.com/demo/gal/gallery/form/1.1/doc/symbols/Uploader.html" title="Uploader文档" target="_blank">Uploader (config)</a></h4>
<p>Uploader 是组件的核心类，有如下主要方法：</p>
<h5>1.upload (index) 上传指定队列索引的文件 </h5>
<p>有三种情况<strong>upload()是不执行的</strong>（症状为不报错，但没有任何post请求）：</p>
<ul>
<li><strong>curUploadIndex</strong>属性不为空（说明有文件正在上传，予以阻止）</li>
<li>指定index的file（文件数据）内的<strong>status值为”error”</strong>，表明验证失败，予以阻止</li>
<li><strong>isAllowUpload</strong>属性为false，表明不允许上传</li>
</ul>
<p>实际应用中，如果你希望阻止文件上传，推荐设置isAllowUpload。比如下面的代码：</p>
<pre class='brush: js; '>
     ru.on("init", function (ev) {
        var uploader = ev.uploader,
              button = uploader.get("button"),
              queue = uploader.get("queue");
       uploader.set('isAllowUpload',false);
     })
</pre>
<h5>2.cancel (index)和stop () </h5>
<p><strong>cancel</strong> 用于取消上传，<strong>stop</strong>用于停止上传，二者的区别是，在批量上传时，cancel只取消指定index文件，不会阻止后续文件的上传。<br />
cancel()没有参数时，默认上传<strong>curUploadIndex</strong>属性中的索引文件。</p>
<h5>3.uploadFiles (status) 批量上传队列中的指定状态下的文件  </h5>
<p>常用的场景是，批量上传等待中的文件，比如<a href="http://localhost/gallery/gallery/form/1.1/demo/form/uploader/index.html#common-config" target="_blank">使用常用配置的示例</a>。</p>
<pre class='brush: js; '>
ru.on("init",function(ev){
    var $ = S.Node.all,
            //上传组件实例
            uploader = ev.uploader,
            //上传按钮实例
            button = uploader.get('button'),
            //上传队列实例
            queue = uploader.get('queue');
            //点击上传，开始上传等待中的文件
    $('#J_UploadAll').on('click', function(ev) {
            uploader.uploadFiles();
    })
})
</pre>
<p>不传参的情况，默认status为”waiting”（等待状态）。</p>
<h5>4.事件列表  </h5>
<p>详细事件说明看<a href="http://www.36ria.com/demo/gal/gallery/form/1.1/doc/symbols/Uploader.html" target="_blank">文档</a>，明河不再累述，来看下事件执行顺序和文件状态变更：<br />
<a href="http://www.36ria.com/5120/uploader2" rel="attachment wp-att-5129"><img src="http://www.36ria.com/wp-content/uploads/2012/03/uploader2.png" alt="" title="uploader2" width="533" height="418" class="alignnone size-full wp-image-5129" /></a><br />
每次文件状态变更，都会触发主题的对应监听器，比如</p>
<pre class='brush: js; '>
queue.fileStatus(0,"waiting");
</pre>
<p>那么就会触发主题的</p>
<pre class='brush: js; '>
        /**
         * 文件处于等待上传状态时触发
         */
       _waitingHandler:function(ev){

        }
</pre>
<p>当你使用upload()方法时状态的<strong>变更监听器会先于事件执行</strong>。</p>
<h5>4.核心属性</h5>
<p>最重要的是二个属性：<strong>button</strong>和<strong>queue</strong>二个子类，特别是queue，主题内部有常对queue的API进行操作，而button主要常用于控制禁用按钮。<br />
<strong>restoreHook</strong>这个属性是V1.1新增的，看名字比较费解，在讲解主题时，明河会予以说明，可以先看<a href="http://localhost/gallery/gallery/form/1.1/demo/form/uploader/index.html#theme-imageUploader" target="_blank">imageUploader主题demo</a>，这个demo有用到这个参数。<br />
<strong>curUploadIndex</strong>属性，为只读，组件内部使用，你可以监听这个属性的AftercurUploadIndexChange事件，根据这个值的改变，来判定有没有文件正在上传。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.36ria.com/5120/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>使用jsdoc生成组件API文档—jsdoc实战</title>
		<link>http://www.36ria.com/5101</link>
		<comments>http://www.36ria.com/5101#comments</comments>
		<pubDate>Thu, 22 Mar 2012 08:00:10 +0000</pubDate>
		<dc:creator>明河</dc:creator>
				<category><![CDATA[javascript]]></category>
		<category><![CDATA[jsdoc]]></category>

		<guid isPermaLink="false">http://www.36ria.com/?p=5101</guid>
		<description><![CDATA[明河曾写过一篇ant教程—《ant结合jsdoc构建js文档—ant入门指南8》，说到如何利用ant和jsdoc来生成js文件的文档。 网上有不少使用jsdoc输出的文档，但可读性非常差，根本原因在于注释不规范，导致输出的文字和排版味同嚼蜡，令人费解。 接下来来看个明河最近使用jsdoc输出的KF（kissy表单组件包）的API文档：KF（kissy form） API文档。 可读性和文档排版是不是很不错呢？（这份文......]]></description>
			<content:encoded><![CDATA[<p>明河曾写过一篇ant教程—<a href="http://www.36ria.com/4816" title="ant结合jsdoc构建js文档—ant入门指南8" target="_blank">《ant结合jsdoc构建js文档—ant入门指南8》</a>，说到如何利用ant和jsdoc来生成js文件的文档。<br />
网上有不少使用jsdoc输出的文档，但可读性非常差，根本原因在于注释不规范，导致输出的文字和排版味同嚼蜡，令人费解。<br />
接下来来看个明河最近使用jsdoc输出的KF（kissy表单组件包）的API文档：<a href="http://www.36ria.com/demo/gal/gallery/form/1.0/doc/index.html" title="KF-kissy form API文档" target="_blank">KF（kissy form） API文档</a>。<br />
可读性和文档排版是不是很不错呢？（这份文档的正文内容都是用jsdoc从js代码注释中拉出来的。）<br />
（明河：利用jsdoc可以绕过痛苦的人肉编写文档的折磨，节省你写文档的时间。而且你如后维护，就修改代码注释，然后再生成，就可以了，效率提高不少！）<br />
今天明河就教大家如何输出这样一份华丽的文档。</p>
<h4>jsdoc模板</h4>
<p>kissy有一份jsdoc的模板，明河做了修改，写成KF模板，如果你需要使用，请自行修改static目录下文件。<br />
<a href="http://www.36ria.com/wp-content/plugins/download-monitor/download.php?id=227" title="名称：jsdoc-kf，下载次数：69，文件大小：14.66 kB" class="btn-download">点此下载</a><br />
（明河：解压缩到你的jsdoc-toolkit/templates/目录下）<br />
关于如何使用ant来输出jsdoc，明河就不再累述，可以看<a href="http://www.36ria.com/4816" title="ant结合jsdoc构建js文档—ant入门指南8" target="_blank">《ant结合jsdoc构建js文档—ant入门指南8》</a>。<br />
build.xml类似下面的代码：</p>
<pre class='brush: xml;'>
<property name="tool.dir" location="../../../../../kissy-tools"/>
<property name="jsdoc.dir" location="${tool.dir}/jsdoc-toolkit"/>
     <!--使用jsdoc输出文档-->
    <target name="doc">
        <taskdef name="jsdoctoolkit" classname="uk.co.darrenhurley.ant.tasks.JsDocToolkit"
                 classpath="${jsdoc.dir}/jsdoc-toolkit-ant-task-1.1.2.jar;${jsdoc.dir}/java/classes/js.jar">
        </taskdef>
        <jsdoctoolkit template="kf" jsdochome="${jsdoc.dir}/" outputdir="${src.dir}/../doc" inputdir="${src.dir}" encoding="utf-8">

        </jsdoctoolkit>
    </target>
</pre>
<h4>规范的注释</h4>
<p><strong>什么样的注释才是规范的？</strong><br />
明河曾帮不少朋友review过代码，发现注释五花八门，随心所欲，如果你的注释只是为了给自己或维护者看，没任何问题。但如果是想要输出成jsdoc文档，那么你的注释必须符合jsdoc的规范。</p>
<h5>1.注释一个构造函数</h5>
<p>随性的方式：</p>
<pre class='brush: js;'>
    //异步文件上传组件，支持ajax、flash、iframe三种方案
    function Uploader(config) {

    }
</pre>
<p>或者：</p>
<pre class='brush: js;'>
    /*
     * 异步文件上传组件，支持ajax、flash、iframe三种方案
     */
    function Uploader(config) {

    }
</pre>
<p>jsdoc的标准形式：</p>
<pre class='brush: js;'>
    /**
     * @name Uploader
     * @class 异步文件上传组件，支持ajax、flash、iframe三种方案
     * @constructor
     * @extends Base
     * @requires UrlsInput
     * @requires IframeType
     * @requires  AjaxType
     * @param {Object} config 组件配置（下面的参数为配置项，配置会写入属性，详细的配置说明请看属性部分）
     * @param {Button} config.button *，Button按钮的实例
     * @param {Queue} config.queue *，Queue队列的实例
     * @param {String|Array} config.type *，采用的上传方案
     * @param {Object} config.serverConfig *，服务器端配置
     * @param {String} config.urlsInputName *，存储文件路径的隐藏域的name名
     * @param {Boolean} config.isAllowUpload 是否允许上传文件
     * @param {Boolean} config.autoUpload 是否自动上传
     * @example
     * var uploader = new Uploader({button:button,queue:queue,serverConfig:{action:'test.php'}})
     */
    function Uploader(config) {

    }
</pre>
<p>哇哦，注释顿时多了很多&#8230;接下来，明河来解释下这些标签的含义：</p>
<ul>
<li>@name ：类名</li>
<li>@class ：类描述</li>
<li>@constructor ：表明这是一个构造函数，非常重要</li>
<li>@extends ：类继承的父类</li>
<li>@requires ： 依赖的类</li>
<li>@param ：参数</li>
<li>@example : 示例代码</li>
</ul>
<p>输出的文档如下：<br />
<a href="http://www.36ria.com/5101/jsdoc-1" rel="attachment wp-att-5102"><img src="http://www.36ria.com/wp-content/uploads/2012/03/jsdoc-1.png" alt="" title="jsdoc-1" width="512" height="352" class="alignnone size-full wp-image-5102" /></a></p>
<h5>2.注释组件事件</h5>
<p>由于事件一般不是一个函数，所以我采用额外向页面添加事件注释，位置随意。</p>
<pre class='brush: js;'>
    /**
     * @name Uploader#success
     * @desc  上传成功后触发
     * @event
     * @param {Number} ev.index 上传中的文件在队列中的索引值
     * @param {Object} ev.file 文件数据
     * @param {Object} ev.result 服务器端返回的数据
     */
</pre>
<p>标签的含义如下：</p>
<ul>
<li>@name ： 事件名，留意“#”前是归属类名，“#”后是事件名</li>
<li>@desc ： 事件描述</li>
<li>@event ： 表明这段注释目标为事件。非常重要</li>
</ul>
<p>jsdoc输出的结构如图：<br />
<a href="http://www.36ria.com/5101/jsdoc-2" rel="attachment wp-att-5103"><img src="http://www.36ria.com/wp-content/uploads/2012/03/jsdoc-2.png" alt="" title="jsdoc-2" width="393" height="205" class="alignnone size-full wp-image-5103" /></a></p>
<h5>3.注释属性</h5>
<p>需要注释的属性有二种类型：类属性和静态属性。<br />
注释类属性的方法如下：</p>
<pre class='brush: js;'>
 /** @lends Uploader.prototype*/{
        /**
         * Button按钮的实例
         * @type Button
         * @default {}
         */
        button:{value:{}},
        /**
         * Queue队列的实例
         * @type Queue
         * @default {}
         */
        queue:{value:{}},
        /**
         * 采用的上传方案，当值是数组时，比如“type” : ["flash","ajax","iframe"]，按顺序获取浏览器支持的方式，该配置会优先使用flash上传方式，如果浏览器不支持flash，会降级为ajax，如果还不支持ajax，会降级为iframe；当值是字符串时，比如“type” : “ajax”，表示只使用ajax上传方式。这种方式比较极端，在不支持ajax上传方式的浏览器会不可用；当“type” : “auto”，auto是一种特例，等价于["ajax","iframe"]。
         * @type String|Array
         * @default "auto"
         */
        type:{value:Uploader.type.AUTO},
        /**
         * 服务器端配置。action：服务器处理上传的路径；data： post给服务器的参数，通常需要传递用户名、token等信息
         * @type Object
         * @default  {action:EMPTY, data:{}, dataType:'json'}
         */
        serverConfig:{value:{action:EMPTY, data:{}, dataType:'json'}}
}
</pre>
<p>属性写在哪里跟输出没有什么关系，比如kissy1.2的组件属性一般归属于ATTRS。<br />
关键的是，必须加上<strong>@lends Uploader.prototype</strong>标签，表示下面的属性归属于Uploader。</p>
<ul>
<li>@type ： 数据类型</li>
<li>@default ： 默认值</li>
</ul>
<p>jsdoc输出的结构如下图：<br />
<a href="http://www.36ria.com/5101/jsdoc-3" rel="attachment wp-att-5104"><img src="http://www.36ria.com/wp-content/uploads/2012/03/jsdoc-3.png" alt="" title="jsdoc-3" width="353" height="320" class="alignnone size-full wp-image-5104" /></a><br />
如果要注释静态属性，只要<strong>@lends Uploader</strong>即可。</p>
<h5>4.注释方法</h5>
<pre class='brush: js;'>
/** @lends Uploader.prototype*/{
        /**
         * 运行组件，实例化类后必须调用render()才真正运行组件逻辑
         * @return {Uploader}
         */
        render:function () {
        }
</pre>
<p>跟注释属性类似，必须定义<strong>/** @lends Uploader.prototype*/</strong>。<br />
jsdoc输出的结构如下图：<br />
<a href="http://www.36ria.com/5101/jsdoc-4" rel="attachment wp-att-5105"><img src="http://www.36ria.com/wp-content/uploads/2012/03/jsdoc-4.png" alt="" title="jsdoc-4" width="585" height="272" class="alignnone size-full wp-image-5105" /></a></p>
<h5>5.文件描述注释</h5>
<pre class='brush: js;'>
/**
 * @fileoverview 异步文件上传组件
 * @author 剑平（明河）<minghe36@126.com>,紫英<daxingplay@gmail.com>
 **/
</pre>
<h4>注释完整范例</h4>
<pre class='brush: js;'>
/**
 * @fileoverview 异步文件上传组件
 * @author 剑平（明河）<minghe36@126.com>,紫英<daxingplay@gmail.com>
 **/
KISSY.add('gallery/form/1.0/uploader/base', function (S, Base, Node, UrlsInput, IframeType, AjaxType, FlashType) {
    var EMPTY = '', $ = Node.all, LOG_PREFIX = '[uploader]:';
    /**
     * @name Uploader
     * @class 异步文件上传组件，支持ajax、flash、iframe三种方案
     * @constructor
     * @extends Base
     * @requires UrlsInput
     * @requires IframeType
     * @requires  AjaxType
     * @param {Object} config 组件配置（下面的参数为配置项，配置会写入属性，详细的配置说明请看属性部分）
     * @param {Button} config.button *，Button按钮的实例
     * @param {Queue} config.queue *，Queue队列的实例
     * @param {String|Array} config.type *，采用的上传方案
     * @param {Object} config.serverConfig *，服务器端配置
     * @param {String} config.urlsInputName *，存储文件路径的隐藏域的name名
     * @param {Boolean} config.isAllowUpload 是否允许上传文件
     * @param {Boolean} config.autoUpload 是否自动上传
     * @example
     * var uploader = new Uploader({button:button,queue:queue,serverConfig:{action:'test.php'}})
     */
    function Uploader(config) {
        var self = this;
        //调用父类构造函数
        Uploader.superclass.constructor.call(self, config);
    }

    S.mix(Uploader, /** @lends Uploader*/{
        /**
         * 上传方式，{AUTO:'auto', IFRAME:'iframe', AJAX:'ajax', FLASH:'flash'}
         */
        type:{AUTO:'auto', IFRAME:'iframe', AJAX:'ajax', FLASH:'flash'},
        /**
         * 组件支持的事件列表，{ RENDER:'render', SELECT:'select', START:'start', PROGRESS : 'progress', COMPLETE:'complete', SUCCESS:'success', UPLOAD_FILES:'uploadFiles', CANCEL:'cancel', ERROR:'error' }
         *
         */
        event:{
            //运行
            RENDER:'render',
            //选择完文件后触发
            SELECT:'select',
            //开始上传后触发
            START:'start',
            //正在上传中时触发
            PROGRESS : 'progress',
            //上传完成（在上传成功或上传失败后都会触发）
            COMPLETE:'complete',
            //上传成功后触发
            SUCCESS:'success',
            //批量上传结束后触发
            UPLOAD_FILES:'uploadFiles',
            //取消上传后触发
            CANCEL:'cancel',
            //上传失败后触发
            ERROR:'error'
        },
        /**
         * 文件上传所有的状态，{ WAITING : 'waiting', START : 'start', PROGRESS : 'progress', SUCCESS : 'success', CANCEL : 'cancel', ERROR : 'error', RESTORE: 'restore' }
         */
        status:{
            WAITING : 'waiting',
            START : 'start',
            PROGRESS : 'progress',
            SUCCESS : 'success',
            CANCEL : 'cancel',
            ERROR : 'error',
            RESTORE: 'restore'
        }
    });
    /**
     * @name Uploader#select
     * @desc  选择完文件后触发
     * @event
     * @param {Array} ev.files 文件完文件后返回的文件数据
     */

    /**
     * @name Uploader#start
     * @desc  开始上传后触发
     * @event
     * @param {Number} ev.index 要上传的文件在队列中的索引值
     * @param {Object} ev.file 文件数据
     */

    /**
     * @name Uploader#progress
     * @desc  正在上传中时触发，这个事件在iframe上传方式中不存在
     * @event
     * @param {Object} ev.file 文件数据
     * @param {Number} ev.loaded  已经加载完成的字节数
     * @param {Number} ev.total  文件总字节数
     */

    /**
     * @name Uploader#complete
     * @desc  上传完成（在上传成功或上传失败后都会触发）
     * @event
     * @param {Number} ev.index 上传中的文件在队列中的索引值
     * @param {Object} ev.file 文件数据
     * @param {Object} ev.result 服务器端返回的数据
     */

    /**
     * @name Uploader#success
     * @desc  上传成功后触发
     * @event
     * @param {Number} ev.index 上传中的文件在队列中的索引值
     * @param {Object} ev.file 文件数据
     * @param {Object} ev.result 服务器端返回的数据
     */

    /**
     * @name Uploader#error
     * @desc  上传失败后触发
     * @event
     * @param {Number} ev.index 上传中的文件在队列中的索引值
     * @param {Object} ev.file 文件数据
     * @param {Object} ev.result 服务器端返回的数据
     */

    /**
     * @name Uploader#cancel
     * @desc  取消上传后触发
     * @event
     * @param {Number} ev.index 上传中的文件在队列中的索引值
     */

    /**
     * @name Uploader#uploadFiles
     * @desc  批量上传结束后触发
     * @event
     */
    //继承于Base，属性getter和setter委托于Base处理
    S.extend(Uploader, Base, /** @lends Uploader.prototype*/{
        /**
         * 运行组件，实例化类后必须调用render()才真正运行组件逻辑
         * @return {Uploader}
         */
        render:function () {
                       return self;
        },
        /**
         * 上传指定队列索引的文件
         * @param {Number} index 文件对应的在上传队列数组内的索引值
         * @example
         * //上传队列中的第一个文件，uploader为Uploader的实例
         * uploader.upload(0)
         */
        upload:function (index) {

        },
        /**
         * 取消文件上传，当index参数不存在时取消当前正在上传的文件的上传。cancel并不会停止其他文件的上传（对应方法是stop）
         * @param {Number} index 队列数组索引
         * @return {Uploader}
         */
        cancel:function (index) {

            return self;
        },
        /**
         * 停止上传动作
         * @return {Uploader}
         */
        stop : function(){

            return self;
        },
        /**
         * 批量上传队列中的指定状态下的文件
         * @param {String} status 文件上传状态名
         * @return {Uploader}
         * @example
         * //上传队列中所有等待的文件
         * uploader.uploadFiles("waiting")
         */
        uploadFiles:function (status) {

            return self;
        },
        /**
         * 上传队列中的指定状态下的文件
         * @param {String} status 文件上传状态名
         * @return {Uploader}
         */
        _uploaderStatusFile:function (status) {

            return self;
        },
        /**
         * 是否支持ajax方案上传
         * @return {Boolean}
         */
        isSupportAjax:function () {

            return isSupport;
        },
        /**
         * 是否支持flash方案上传
         * @return {Boolean}
         */
        isSupportFlash:function () {

            return S.isArray(fpv) &#038;&#038; fpv.length > 0;
        },
        /**
         * 获取上传方式类（共有iframe、ajax、flash三种方式）
         * @type {String} type 上传方式
         * @return {IframeType|AjaxType|FlashType}
         */
        getUploadType:function (type) {

            return UploadType;
        },
        /**
         * 获取上传方式
         * @param {String} type 上传方式（根据type返回对应的上传类，比如iframe返回IframeType）
         */
        _getType:function (type) {

            return UploadType;
        },
        /**
         * 运行Button上传按钮组件
         * @return {Button}
         */
        _renderButton:function () {

            return button;
        },
        /**
         * 运行Queue队列组件
         * @return {Queue} 队列实例
         */
        _renderQueue:function () {

            return queue;
        },
        /**
         * 选择完文件后
         * @param {Object} ev 事件对象
         */
        _select:function (ev) {

        },
        /**
         * 向上传按钮容器内增加用于存储文件路径的input
         */
        _renderUrlsInput:function () {

        },
        /**
         * 当上传完毕后返回结果集的处理
         */
        _uploadCompleteHanlder:function (ev) {

        },
        /**
         * 取消上传后调用的方法
         */
        _uploadStopHanlder:function () {

        },
        /**
         * 如果存在批量上传，则继续上传
         */
        _continueUpload : function(){

        },
        /**
         * 上传进度监听器
         */
        _uploadProgressHandler:function (ev) {

        },
        /**
         * 上传成功后执行的回调函数
         * @param {Object} data 服务器端返回的数据
         */
        _success:function (data) {

        },
        /**
         * 检查是否有已经存在的图片恢复到队列中
         */
        _restore: function(){

            }
        }
    }, {ATTRS:/** @lends Uploader.prototype*/{
        /**
         * Button按钮的实例
         * @type Button
         * @default {}
         */
        button:{value:{}},
        /**
         * Queue队列的实例
         * @type Queue
         * @default {}
         */
        queue:{value:{}},
        /**
         * 采用的上传方案，当值是数组时，比如“type” : ["flash","ajax","iframe"]，按顺序获取浏览器支持的方式，该配置会优先使用flash上传方式，如果浏览器不支持flash，会降级为ajax，如果还不支持ajax，会降级为iframe；当值是字符串时，比如“type” : “ajax”，表示只使用ajax上传方式。这种方式比较极端，在不支持ajax上传方式的浏览器会不可用；当“type” : “auto”，auto是一种特例，等价于["ajax","iframe"]。
         * @type String|Array
         * @default "auto"
         */
        type:{value:Uploader.type.AUTO},
        /**
         * 服务器端配置。action：服务器处理上传的路径；data： post给服务器的参数，通常需要传递用户名、token等信息
         * @type Object
         * @default  {action:EMPTY, data:{}, dataType:'json'}
         */
        serverConfig:{value:{action:EMPTY, data:{}, dataType:'json'}},
        /**
         * 是否允许上传文件
         * @type Boolean
         * @default true
         */
        isAllowUpload:{value:true},
        /**
         * 是否自动上传
         * @type Boolean
         * @default true
         */
        autoUpload:{value:true},
        /**
         * 存储文件路径的隐藏域的name名
         * @type String
         * @default ""
         */
        urlsInputName:{value:EMPTY},
        /**
         *  当前上传的文件对应的在数组内的索引值，如果没有文件正在上传，值为空
         *  @type Number
         *  @default ""
         */
        curUploadIndex:{value:EMPTY},
        /**
         * 上传方式实例
         * @type UploaderType
         * @default {}
         */
        uploadType:{value:{}},
        /**
         * UrlsInput实例
         * @type UrlsInput
         * @default ""
         */
        urlsInput:{value:EMPTY},
        /**
         * 存在批量上传文件时，指定的文件状态
         * @type String
         * @default ""
         */
        uploadFilesStatus:{value:EMPTY}
    }});

    return Uploader;
}, {requires:['base', 'node', './urlsInput', './type/iframe', './type/ajax', './type/flash', 'flash']});
</pre>
<h4>扩展阅读</h4>
<ul>
<li><a href="http://usejsdoc.org/" title="usejsdoc" target="_blank">use JSDoc</a>：非常好的入门教程</li>
<li><a href="https://github.com/jannon/jsdoc3-ant-task " target="_blank">ant-task</a></li>
<li><a href="http://code.google.com/p/jsdoc-toolkit/w/list " target="_blank">wiki</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.36ria.com/5101/feed</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>组件配置方式和关键配置—KF/Uploader快速使用指南</title>
		<link>http://www.36ria.com/5072</link>
		<comments>http://www.36ria.com/5072#comments</comments>
		<pubDate>Mon, 19 Mar 2012 14:36:00 +0000</pubDate>
		<dc:creator>明河</dc:creator>
				<category><![CDATA[kissy]]></category>
		<category><![CDATA[uploader]]></category>
		<category><![CDATA[异步文件上传]]></category>

		<guid isPermaLink="false">http://www.36ria.com/?p=5072</guid>
		<description><![CDATA[伪属性传参配置 点此查看demo 选择要上传的文件 配置写在data-config属性内，为一个json字符串，要特别小心json格式必须符合规范，不然解析时会报错。 留意：键名不能使用单引号，比如'name':"Filedata"，解析会失败！ type：上传方式，当为auto时，组件会根据浏览器选择使用ajax还是iframe serverConfig：服务器端配置，包括最重要的action（路径）配置和data（post到服务器的数据） name：......]]></description>
			<content:encoded><![CDATA[<h2 id="dataConfig">伪属性传参配置</h2>
<p><a style="float:none;" href="http://www.36ria.com/demo/gal/gallery/form/1.2/demo/form/uploader/index.html#use" class="btn-view-demo" target="_blank">点此查看demo</a></p>
<pre class='brush: xml; '>
    <!-- 上传按钮，组件配置请写在data-config内 -->
    <a id="J_UploaderBtn" class="uploader-button" data-config=
            '{
                 "serverConfig":{"action":"upload.php","data":{"username":"minghe"}},
                    "name":"Filedata",
                    "urlsInputName":"fileUrls"
                }'
       href="#">
        选择要上传的文件
    </a>
    <!-- 文件上传队列 -->
<ul id="J_UploaderQueue">
</ul>
</pre>
<p>配置写在<strong>data-config</strong>属性内，为一个json字符串，要特别小心json格式必须符合规范，不然解析时会报错。</p>
<p>留意：键名不能使用单引号，比如<code>'name':"Filedata"</code>，解析会失败！</p>
<ul>
<li><del datetime="2012-05-09T01:37:59+00:00"><b>type</b>：上传方式，当为auto时，组件会根据浏览器选择使用ajax还是iframe</del></li>
<li><code>serverConfig</code>：服务器端配置，包括最重要的<code>action</code>（路径）配置和<code>data</code>（post到服务器的数据）</li>
<li><code>name</code>：文件上传域name名</li>
<li><code>urlsInputName</code>：用于存放服务器端返回的文件路径的input</li>
</ul>
<p>不再推荐手动配置type参数！</p>
<p>接下来初始化组件即可</p>
<pre class='brush: js; '>
KISSY.config({
           packages:[ {
               name:"gallery",
               path:"http://a.tbcdn.cn/s/kissy/",
               charset:"utf-8"
           } ]
    });
KISSY.use('gallery/form/1.1/uploader/index', function (S, RenderUploader) {
    new RenderUploader('#J_UploaderBtn', '#J_UploaderQueue');
})
</pre>
<h2 id="jsConfig">js传参配置</h2>
<p><a style="float:none;" href="http://www.36ria.com/demo/gal/gallery/form/1.2/demo/form/uploader/index.html#extra-config" class="btn-view-demo" target="_blank">点此查看demo</a><br />
推荐使用js传参方式！</p>
<pre class='brush: xml; '>
    <a id="J_UploaderBtn" class="uploader-button" href="#"> 选择要上传的文件 </a>
    <!-- 文件上传队列 -->
<ul id="J_UploaderQueue">
</ul>
</pre>
<pre class='brush: js; '>
    KISSY.use('gallery/form/1.2/uploader/index', function (S, RenderUploader) {
        new RenderUploader('#J_UploaderBtn', '#J_UploaderQueue',{
            //服务器端配置
            serverConfig:{
                //处理上传的服务器端脚本路径
                action:"upload.php"
            },
            // 文件域
            name:"Filedata",
            //用于放服务器端返回的url的隐藏域
            urlsInputName:"fileUrls"
        });
    })
</pre>
<h4>常用配置说明</h4>
<p>先来看个使用常用配置的demo<br />
<a style="float:none;" href="http://www.36ria.com/demo/gal/gallery/form/1.2/demo/form/uploader/index.html#common-config" class="btn-view-demo" target="_blank">点此查看demo</a></p>
<h5>1.”type” : “auto”</h5>
<p><strong>不再推荐配置type！</strong><br />
type参数设置上传方式，它的值有如下三种情况：</p>
<ul>
<li>string，比如<code>"type" : "auto"</code>，<strong>auto</strong>是一种特例，等价于["ajax","flash","iframe"]，这是默认方式</li>
<li>array，比如<code>"type" : ["flash","ajax","iframe"]</code>，按顺序获取浏览器支持的方式，该配置会优先使用flash上传方式，如果浏览器不支持flash，会降级为ajax，如果还不支持ajax，会降级为iframe&#8230;（明河：没有比iframe更低的了-_-!）；</li>
<li>string，比如<code>"type" : "ajax"</code>，表示只使用ajax上传方式。这种方式比较极端，在不支持ajax上传方式的浏览器会不可用；</li>
</ul>
<h5>2.”name”:”Filedata”</h5>
<p>name参数为文件域的name值，非常重要，这个参数将通过RenderUploader传递给<strong>Button</strong>（即button/base.js或button/swfButton.js）。组件会创建如下的html结构：<br />
<a href="http://www.36ria.com/5072/uploader-config-1" rel="attachment wp-att-5087"><br />
    <img src="http://www.36ria.com/wp-content/uploads/2012/03/uploader-config-1.png" alt="" title="uploader-config-1" width="579" height="51" class="alignnone size-full wp-image-5087" /></a><br />
如果是flash上传，结构有差异：<br />
<a href="http://www.36ria.com/5072/uploader-2-2" rel="attachment wp-att-5371"><img src="http://www.36ria.com/wp-content/uploads/2012/03/uploader-2.png" alt="" title="uploader-2" width="502" height="114" class="alignnone size-full wp-image-5371" /></a><br />
服务器通过获取这个文件域来上传图片：</p>
<pre class='brush: js; '>
$fileInput = 'Filedata';
$files_name_arr = array($fileInput);
foreach($files_name_arr as $k=>$v){
	$pic = $_FILES[$v];
	$result = move_uploaded_file($pic['tmp_name'], $dir.$pic['name']);
}
</pre>
<p>详细服务器端脚本，<a href="https://github.com/kissyteam/kissy-gallery/blob/master/gallery/form/1.2/demo/form/uploader/upload.php" target="_blank">请看这里</a>。</p>
<h5>3.”theme” : “default”</h5>
<p>theme用于指定使用的主题引用路劲，非常重要，默认是引用default主题。如果引用成功的话，会看到如下请求：</p>
<pre class='brush: js; '>

http://a.tbcdn.cn/s/kissy/gallery/form/1.2/uploader/themes/default/index.js

http://a.tbcdn.cn/s/kissy/gallery/form/1.2/uploader/themes/default/style.css
</pre>
<p>发布的版本，可能是default/index-min.js和default/style-min.css。<br />
如果使用内置主题，可以只传主题名就好，比如”default”或”imageUploader”。</p>
<h5>“serverConfig”:{“action”:”upload.php”}</h5>
<p>非常关键的参数，是和服务器端交互的核心。</p>
<ul>
<li><code>"action":"upload.php" </code>： 服务器处理上传的路径；</li>
<li><code>"data":{"dir":"files/"} </code>： post给服务器的参数，通常需要传递用户名、token等信息</li>
</ul>
<p>特别留意如果是flash上传方式，action必须是绝对路径！！！）<br />
<strong>action最好是绝对路径</strong>，这是flash上传的要求，v1.2组件会自动将相对路径转成绝对路径，可能会出问题，留意！</p>
<h5>4.”urlsInputName”:”fileUrls”</h5>
<p><code>urlsInputName</code>用于设置存放服务器端返回的路径隐藏域。Uploader创建UrlsInput（uploader/urlsInput.js）实例时如果不存在name为“fileUrls”的隐藏域，会自动创建一个，如果存在就使用已有的。<br />
<a href="http://www.36ria.com/5072/uploader-config-2" rel="attachment wp-att-5096"><img src="http://www.36ria.com/wp-content/uploads/2012/03/uploader-config-2.png" alt="" title="uploader-config-2" width="513" height="22" class="alignnone size-full wp-image-5096" /></a><br />
多个url会以“,”号隔开。<br />
推荐用户手动在页面中加个urls隐藏域。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.36ria.com/5072/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>组件设计—KF/Uploader快速使用指南</title>
		<link>http://www.36ria.com/5049</link>
		<comments>http://www.36ria.com/5049#comments</comments>
		<pubDate>Wed, 14 Mar 2012 15:15:39 +0000</pubDate>
		<dc:creator>明河</dc:creator>
				<category><![CDATA[kissy]]></category>
		<category><![CDATA[uploader]]></category>
		<category><![CDATA[异步文件上传]]></category>

		<guid isPermaLink="false">http://www.36ria.com/?p=5049</guid>
		<description><![CDATA[uploader的源码包含不少js，为了能让大家更好理解uploader，明河先来讲解KISSY-FORM中的uploader的设计思路。 （PS：可以快读&#8230;） 模块说明 uploader的核心为base.js，而index.js为组件入口，会根据html中的伪属性配置实例化Uploader（即base.js的类），Button（上传按钮button/base.js或button/swfButton.js），Auth（上传验证auth.js），Theme（模板）等。 来看当执行下面的js代码后都发生了什么。 //加载......]]></description>
			<content:encoded><![CDATA[<p>uploader的源码包含不少js，为了能让大家更好理解uploader，明河先来讲解KISSY-FORM中的uploader的设计思路。<br />
（PS：可以快读&#8230;）</p>
<h4>模块说明</h4>
<p><a href="http://www.36ria.com/5049/uploader-mods" rel="attachment wp-att-5051"><img src="http://www.36ria.com/wp-content/uploads/2012/03/Uploader-mods.png" alt="" title="Uploader-mods" width="680" height="310" class="alignnone size-full wp-image-5051" /></a><br />
uploader的核心为base.js，而index.js为组件入口，会根据html中的伪属性配置实例化Uploader（即base.js的类），Button（上传按钮button/base.js或button/swfButton.js），Auth（上传验证auth.js），Theme（模板）等。<br />
来看当执行下面的js代码后都发生了什么。</p>
<pre class='brush: js; '>
        //加载上传组件入口文件
        KISSY.use('gallery/form/1.0/uploader/index', function (S, RenderUploader) {
            //第一个参数：按钮元素钩子，第二个参数：队列元素钩子
            new RenderUploader('#J_UploaderBtn', '#J_UploaderQueue');
        })
</pre>
<p><a href="http://www.36ria.com/5049/uploader%e5%ae%9e%e4%be%8b%e5%8c%96%e5%86%85%e9%83%a8%e6%89%a7%e8%a1%8c%e9%80%bb%e8%be%91" rel="attachment wp-att-5058"><img src="http://www.36ria.com/wp-content/uploads/2012/03/uploader实例化内部执行逻辑.png" alt="" title="uploader实例化内部执行逻辑" width="680" height="1400" class="alignnone size-full wp-image-5058" /></a><br />
哇喔，变态的复杂（uploader的另外二位作者紫英和飞绿心里一定骂过这设计太变态了-_-!）。</p>
<h4>为什么设计得这么复杂</h4>
<p>明河之前试过过不少异步文件上传组件，得出一个结论，组件的扩展性一般，扩展后组件无法很好的通用。<br />
所以在设计之初，明河喜欢KF内的uploader可以拥有强大的扩展性，最好第三方开发者可以自由定制属于自己的主题，并能够快速分享他的主题供其他开发者使用。<br />
（PS：uploader的主题跟其他组件的主题最大不同之初在于，不只是定制个css皮肤那么简单，你需要根据场景监听事件，操作DOM，并操作uploader的属性和方法，所以主题的设计更为复杂。）<br />
关于如何自定制一套uploader主题，紫英同学会发一篇教程。<br />
除了主题外，uploader还需要各种插件，比如图片预览、拖拽上传、进度条等一系列的类供第三方方便调用。<br />
更细的模块粒度，的确带来了设计复杂度，也给大家阅读源码和使用造成困难，但同时可维护性和可扩展性大增，明河权衡利弊，采用了现在的设计方式。<br />
我相信通过一系列的uploader的教程讲解，可以缓解大家对KF的uploader的困惑，欢迎大家向明河、紫英、飞绿提问，留言就好。</p>
<h4>关于上传方式</h4>
<p>目前支持三种上传方式：ajax、iframe、flash，通过type参数快速切换。<br />
（PS：如果type:”auto”，那么上传方式为ajax和iframe组合，组件自动根据浏览器选择上传方式。）<br />
这里明河简单提下三者的一些差异。</p>
<h5>ajax上传方案</h5>
<p>ajax上传目前有个蛋疼的bug，上传中文文件，文件名会乱码，目前明河正在想办法解决。</p>
<ul>
<li>支持进度条</li>
<li>支持文件大小控制</li>
<li>拥有完整的上传过程事件</li>
<li>支持拖拽上传</li>
</ul>
<p>第一选择方案！！！</p>
<h5>iframe</h5>
<p>各种蛋疼问题&#8230;明河就不一一罗列了，不得已的选择。应用于IE。-_-！</p>
<h5>flash</h5>
<p>需要额外引用swf文件，拥有一致的用户体验，除了不支持拖拽上传，拥有ajax上传方式的所有功能。</p>
<h4>关于主题</h4>
<p>目前会有五套主题：</p>
<ul>
<li>default：最简单的上传主题，不带图片预览，目前应用于淘宝退款系统</li>
<li>lineQueue：带图片预览和主图设置的上传主题，目前应用于淘宝闲置系统和淘宝拍卖系统</li>
<li>grayQueue：仿uploadify的主题</li>
<li>drag：带文件拖拽的主题，目前应用于淘宝内部上传图片系统</li>
<li>love：带图片预览的上传主题，应用于淘宝爱逛街</li>
</ul>
<p><a href="http://www.36ria.com/5049/uploader-2" rel="attachment wp-att-5067"><img src="http://www.36ria.com/wp-content/uploads/2012/03/uploader1.png" alt="" title="uploader" width="312" height="181" class="alignnone size-full wp-image-5067" /></a><br />
其他主题不一一截图，（drag和love目前还在制作中）。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.36ria.com/5049/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>start—KF/Uploader快速使用指南</title>
		<link>http://www.36ria.com/5041</link>
		<comments>http://www.36ria.com/5041#comments</comments>
		<pubDate>Sat, 03 Mar 2012 05:41:32 +0000</pubDate>
		<dc:creator>明河</dc:creator>
				<category><![CDATA[kissy]]></category>
		<category><![CDATA[uploader]]></category>
		<category><![CDATA[异步文件上传]]></category>

		<guid isPermaLink="false">http://www.36ria.com/?p=5041</guid>
		<description><![CDATA[组件档案 名称：Uploader，属于kissy-form（KF）子组件 版本：V1.2（请勿使用v1.0和v1.1） 用途：异步文件上传，支持ajax/iframe/flash三种方案的切换 基于：KISSY1.2.0，不支持KISSY1.1.6！ 作者：明河（剑平）、紫英、飞绿 源码地址：Gallery的form目录 demo地址：V1.2demo 文档：V1.2文档 教程列表 组件配置方式和关键配置 关键点说明 组件设计 核心类API调用（未完） 如何制作属于自己的主题（......]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.36ria.com/5041/uploader" rel="attachment wp-att-5045"><img src="http://www.36ria.com/wp-content/uploads/2012/03/uploader.png" alt="" title="uploader" width="680" height="200" class="alignnone size-full wp-image-5045" /></a></p>
<h4>组件档案</h4>
<ul>
<li>名称：<strong>Uploader</strong>，属于kissy-form（KF）子组件</li>
<li>版本：<strong>V1.2</strong>（请勿使用v1.0和v1.1）</li>
<li>用途：<strong>异步文件上传</strong>，支持ajax/iframe/flash三种方案的切换</li>
<li>基于：<strong>KISSY1.2.0</strong>，不支持KISSY1.1.6！</li>
<li>作者：明河（剑平）、紫英、飞绿</li>
<li>源码地址：<a href="https://github.com/kissyteam/kissy-gallery/tree/master/gallery/form/1.2">Gallery的form目录</a></li>
<li>demo地址：<a href="http://www.36ria.com/demo/gal/gallery/form/1.2/demo/form/uploader/index.html">V1.2demo</a></li>
<li>文档：<strong><a href="http://www.36ria.com/demo/gal/gallery/form/1.2/doc/index.html">V1.2文档</a></strong></li>
</ul>
<h5>教程列表</h5>
<ul>
<li><a href="http://www.36ria.com/5072" title="组件配置方式和关键配置—KF/Uploader快速使用指南" target="_blank">组件配置方式和关键配置</a></li>
<li><a href="http://www.36ria.com/5370" title="关键点说明—KF/Uploader快速使用指南" target="_blank">关键点说明</a></li>
<li><a href="http://www.36ria.com/5049" title="组件设计—KF/Uploader快速使用指南" target="_blank">组件设计</a></li>
<li><a href="http://www.36ria.com/5120" title="核心类API调用—KF/Uploader快速使用指南" target="_blank">核心类API调用</a>（未完）</li>
<li><a href="http://www.36ria.com/5137" title="如何制作属于自己的主题—KF/Uploader快速使用指南" target="_blank">如何制作属于自己的主题（上）</a></li>
<li><a href="http://www.36ria.com/5188" title="主题制作下—KF/Uploader快速使用指南" target="_blank">如何制作属于自己的主题（下）</a></li>
<li><a href="http://www.36ria.com/5214" title="KF/Uploader使用和设计PPT" target="_blank">KF/Uploader使用和设计PPT</a></li>
<li><a href="http://www.36ria.com/5337" title="KF/Uploader v1.2更新说明" target="_blank">KF/Uploader v1.2更新说明</a></li>
</ul>
<h4>关于KF（kissy-form）</h4>
<p><strong>KF</strong>是kissy的form相关的系列组件包，目前完成<strong>uploader</strong>、日后会更多的form组件发布，比如select、suggest、radio、checkbox、auth等。<br />
团队成员：<strong>明河（剑平）、紫英、张挺、牧云、易敛、飞绿、伯方</strong>。<br />
代码托管于<a href="https://github.com/kissyteam/kissy-gallery" target="_blank">KISSY Gallery</a>，代码会定期发布到淘宝的CDN上面，方便用户快速加载form模块。<br />
<img alt="" src="http://www.36ria.com/wp-content/uploads/2012/05/KF组件规划.png" class="alignnone" width="567" height="420" /></p>
<h4>关于Uploader</h4>
<p>网上已经有很多异步文件上传方案了，<a href="http://swfupload.org/" target="_blank">swfUpload</a>，<a href="http://www.uploadify.com/   " target="_blank">uploadify</a>等都是非常优秀的方案，为什么我们还需要花大力气写一个呢？</p>
<ul>
<li>flash方案太重了，希望有个全兼容多方案的异步上传组件；</li>
<li>不少上传组件非开源，有授权问题；</li>
<li>业务需求，这也是写uploader的初衷，这个组件的雏形来源于明河在退款系统中的上传凭证；</li>
<li>KISSY缺少好的uploader组件；</li>
<li>写一个能够快速切换主题的上传组件。（上传组件的定制性要求非常高）</li>
</ul>
<h4>Uploader的特性</h4>
<ul>
<li>支持ajax、flash、iframe三方案，兼容所有浏览器。</li>
<li>配置简单，支持伪属性配置（data-config=&#8217;{}&#8217;）和配置属性来配置</li>
<li>ajax和flash上传方式，带有上传进度显示</li>
<li>队列上传，批量上传等待中的文件</li>
<li>支持中途取消上传</li>
<li>支持上传验证，整合kissy的validation组件</li>
<li>不错的扩展性，自由定制按钮和队列模板样式</li>
</ul>
<h4>Uploader快速使用</h4>
<p>先来看个最简单的demo：<br />
<a style="float:none;" href="http://www.36ria.com/demo/gal/gallery/form/1.2/demo/form/uploader/quick-use.html" class="btn-view-demo" target="_blank">点此查看demo</a><br />
务必从服务器端启动demo，处理上传的服务器端脚本为upload.php（php的代码<a href="https://github.com/kissyteam/kissy-gallery/blob/master/gallery/form/1.2/demo/form/uploader/upload.php" target="_blank">请看这里</a>）。</p>
<h5>1、页面中引用kissy文件</h5>
<pre class='brush: xml; '>
<script src="http://a.tbcdn.cn/s/kissy/1.2.0/kissy.js" charset="utf-8"></script>
</pre>
<p>（实际应用，请引用kissy-min.js）</p>
<h5>2、创建一个上传按钮，写上Uploader组件配置</h5>
<p>配置写在<strong>data-config</strong>属性内，为一个json字符串，要特别小心json格式必须符合规范，不然解析时会报错。</p>
<pre class='brush: xml; '>
<!-- 上传按钮，组件配置请写在data-config内 -->
<a id="J_UploaderBtn" class="uploader-button" data-config="{"type" : "auto",
        "serverConfig":{"action":"upload.php","data":{"dir":"files/"},"dataType" : "json"},
        "name":"Filedata",
        "urlsInputName":"fileUrls"}" href="#">
    选择要上传的文件
</a>
</pre>
<ul>
<li><del datetime="2012-05-09T01:37:59+00:00"><b>type</b>：上传方式，当为auto时，组件会根据浏览器选择使用ajax还是iframe</del></li>
<li><code>serverConfig</code>：服务器端配置，包括最重要的action（路径）配置</li>
<li><code>name</code>：文件上传域name名</li>
<li><code>urlsInputName</code>：用于存放服务器端返回的文件路径的input</li>
</ul>
<p>V1.2起不再推荐手动配置<code>type</code>属性，IE降级处理优先使用flash方式（v1.2前IE使用iframe，存在各种蛋疼的兼容性问题。）。</p>
<p>如果你希望兼容旧的处理方式（IE下使用iframe），请配置<code>“type” : ["ajax","iframe"]</code>。</p>
<h5>3、创建一个队列容器</h5>
<pre class='brush: xml; '>
        <!-- 文件上传队列 -->
<ul id="J_UploaderQueue"></ul>
</pre>
<p>（ps：队列容器主要用于主题中显示文件信息，不是必须的，有些uploader就不需要文件信息队列显示方式。）</p>
<h5>4、配置下组件包引用路径</h5>
<pre class='brush: js; '>
KISSY.config({
           packages:[ {
               name:"gallery",
               path:"http://a.tbcdn.cn/s/kissy/",
               charset:"utf-8"
           } ]
    });
</pre>
<p> 对上述配置不清楚的朋友，可以看<a href="http://docs.kissyui.com/docs/html/api/seed/loader/add.ver1.2.html" target="_blank">loader模块</a>。</p>
<p><strong>特别留意：</strong>cdn上的文件是打包后的，如果你想要看源码状态的，请配置包到本地路径，比如：</p>
<pre class='brush: js; '>
KISSY.config({
           packages:[ {
               name:"gallery",
               path:"../../../../../../",
               charset:"utf-8"
           } ]
    });
</pre>
<p><strong>charset（编码）必须是utf-8。</strong></p>
<h5>5、初始化组件</h5>
<pre class='brush: js; '>
       //加载上传组件入口文件
        KISSY.use('gallery/form/1.2/uploader/index', function (S, RenderUploader) {
            //第一个参数：按钮元素钩子，第二个参数：队列元素钩子
            new RenderUploader('#J_UploaderBtn', '#J_UploaderQueue');
        })
</pre>
<p><code>gallery/form/1.2/uploader/index</code>是组件的入口js，上传组件的核心模块为<code>gallery/form/1.0/uploader/base</code>。</p>
<p>现在打开浏览器看看！</p>
]]></content:encoded>
			<wfw:commentRss>http://www.36ria.com/5041/feed</wfw:commentRss>
		<slash:comments>17</slash:comments>
		</item>
		<item>
		<title>让css动起来—-lesscss（2）</title>
		<link>http://www.36ria.com/5011</link>
		<comments>http://www.36ria.com/5011#comments</comments>
		<pubDate>Sun, 26 Feb 2012 09:10:26 +0000</pubDate>
		<dc:creator>苏河</dc:creator>
				<category><![CDATA[css]]></category>
		<category><![CDATA[前端]]></category>

		<guid isPermaLink="false">http://www.36ria.com/?p=5011</guid>
		<description><![CDATA[话说上次谈及lesscss的时候是去年11月份，传送门在这里，上次介绍了lesscss的大部分应用和属性，随着2011年下半年lesscss中文官网的出现，我觉得再多的介绍lesscss的使用已经没什么必要了，这部分的文章苏河主要给大家介绍下lesscss在项目中的应用。 下面是去年的一个项目部分使用lesscss的例子，lesscss我只做了部分尝试，就lesscss本身来说，它比较适合重用性比较高的代码（个人......]]></description>
			<content:encoded><![CDATA[<p>话说上次谈及lesscss的时候是去年11月份，传送门在<a href="http://www.36ria.com/4648" title="lesscss" target="_blank">这里</a>，上次介绍了lesscss的大部分应用和属性，随着2011年下半年<a href="http://www.lesscss.net/" title="lesscss" target="_blank">lesscss中文官网</a>的出现，我觉得再多的介绍lesscss的使用已经没什么必要了，这部分的文章苏河主要给大家介绍下lesscss在项目中的应用。</p>
<p>下面是去年的一个项目部分使用lesscss的例子，lesscss我只做了部分尝试，就lesscss本身来说，它比较适合重用性比较高的代码（个人理解），如果是换肤的功能，我想lesscss再合适不过了。当然也有很多工程师喜欢lesscss的这种代码风格，如果它能够少了编译的这层环节，那么我认为不管是它的可维护性和可扩展性，易读性都会是大家选择它的原因。</p>
<p><a href="http://www.36ria.com/5011/lesscss1" rel="attachment wp-att-5014"><img src="http://www.36ria.com/wp-content/uploads/2012/02/lesscss1.jpg" alt="" title="lesscss1" width="183" height="230" class="aligncenter size-full wp-image-5014" /></a></p>
<p>上面是我的项目目录，之所以选择base作为试点是一来是因为base包含皮肤样式，字体样式，它是个重用性很高的地方，而其他模块则可以采取import的方式来引用base库，二来是因为base库不管是对现在的项目或者是以后的类似的拓展项目都有很高的重用性和扩展性。</p>
<h2>首先是libs.less，大致介绍下的代码组成部分</h2>
<h3>常量</h3>
<p>通常常量是定义的网页的基本全局的变量，比如字体颜色、背景颜色、超链接颜色等等，为了保证各个模块的一致性，我们定义常量来统一管理一张网页的基本设定，试想，如果有其他市场需要使用我们的样式，它们希望的只是皮肤的更改，那么我们只需要修改libs里面的常量就能达到牵一发动全身的效果了。</p>
<div class="hl-surround"><ol class="hl-main ln-show" title="Double click to hide line number." ondblclick = "linenumber(this)"><li class="hl-firstline"><span style="color: Gray;">//</span><span style="color: Blue;">constants</span></li>
<li><span style="color: Gray;">/</span><span style="color: Blue;">*font*</span><span style="color: Gray;">/</span></li>
<li><span style="color: #00008b;">@red</span><span style="color: Gray;">-</span><span style="color: Blue;">font</span><span style="color: Gray;">:</span><span style="color: Blue;">#cc0000</span><span style="color: Gray;">;</span></li>
<li><span style="color: #00008b;">@blue</span><span style="color: Gray;">-</span><span style="color: Blue;">font</span><span style="color: Gray;">:#1</span><span style="color: Blue;">ac5e1</span><span style="color: Gray;">;</span></li>
<li><span style="color: #00008b;">@normal</span><span style="color: Gray;">-</span><span style="color: Blue;">font</span><span style="color: Gray;">:#333;</span></li>
<li><span style="color: #00008b;">@gray</span><span style="color: Gray;">-</span><span style="color: Blue;">font</span><span style="color: Gray;">:#666;</span></li>
<li><span style="color: #00008b;">@light</span><span style="color: Gray;">-</span><span style="color: Blue;">font</span><span style="color: Gray;">:</span><span style="color: Blue;">#b0b0b0</span><span style="color: Gray;">;</span></li>
<li><span style="color: #00008b;">@white</span><span style="color: Gray;">:</span><span style="color: Blue;">#fff</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">/</span><span style="color: Blue;">*background-color*</span><span style="color: Gray;">/</span></li>
<li><span style="color: #00008b;">@blue</span><span style="color: Gray;">-</span><span style="color: Blue;">back</span><span style="color: Gray;">:#1</span><span style="color: Blue;">AC5E1</span><span style="color: Gray;">;</span></li>
<li><span style="color: #00008b;">@red</span><span style="color: Gray;">-</span><span style="color: Blue;">back</span><span style="color: Gray;">:</span><span style="color: Blue;">#E40007</span><span style="color: Gray;">;</span></li>
<li><span style="color: #00008b;">@body</span><span style="color: Gray;">-</span><span style="color: Blue;">back</span><span style="color: Gray;">:</span><span style="color: Blue;">#fdf4e9</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp;</span></li>
<li><span style="color: Gray;">/</span><span style="color: Blue;">*width*</span><span style="color: Gray;">/</span></li>
<li><span style="color: #00008b;">@page</span><span style="color: Gray;">-</span><span style="color: Blue;">width</span><span style="color: Gray;">:990</span><span style="color: Blue;">px</span><span style="color: Gray;">;</span></li></ol></div>
<h3>混合</h3>
<p>在 LESS 中我们可以定义一些通用的属性集为一个class，然后在另一个class中去调用这些属性，这里我们用yui3的布局方式尝试</p>
<div class="hl-surround"><ol class="hl-main ln-show" title="Double click to hide line number." ondblclick = "linenumber(this)"><li class="hl-firstline"><span style="color: Gray;">/</span><span style="color: Blue;">*</span><span style="color: Gray;"> </span><span style="color: Blue;">YUI3</span><span style="color: Gray;"> </span><span style="color: Blue;">inline-block*</span><span style="color: Gray;">/</span></li>
<li><span style="color: Blue;">.inline-block</span><span style="color: Gray;">()</span><span style="color: Olive;">{</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Green;">display:</span><span style="color: Red;">inline-block</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Green;">vertical-align:</span><span style="color: Red;">top</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Blue;">*</span><span style="color: Green;">display:</span><span style="color: Red;">inline</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Blue;">*</span><span style="color: Green;">zoom:</span><span style="color: Maroon;">1</span><span style="color: Gray;">;</span></li>
<li><span style="color: Olive;">}</span></li>
<li><span style="color: Blue;">.grid-container</span><span style="color: Gray;">()</span><span style="color: Olive;">{</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Green;">letter-spacing:</span><span style="color: Gray;">-</span><span style="color: Maroon;">0.31</span><span style="color: Red;">em</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Blue;">*</span><span style="color: Green;">letter-spacing:</span><span style="color: Red;">normal</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Green;">word-spacing:</span><span style="color: Gray;">-</span><span style="color: Maroon;">0.43</span><span style="color: Red;">em</span><span style="color: Gray;">;</span></li>
<li><span style="color: Olive;">}</span></li>
<li><span style="color: Blue;">.grid-unit</span><span style="color: Gray;">()</span><span style="color: Olive;">{</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Green;">letter-spacing:</span><span style="color: Gray;">noraml</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Green;">word-spacing:</span><span style="color: Gray;">noraml</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Blue;">.inline-block</span><span style="color: Gray;">();</span></li>
<li><span style="color: Olive;">}</span></li></ol></div>
<h3>函数</h3>
<p>我们定义一些公用的函数，然后在其他需要调用的地方使用这些函数，这里定义的函数比较多，具体说明可以直接看代码</p>
<div class="hl-surround"><ol class="hl-main ln-show" title="Double click to hide line number." ondblclick = "linenumber(this)"><li class="hl-firstline"><span style="color: Gray;">/</span><span style="color: Blue;">*reset</span><span style="color: Gray;"> </span><span style="color: Blue;">css*</span><span style="color: Gray;">/</span></li>
<li><span style="color: Blue;">.reset</span><span style="color: Gray;">()</span><span style="color: Olive;">{</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Green;">margin:</span><span style="color: Maroon;">0</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Green;">padding:</span><span style="color: Maroon;">0</span><span style="color: Gray;">;</span></li>
<li><span style="color: Olive;">}</span></li>
<li><span style="color: Gray;">&nbsp;</span></li>
<li><span style="color: Gray;">/</span><span style="color: Blue;">*wrap*</span><span style="color: Gray;">/</span></li>
<li><span style="color: Gray;">//文字函数</span></li>
<li><span style="color: Blue;">.wrap</span><span style="color: Gray;"> () </span><span style="color: Olive;">{</span></li>
<li><span style="color: Gray;">&nbsp; </span><span style="color: Green;">text-wrap:</span><span style="color: Gray;"> wrap</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp; </span><span style="color: Green;">white-space:</span><span style="color: Gray;"> pre-wrap</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp; </span><span style="color: Green;">white-space:</span><span style="color: Gray;"> -moz-pre-wrap</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp; </span><span style="color: Green;">word-wrap:</span><span style="color: Gray;">&nbsp;</span><span style="color: Red;">break-word</span><span style="color: Gray;">;</span></li>
<li><span style="color: Olive;">}</span></li>
<li><span style="color: Gray;">/</span><span style="color: Blue;">*float*</span><span style="color: Gray;">/</span></li>
<li><span style="color: Gray;">//浮动函数</span></li>
<li><span style="color: Blue;">.left</span><span style="color: Gray;">()</span><span style="color: Olive;">{</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Green;">float:</span><span style="color: Red;">left</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Blue;">*</span><span style="color: Green;">display:</span><span style="color: Red;">inline</span><span style="color: Gray;">;</span></li>
<li><span style="color: Olive;">}</span></li>
<li><span style="color: Blue;">.right</span><span style="color: Gray;">()</span><span style="color: Olive;">{</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Green;">float:</span><span style="color: Red;">right</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Blue;">*</span><span style="color: Green;">display:</span><span style="color: Red;">inline</span><span style="color: Gray;">;</span></li>
<li><span style="color: Olive;">}</span></li>
<li><span style="color: Blue;">.clear</span><span style="color: Gray;">()</span><span style="color: Olive;">{</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Blue;">*</span><span style="color: Green;">zoom :</span><span style="color: Gray;">&nbsp;</span><span style="color: Maroon;">1</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &amp;:</span><span style="color: Blue;">after</span><span style="color: Olive;">{</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Green;">content:</span><span style="color: Gray;"> '\</span><span style="color: Maroon;">0020</span><span style="color: Gray;">'</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Green;">display:</span><span style="color: Gray;">&nbsp;</span><span style="color: Red;">block</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Green;">height:</span><span style="color: Gray;">&nbsp;</span><span style="color: Maroon;">0</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Green;">clear:</span><span style="color: Gray;">&nbsp;</span><span style="color: Red;">both</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Olive;">}</span></li>
<li><span style="color: Olive;">}</span></li>
<li><span style="color: Gray;">&nbsp;</span></li>
<li><span style="color: Gray;">/</span><span style="color: Blue;">*img</span><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">vertical*</span><span style="color: Gray;">/</span></li>
<li><span style="color: Gray;">//图片居中函数，接受图片尺寸</span></li>
<li><span style="color: Gray;">//@注：本人非常喜欢这种风格的代码，闭包的形式让样式思路非常清晰，作用域的思路让代码更容易维护</span></li>
<li><span style="color: Blue;">.pic</span><span style="color: Gray;">(</span><span style="color: #00008b;">@size</span><span style="color: Gray;">:30</span><span style="color: Blue;">px</span><span style="color: Gray;">)</span><span style="color: Olive;">{</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Green;">overflow:</span><span style="color: Gray;">&nbsp;</span><span style="color: Red;">hidden</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Green;">width:</span><span style="color: Gray;">@size</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Green;">height:</span><span style="color: Gray;">@size</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Blue;">a</span><span style="color: Olive;">{</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Green;">display:</span><span style="color: Gray;">&nbsp;</span><span style="color: Red;">table-cell</span><span style="color: Gray;">; /</span><span style="color: Blue;">*</span><span style="color: Gray;">主流浏览器</span><span style="color: Blue;">*</span><span style="color: Gray;">/</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Green;">vertical-align:</span><span style="color: Gray;">&nbsp;</span><span style="color: Red;">middle</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Green;">text-align:</span><span style="color: Gray;">&nbsp;</span><span style="color: Red;">center</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; /</span><span style="color: Blue;">*</span><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">IE6</span><span style="color: Gray;">,7 </span><span style="color: Blue;">hack</span><span style="color: Gray;"> </span><span style="color: Blue;">*</span><span style="color: Gray;">/</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Blue;">*</span><span style="color: Green;">display:</span><span style="color: Gray;">&nbsp;</span><span style="color: Red;">block</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Blue;">*</span><span style="color: Green;">font-family:</span><span style="color: Gray;"> Arial</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Blue;">*</span><span style="color: Green;">line-height:</span><span style="color: Gray;">&nbsp;</span><span style="color: Maroon;">0</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Green;">width:</span><span style="color: Gray;">@size</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Green;">height:</span><span style="color: Gray;">@size</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Blue;">*</span><span style="color: Green;">font-size:</span><span style="color: Gray;">@size*</span><span style="color: Maroon;">0.873</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Blue;">img</span><span style="color: Olive;">{</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Green;">vertical-align:</span><span style="color: Gray;">&nbsp;</span><span style="color: Red;">middle</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Olive;">}</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Olive;">}</span></li>
<li><span style="color: Olive;">}</span></li>
<li><span style="color: Gray;">&nbsp;</span></li>
<li><span style="color: Gray;">/</span><span style="color: Blue;">*border-radius</span><span style="color: Gray;"> note: </span><span style="color: Blue;">default</span><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">value</span><span style="color: Gray;">:3</span><span style="color: Blue;">px*</span><span style="color: Gray;">/</span></li>
<li><span style="color: Gray;">//圆角函数,低版本浏览器采用</span><span style="color: Blue;">IE-CSS3</span></li>
<li><span style="color: Blue;">.border-radius</span><span style="color: Gray;"> (</span><span style="color: #00008b;">@radius</span><span style="color: Gray;">:3</span><span style="color: Blue;">px</span><span style="color: Gray;">) </span><span style="color: Olive;">{</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Green;">border-radius:</span><span style="color: Gray;"> @radius</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; -</span><span style="color: Green;">moz-border-radius:</span><span style="color: Gray;"> @radius</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; -</span><span style="color: Green;">webkit-border-radius:</span><span style="color: Gray;"> @radius</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; //</span><span style="color: Blue;">IE</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Green;">behavior:</span><span style="color: Gray;"> url(ie-css3.htc)</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Green;">zoom:</span><span style="color: Maroon;">1</span><span style="color: Gray;">;</span></li>
<li><span style="color: Olive;">}</span></li>
<li><span style="color: Gray;">&nbsp;</span></li>
<li><span style="color: Gray;">/</span><span style="color: Blue;">*gradient*</span><span style="color: Gray;">/</span></li>
<li><span style="color: Gray;">//阴影函数，接受两个参数，初始颜色和结束颜色</span></li>
<li><span style="color: Blue;">.gradient</span><span style="color: Gray;">(</span><span style="color: #00008b;">@fromcolor</span><span style="color: Gray;">:#000,</span><span style="color: #00008b;">@tocolor</span><span style="color: Gray;">:</span><span style="color: Blue;">#fff</span><span style="color: Gray;">)</span><span style="color: Olive;">{</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Green;">background:</span><span style="color: Gray;"> -webkit-gradient(linear, </span><span style="color: Maroon;">0</span><span style="color: Gray;">&nbsp;</span><span style="color: Maroon;">0</span><span style="color: Gray;">, </span><span style="color: Maroon;">0</span><span style="color: Gray;"> </span><span style="color: Maroon;">100</span><span style="color: Red;">%</span><span style="color: Gray;">, from(@fromcolor), to(@tocolor))</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Green;">background:</span><span style="color: Gray;"> -moz-linear-gradient(</span><span style="color: Red;">top</span><span style="color: Gray;">, @fromcolor, @tocolor)</span><span style="color: Gray;">;</span></li>
<li><span style="color: Olive;">}</span></li></ol></div>
<h2>接下来是关于libs.less的引用，具体体现在base.less</h2>
<h3>base.less主要是base库的主要部分，它负责生成一些公用的样式供其他业务模块使用，通过引用libs.less来生成自己希望得到的样式</h3>
<div class="hl-surround"><ol class="hl-main ln-show" title="Double click to hide line number." ondblclick = "linenumber(this)"><li class="hl-firstline"><span style="color: #00008b;">@import</span><span style="color: Gray;"> '</span><span style="color: Blue;">libs.less</span><span style="color: Gray;">';</span></li>
<li><span style="color: Gray;">&nbsp;</span></li>
<li><span style="color: Gray;">/</span><span style="color: Blue;">*</span><span style="color: Gray;">-------------------------------------------------------------------------------</span></li>
<li><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">*</span><span style="color: Gray;"> Author:&nbsp; &nbsp; &nbsp; </span><span style="color: Blue;">suhe</span><span style="color: Gray;"> &lt;</span><span style="color: Blue;">suhe.ly</span><span style="color: #00008b;">@taobao</span><span style="color: Blue;">.com</span><span style="color: Gray;">&gt;</span></li>
<li><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">*</span><span style="color: Gray;"> Desc: </span><span style="color: Blue;">Less</span><span style="color: Gray;">版本的</span><span style="color: Blue;">base</span></li>
<li><span style="color: Gray;"> -----------------------------------------------------------------------------</span><span style="color: Blue;">*</span><span style="color: Gray;">/</span></li>
<li><span style="color: Gray;">&nbsp;</span></li>
<li><span style="color: Gray;">/</span><span style="color: Blue;">*</span><span style="color: Gray;">-----=Reset: -----------------------------------------------</span><span style="color: Olive;">{{{</span><span style="color: Gray;">1</span><span style="color: Blue;">*</span><span style="color: Gray;">/</span></li>
<li><span style="color: Gray;">&nbsp;</span></li>
<li><span style="color: Blue;">html</span><span style="color: Olive;">{</span><span style="color: Gray;">&nbsp;</span><span style="color: Green;">overflow-y:</span><span style="color: Red;">scroll</span><span style="color: Gray;">;</span><span style="color: Olive;">}</span></li>
<li><span style="color: Gray;">//常量使用</span></li>
<li><span style="color: Blue;">body</span><span style="color: Olive;">{</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Green;">background-color:</span><span style="color: Gray;"> @body-back</span><span style="color: Gray;">;</span></li>
<li><span style="color: Olive;">}</span></li>
<li><span style="color: Gray;">//</span><span style="color: Blue;">libs</span><span style="color: Gray;">函数的调用</span></li>
<li><span style="color: Blue;">pre</span><span style="color: Gray;">&nbsp;</span><span style="color: Olive;">{</span><span style="color: Gray;"> </span><span style="color: Blue;">.wrap</span><span style="color: Gray;"> </span><span style="color: Olive;">}</span></li>
<li><span style="color: Gray;">&nbsp;</span></li>
<li><span style="color: Blue;">ul</span><span style="color: Gray;">,</span><span style="color: Blue;">li</span><span style="color: Olive;">{</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Blue;">.reset</span><span style="color: Gray;">;</span></li>
<li><span style="color: Olive;">}</span></li>
<li><span style="color: Gray;">&nbsp;</span></li>
<li><span style="color: Gray;">/</span><span style="color: Blue;">*</span><span style="color: Gray;">--------------------------------------------------------</span><span style="color: Blue;">END-</span><span style="color: Olive;">}}}</span><span style="color: Gray;">1</span><span style="color: Blue;">*</span><span style="color: Gray;">/</span></li>
<li><span style="color: Gray;">&nbsp;</span></li>
<li><span style="color: Gray;">/</span><span style="color: Blue;">*</span><span style="color: Gray;">-----=</span><span style="color: Blue;">Common</span><span style="color: Gray;"> Class:&nbsp; -----------------------------------------</span><span style="color: Olive;">{{{</span><span style="color: Gray;">1</span><span style="color: Blue;">*</span><span style="color: Gray;">/</span></li>
<li><span style="color: Gray;">//作用域和函数的结合使用</span></li>
<li><span style="color: Blue;">.grid</span><span style="color: Olive;">{</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Blue;">.grid-container</span><span style="color: Gray;">();</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Blue;">.g-u</span><span style="color: Olive;">{</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Blue;">.grid-unit</span><span style="color: Gray;">();</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Olive;">}</span></li>
<li><span style="color: Olive;">}</span></li>
<li><span style="color: Gray;">&nbsp;</span></li>
<li><span style="color: Blue;">.floatleft</span><span style="color: Gray;">&nbsp;</span><span style="color: Olive;">{</span><span style="color: Gray;"> </span><span style="color: Blue;">.left</span><span style="color: Gray;">() </span><span style="color: Olive;">}</span></li>
<li><span style="color: Gray;">&nbsp;</span></li>
<li><span style="color: Blue;">.floatright</span><span style="color: Gray;">&nbsp;</span><span style="color: Olive;">{</span><span style="color: Gray;"> </span><span style="color: Blue;">.right</span><span style="color: Gray;">() </span><span style="color: Olive;">}</span></li>
<li><span style="color: Gray;">&nbsp;</span></li>
<li><span style="color: Blue;">.clearfix</span><span style="color: Gray;">&nbsp;</span><span style="color: Olive;">{</span><span style="color: Gray;"> </span><span style="color: Blue;">.clear</span><span style="color: Gray;">() </span><span style="color: Olive;">}</span></li>
<li><span style="color: Gray;">&nbsp;</span></li>
<li><span style="color: Gray;">&nbsp;</span></li>
<li><span style="color: Gray;">/</span><span style="color: Blue;">*</span><span style="color: Gray;">-----=图片居中---------------------------------</span><span style="color: Olive;">{{{</span><span style="color: Gray;">2</span><span style="color: Blue;">*</span><span style="color: Gray;">/</span></li>
<li><span style="color: Gray;">//函数多次调用体现</span><span style="color: Blue;">less</span><span style="color: Gray;">的重用性</span></li>
<li><span style="color: Blue;">.s30</span><span style="color: Olive;">{</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Blue;">.pic</span><span style="color: Gray;">(30</span><span style="color: Blue;">px</span><span style="color: Gray;">);</span></li>
<li><span style="color: Olive;">}</span></li>
<li><span style="color: Blue;">.s60</span><span style="color: Olive;">{</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Blue;">.pic</span><span style="color: Gray;">(60</span><span style="color: Blue;">px</span><span style="color: Gray;">);</span></li>
<li><span style="color: Olive;">}</span></li>
<li><span style="color: Blue;">.s80</span><span style="color: Olive;">{</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Blue;">.pic</span><span style="color: Gray;">(80</span><span style="color: Blue;">px</span><span style="color: Gray;">);</span></li>
<li><span style="color: Olive;">}</span></li>
<li><span style="color: Gray;">&nbsp;</span></li>
<li><span style="color: Gray;">/</span><span style="color: Blue;">*</span><span style="color: Gray;">-----=图片居中---------------------------------</span><span style="color: Olive;">{{{</span><span style="color: Gray;">2</span><span style="color: Blue;">*</span><span style="color: Gray;">/</span></li>
<li><span style="color: Gray;">&nbsp;</span></li>
<li><span style="color: Gray;">&nbsp;</span></li>
<li><span style="color: Gray;">/</span><span style="color: Blue;">*</span><span style="color: Gray;">----------------------------------------------</span><span style="color: Blue;">END-</span><span style="color: Olive;">}}}</span><span style="color: Gray;">2</span><span style="color: Blue;">*</span><span style="color: Gray;">/</span></li>
<li><span style="color: Gray;">&nbsp;</span></li>
<li><span style="color: Gray;">/</span><span style="color: Blue;">*</span><span style="color: Gray;">--------------------------------------------------------</span><span style="color: Blue;">END-</span><span style="color: Olive;">}}}</span><span style="color: Gray;">1</span><span style="color: Blue;">*</span><span style="color: Gray;">/</span></li>
<li><span style="color: Gray;">//常量的使用</span></li>
<li><span style="color: Blue;">#content</span><span style="color: Olive;">{</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Green;">width:</span><span style="color: Gray;">@page-width</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Green;">margin:</span><span style="color: Maroon;">0</span><span style="color: Gray;">&nbsp;</span><span style="color: Red;">auto</span><span style="color: Gray;">;</span></li>
<li><span style="color: Olive;">}</span></li></ol></div>
<p>以上介绍两个模块作为lesscss的初步尝试，至于其他的业务模块的尝试也同base差不多，所以不多做介绍。</p>
<h2>结束语</h2>
<p>我觉得有必要补充一点，就是关于lesscss的服务器环境配置，随着现在node在windows平台的完善，个人觉得lesscss的使用简单了许多，笔者曾经采用的是.NET的编译环境，现在也将环境随之迁移至node。当然，题外话，如果将less编译的工作放在部署机器，而客户端只需要引入less.js来验证效果，部署机器做filter工作过滤lesscss.js然后做替换，这样的方案会比较完美些。</p>
<p>现在IDEA11已经有了less的插件支持，这个非常赞，相信在node环境下做个多模块一键编译的工具不会太难，这样一来，less的很多瓶颈得到了解决，相信less在不久的将来会有越来越大的用户群。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.36ria.com/5011/feed</wfw:commentRss>
		<slash:comments>12</slash:comments>
		</item>
		<item>
		<title>项目build实战—ant入门指南9</title>
		<link>http://www.36ria.com/5003</link>
		<comments>http://www.36ria.com/5003#comments</comments>
		<pubDate>Mon, 20 Feb 2012 13:12:18 +0000</pubDate>
		<dc:creator>明河</dc:creator>
				<category><![CDATA[前端开发工具]]></category>
		<category><![CDATA[ant]]></category>
		<category><![CDATA[ant入门指南]]></category>

		<guid isPermaLink="false">http://www.36ria.com/?p=5003</guid>
		<description><![CDATA[前面8篇ant教程，基本上没有太复杂的地方，在实际项目build中会遇到些复杂的场景。今天这篇教程，明河将通过一个真实的项目build过程，来综合演练下ant的用法，同时演示下如何处理ant中的循环任务。 项目简介 项目名：KF(KISSY-FORM) 用途：kissy的form组件包 源码地址：https://github.com/minghe/kissy-form KF目前还在开发阶段，完成的组件只有Uploader（异步文件上传），日后会发布更多的......]]></description>
			<content:encoded><![CDATA[<p>前面8篇ant教程，基本上没有太复杂的地方，在实际项目build中会遇到些复杂的场景。今天这篇教程，明河将通过一个真实的项目build过程，来综合演练下ant的用法，同时演示下如何处理ant中的循环任务。</p>
<h4>项目简介</h4>
<p>项目名：KF(KISSY-FORM)<br />
用途：kissy的form组件包<br />
源码地址：<a href="https://github.com/minghe/kissy-form" title="kissy-form" target="_blank">https://github.com/minghe/kissy-form</a><br />
KF目前还在开发阶段，完成的组件只有Uploader（异步文件上传），日后会发布更多的form组件，有兴趣的朋友可以关注下。<br />
Uploader场景足够复杂，足以覆盖ant的大部分常用用法，请先下载KF源码到本地，找到Uploader的build.xml文件（form/src/uploader/build.xml）。</p>
<h4>build目标</h4>
<p>build（构建后的打包发布文件）必须和src（源码目录）目录结构保持一致。</p>
<ul>
<li>合并src下的所有js为render-pkg.js（排除themes、demo、auth、tests目录下的文件）</li>
<li>将render-pkg.js移动到build目录下，并改名为render.js</li>
<li>copy一份themes目录到build/form/uploader</li>
<li>遍历themes下的每个目录，将子目录下的所有js合并成index-pkg.js</li>
<li>删除除了index-pkg.js外的所有js文件</li>
<li>将index-pkg.js改名为index.js</li>
<li>压缩build目录下的所有js文件</li>
<li>copy一份uploader.swf文件到build目录下</li>
</ul>
<p>任务是不是很多,也许你会觉得明河搞得这么复杂很蛋疼，实际上这些任务跟明河实际要实现的构建目标有关，不是本文重点，这里不讨论。<br />
接下来来看明河是如何实现这些目标的。<br />
由于需要用到第三方类库ant-contrib-1.0b3.jar，请先下载该文件到你的ant/lib目录下。<br />
<a href="http://www.36ria.com/wp-content/plugins/download-monitor/download.php?id=226" title="名称：ant-contrib，下载次数：30，文件大小：219.02 kB" class="btn-download">点此下载</a></p>
<h4>ant实战</h4>
<h5>合并src下的所有js为render-pkg.js（排除themes、demo、auth、tests目录下的文件）<br />
<h5>
<div class="hl-surround"><ol class="hl-main ln-show" title="Double click to hide line number." ondblclick = "linenumber(this)"><li class="hl-firstline"><span style="color: Olive;">&lt;</span><span style="color: Green;">target</span><span style="color: Gray;"> </span><span style="color: #00008b;">name</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">concat</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">&gt;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Olive;">&lt;</span><span style="color: Green;">concat</span><span style="color: Gray;">&nbsp;</span><span style="color: #00008b;">destfile</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">render-pkg.js</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;"> </span><span style="color: #00008b;">encoding</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">${charset}</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;"> </span><span style="color: #00008b;">outputencoding</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">${charset}</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">&gt;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Olive;">&lt;</span><span style="color: Green;">fileset</span><span style="color: Gray;">&nbsp;</span><span style="color: #00008b;">dir</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">${src.dir}</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;"> </span><span style="color: #00008b;">includes</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">**/*.js</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;"> </span><span style="color: #00008b;">excludes</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">tests/*.js,demo/**/*.js,auth/*.js,themes/**/*.js</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">/&gt;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Olive;">&lt;</span><span style="color: Green;">filterchain</span><span style="color: Olive;">&gt;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Olive;">&lt;</span><span style="color: Green;">deletecharacters</span><span style="color: Gray;">&nbsp;</span><span style="color: #00008b;">chars</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">&amp;#xFEFF;</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">/&gt;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Olive;">&lt;/</span><span style="color: Green;">filterchain</span><span style="color: Olive;">&gt;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Olive;">&lt;/</span><span style="color: Green;">concat</span><span style="color: Olive;">&gt;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Olive;">&lt;/</span><span style="color: Green;">target</span><span style="color: Olive;">&gt;</span></li></ol></div>
<p>关于concat的用法可以看<a href="http://www.36ria.com/4442" title="认识基础任务标签（上）—ant入门指南（3）" target="_blank">《认识基础任务标签（上）—ant入门指南（3）》</a>。</p>
<h5>将render-pkg.js移动到build目录下，并改名为render.js</h5>
<div class="hl-surround"><ol class="hl-main ln-show" title="Double click to hide line number." ondblclick = "linenumber(this)"><li class="hl-firstline"><span style="color: #ffa500;">&lt;!--移动合并后源文件到build目录下--&gt;</span></li>
<li><span style="color: Olive;">&lt;</span><span style="color: Green;">target</span><span style="color: Gray;">&nbsp;</span><span style="color: #00008b;">name</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">move</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">&gt;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Olive;">&lt;</span><span style="color: Green;">move</span><span style="color: Gray;">&nbsp;</span><span style="color: #00008b;">file</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">render-pkg.js</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;"> </span><span style="color: #00008b;">tofile</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">${uploader.build.dir}/render.js</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">/&gt;</span></li>
<li><span style="color: Olive;">&lt;/</span><span style="color: Green;">target</span><span style="color: Olive;">&gt;</span></li></ol></div>
<p>改名操作不一定要用rename标签，使用move标签也可以间接实现。</p>
<h5>copy一份themes目录到build/form/uploader，并删除目录下的html文件</h5>
<div class="hl-surround"><ol class="hl-main ln-show" title="Double click to hide line number." ondblclick = "linenumber(this)"><li class="hl-firstline"><span style="color: #ffa500;">&lt;!--移动模板的源码文件到build目录下--&gt;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Olive;">&lt;</span><span style="color: Green;">target</span><span style="color: Gray;">&nbsp;</span><span style="color: #00008b;">name</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">move-theme</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">&gt;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Olive;">&lt;</span><span style="color: Green;">copy</span><span style="color: Gray;">&nbsp;</span><span style="color: #00008b;">todir</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">${uploader.build.dir}/themes</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;"> </span><span style="color: #00008b;">overwrite</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">true</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">&gt;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Olive;">&lt;</span><span style="color: Green;">fileset</span><span style="color: Gray;">&nbsp;</span><span style="color: #00008b;">dir</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">${src.dir}/themes</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">/&gt;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Olive;">&lt;/</span><span style="color: Green;">copy</span><span style="color: Olive;">&gt;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Olive;">&lt;</span><span style="color: Green;">delete</span><span style="color: Olive;">&gt;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Olive;">&lt;</span><span style="color: Green;">fileset</span><span style="color: Gray;">&nbsp;</span><span style="color: #00008b;">dir</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">${uploader.build.dir}/themes</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;"> </span><span style="color: #00008b;">includes</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">**/*.html</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">/&gt;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Olive;">&lt;/</span><span style="color: Green;">delete</span><span style="color: Olive;">&gt;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Olive;">&lt;/</span><span style="color: Green;">target</span><span style="color: Olive;">&gt;</span></li></ol></div>
<p>这部分的目标也非常简单，使用copy和delete即可实现。</p>
<h5>遍历themes下的每个目录，将子目录下的所有js合并成index-pkg.js。删除除了index-pkg.js外的所有js文件。>将index-pkg.js改名为index.js</h5>
<p>好，进入本文的重点内容，这个任务目标有个难点，就是如何在ant中处理循环？<br />
<a href="http://www.36ria.com/5003/ant-9" rel="attachment wp-att-5004"><img src="http://www.36ria.com/wp-content/uploads/2012/02/ant-9.png" alt="" title="ant-9" width="235" height="490" class="alignnone size-full wp-image-5004" /></a><br />
如上图所示，build和src下的themes目录必须保持一致，而且必须遍历每个子目录合并该目录的js，所以需要用到循环。这时候你也许会想到编程语言中常用的<strong>for</strong>，ant有for标签吗？很影响ant并不是编程语言，没有直接的for标签，但通过第三方类库可以实现for循环，我们来看代码。<br />
<strong>请确保你的本机上的ant下的lib目录下有ant-contrib-1.0b3.jar文件</strong>。</p>
<h5>增加新的命名空间</h5>
<div class="hl-surround"><ol class="hl-main ln-show" title="Double click to hide line number." ondblclick = "linenumber(this)"><li class="hl-firstline"><span style="color: Olive;">&lt;</span><span style="color: Green;">project</span><span style="color: Gray;"> </span><span style="color: #00008b;">name</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">uploader.build</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;"> </span><span style="color: #00008b;">default</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">build</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;"> </span><span style="color: #00008b;">basedir</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">.</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;"> </span><span style="color: #00008b;">xmlns:ac</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">antlib:net.sf.antcontrib</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">&gt;</span></li>
<li><span style="color: Olive;">&lt;/</span><span style="color: Green;">project</span><span style="color: Olive;">&gt;</span></li></ol></div>
<p>给你的project增加ac命名空间：<strong>mlns:ac=”antlib:net.sf.antcontrib”</strong>。</p>
<h5>遍历themes下的每个目录</h5>
<div class="hl-surround"><ol class="hl-main ln-show" title="Double click to hide line number." ondblclick = "linenumber(this)"><li class="hl-firstline"><span style="color: Olive;">&lt;</span><span style="color: Green;">target</span><span style="color: Gray;"> </span><span style="color: #00008b;">name</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">build-theme</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;"> </span><span style="color: #00008b;">depends</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">move-theme</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">&gt;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Olive;">&lt;</span><span style="color: Green;">ac:for</span><span style="color: Gray;">&nbsp;</span><span style="color: #00008b;">param</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">file</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">&gt;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Olive;">&lt;</span><span style="color: Green;">path</span><span style="color: Olive;">&gt;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Olive;">&lt;</span><span style="color: Green;">fileset</span><span style="color: Gray;">&nbsp;</span><span style="color: #00008b;">dir</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">${uploader.build.dir}/themes</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;"> </span><span style="color: #00008b;">includes</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">**/index.js</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">/&gt;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Olive;">&lt;/</span><span style="color: Green;">path</span><span style="color: Olive;">&gt;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Olive;">&lt;</span><span style="color: Green;">sequential</span><span style="color: Olive;">&gt;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Olive;">&lt;</span><span style="color: Green;">ac:var</span><span style="color: Gray;">&nbsp;</span><span style="color: #00008b;">name</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">var.dir</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;"> </span><span style="color: #00008b;">unset</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">true</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">/&gt;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Olive;">&lt;</span><span style="color: Green;">dirname</span><span style="color: Gray;">&nbsp;</span><span style="color: #00008b;">property</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">var.dir</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;"> </span><span style="color: #00008b;">file</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">@{file}</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">/&gt;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Olive;">&lt;</span><span style="color: Green;">echo</span><span style="color: Olive;">&gt;</span><span style="color: Gray;">concat ${var.dir}</span><span style="color: Olive;">&lt;/</span><span style="color: Green;">echo</span><span style="color: Olive;">&gt;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Olive;">&lt;/</span><span style="color: Green;">sequential</span><span style="color: Olive;">&gt;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Olive;">&lt;/</span><span style="color: Green;">ac:for</span><span style="color: Olive;">&gt;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Olive;">&lt;/</span><span style="color: Green;">target</span><span style="color: Olive;">&gt;</span></li></ol></div>
<p>使用<strong>ac:for</strong>开启循环，<strong>param</strong>为参数名，供后面循环时更换文件路径时使用。</p>
<div class="hl-surround"><ol class="hl-main ln-show" title="Double click to hide line number." ondblclick = "linenumber(this)"><li class="hl-firstline"><span style="color: Olive;">&lt;</span><span style="color: Green;">path</span><span style="color: Olive;">&gt;</span></li>
<li><span style="color: Gray;">&nbsp;&nbsp; </span><span style="color: Olive;">&lt;</span><span style="color: Green;">fileset</span><span style="color: Gray;">&nbsp;</span><span style="color: #00008b;">dir</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">${uploader.build.dir}/themes</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;"> </span><span style="color: #00008b;">includes</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">**/index.js</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">/&gt;</span></li>
<li><span style="color: Olive;">&lt;/</span><span style="color: Green;">path</span><span style="color: Olive;">&gt;</span></li></ol></div>
<p>定义文件路径。取每个子目录下的index.js。</p>
<div class="hl-surround"><ol class="hl-main ln-show" title="Double click to hide line number." ondblclick = "linenumber(this)"><li class="hl-firstline"><span style="color: Olive;">&lt;</span><span style="color: Green;">sequential</span><span style="color: Olive;">&gt;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Olive;">&lt;</span><span style="color: Green;">ac:var</span><span style="color: Gray;">&nbsp;</span><span style="color: #00008b;">name</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">var.dir</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;"> </span><span style="color: #00008b;">unset</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">true</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">/&gt;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Olive;">&lt;</span><span style="color: Green;">dirname</span><span style="color: Gray;">&nbsp;</span><span style="color: #00008b;">property</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">var.dir</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;"> </span><span style="color: #00008b;">file</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">@{file}</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">/&gt;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Olive;">&lt;</span><span style="color: Green;">echo</span><span style="color: Olive;">&gt;</span><span style="color: Gray;">concat ${var.dir}</span><span style="color: Olive;">&lt;/</span><span style="color: Green;">echo</span><span style="color: Olive;">&gt;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Olive;">&lt;/</span><span style="color: Green;">sequential</span><span style="color: Olive;">&gt;</span></li></ol></div>
<p><strong>sequential</strong>标签，与for标签配合使用，标志循环开始。<br />
<strong>ac:var</strong>定义var.dir变量（即子目录路径）可更改，留意ant定义的property是无法更改的。<br />
<strong>dirname</strong>获取文件对应的子目录路径。<br />
接下来具体执行任务：</p>
<div class="hl-surround"><ol class="hl-main ln-show" title="Double click to hide line number." ondblclick = "linenumber(this)"><li class="hl-firstline"><span style="color: Olive;">&lt;</span><span style="color: Green;">concat</span><span style="color: Gray;"> </span><span style="color: #00008b;">destfile</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">${var.dir}/index-pkg.js</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;"> </span><span style="color: #00008b;">encoding</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">${charset}</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;"> </span><span style="color: #00008b;">outputencoding</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">${charset}</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">&gt;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Olive;">&lt;</span><span style="color: Green;">fileset</span><span style="color: Gray;">&nbsp;</span><span style="color: #00008b;">dir</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">${var.dir}</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;"> </span><span style="color: #00008b;">includes</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">*.js</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">/&gt;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Olive;">&lt;</span><span style="color: Green;">filterchain</span><span style="color: Olive;">&gt;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Olive;">&lt;</span><span style="color: Green;">deletecharacters</span><span style="color: Gray;">&nbsp;</span><span style="color: #00008b;">chars</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">&amp;#xFEFF;</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">/&gt;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Olive;">&lt;/</span><span style="color: Green;">filterchain</span><span style="color: Olive;">&gt;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Olive;">&lt;/</span><span style="color: Green;">concat</span><span style="color: Olive;">&gt;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Olive;">&lt;</span><span style="color: Green;">delete</span><span style="color: Olive;">&gt;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Olive;">&lt;</span><span style="color: Green;">fileset</span><span style="color: Gray;">&nbsp;</span><span style="color: #00008b;">dir</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">${var.dir}/</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;"> </span><span style="color: #00008b;">includes</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">*.js</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;"> </span><span style="color: #00008b;">excludes</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">index-pkg.js</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">/&gt;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Olive;">&lt;/</span><span style="color: Green;">delete</span><span style="color: Olive;">&gt;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Olive;">&lt;</span><span style="color: Green;">rename</span><span style="color: Gray;">&nbsp;</span><span style="color: #00008b;">src</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">${var.dir}/index-pkg.js</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;"> </span><span style="color: #00008b;">dest</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">${var.dir}/index.js</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">/&gt;</span></li></ol></div>
<h5>压缩build目录下的所有js文件</h5>
<div class="hl-surround"><ol class="hl-main ln-show" title="Double click to hide line number." ondblclick = "linenumber(this)"><li class="hl-firstline"><span style="color: Olive;">&lt;</span><span style="color: Green;">target</span><span style="color: Gray;"> </span><span style="color: #00008b;">name</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">minify</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;"> </span><span style="color: #00008b;">depends</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">crlf</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">&gt;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Olive;">&lt;</span><span style="color: Green;">apply</span><span style="color: Gray;">&nbsp;</span><span style="color: #00008b;">executable</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">java</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;"> </span><span style="color: #00008b;">verbose</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">true</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;"> </span><span style="color: #00008b;">dest</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">${uploader.build.dir}</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;"> </span><span style="color: #00008b;">failonerror</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">true</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;"> </span><span style="color: #00008b;">parallel</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">false</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">&gt;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Olive;">&lt;</span><span style="color: Green;">fileset</span><span style="color: Gray;">&nbsp;</span><span style="color: #00008b;">dir</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">${uploader.build.dir}</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;"> </span><span style="color: #00008b;">includes</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">**/*.js</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">/&gt;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Olive;">&lt;</span><span style="color: Green;">arg</span><span style="color: Gray;">&nbsp;</span><span style="color: #00008b;">line</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">-jar</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">/&gt;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Olive;">&lt;</span><span style="color: Green;">arg</span><span style="color: Gray;">&nbsp;</span><span style="color: #00008b;">path</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">${compiler}</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">/&gt;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Olive;">&lt;</span><span style="color: Green;">arg</span><span style="color: Gray;">&nbsp;</span><span style="color: #00008b;">line</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">--charset utf8</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">/&gt;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Olive;">&lt;</span><span style="color: Green;">arg</span><span style="color: Gray;">&nbsp;</span><span style="color: #00008b;">value</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">--warning_level</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">/&gt;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Olive;">&lt;</span><span style="color: Green;">arg</span><span style="color: Gray;">&nbsp;</span><span style="color: #00008b;">value</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">QUIET</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">/&gt;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Olive;">&lt;</span><span style="color: Green;">arg</span><span style="color: Gray;">&nbsp;</span><span style="color: #00008b;">value</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">--js</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">/&gt;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Olive;">&lt;</span><span style="color: Green;">srcfile</span><span style="color: Olive;">/&gt;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Olive;">&lt;</span><span style="color: Green;">arg</span><span style="color: Gray;">&nbsp;</span><span style="color: #00008b;">value</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">--js_output_file</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">/&gt;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Olive;">&lt;</span><span style="color: Green;">targetfile</span><span style="color: Olive;">/&gt;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Olive;">&lt;</span><span style="color: Green;">mapper</span><span style="color: Gray;">&nbsp;</span><span style="color: #00008b;">type</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">regexp</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;"> </span><span style="color: #00008b;">from</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">^(.*)\.js$</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;"> </span><span style="color: #00008b;">to</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">\1-min.js</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">/&gt;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Olive;">&lt;/</span><span style="color: Green;">apply</span><span style="color: Olive;">&gt;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Olive;">&lt;/</span><span style="color: Green;">target</span><span style="color: Olive;">&gt;</span></li></ol></div>
<p>关于如何使用ant压缩脚本可以看<a href="http://www.36ria.com/4644" title="ant结合yui-compressor和closure-compiler—ant入门指南" target="_blank">《ant结合yui-compressor和closure-compiler—ant入门指南》</a>。<br />
其他简单的部分不再累述。</p>
<h4>完整代码如下：</h4>
<div class="hl-surround"><ol class="hl-main ln-show" title="Double click to hide line number." ondblclick = "linenumber(this)"><li class="hl-firstline"><span style="color: Olive;">&lt;</span><span style="color: Green;">project</span><span style="color: Gray;"> </span><span style="color: #00008b;">name</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">uploader.build</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;"> </span><span style="color: #00008b;">default</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">build</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;"> </span><span style="color: #00008b;">basedir</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">.</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;"> </span><span style="color: #00008b;">xmlns:ac</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">antlib:net.sf.antcontrib</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">&gt;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Olive;">&lt;</span><span style="color: Green;">description</span><span style="color: Olive;">&gt;</span><span style="color: Gray;">Uploader Build File</span><span style="color: Olive;">&lt;/</span><span style="color: Green;">description</span><span style="color: Olive;">&gt;</span></li>
<li><span style="color: Gray;">&nbsp;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Olive;">&lt;</span><span style="color: Green;">property</span><span style="color: Gray;">&nbsp;</span><span style="color: #00008b;">name</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">charset</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;"> </span><span style="color: #00008b;">value</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">utf-8</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">/&gt;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Olive;">&lt;</span><span style="color: Green;">property</span><span style="color: Gray;">&nbsp;</span><span style="color: #00008b;">name</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">tool.dir</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;"> </span><span style="color: #00008b;">location</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">../../../tool</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">/&gt;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Olive;">&lt;</span><span style="color: Green;">property</span><span style="color: Gray;">&nbsp;</span><span style="color: #00008b;">name</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">compiler</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;"> </span><span style="color: #00008b;">location</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">${tool.dir}/closure-compiler/compiler.jar</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">/&gt;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Olive;">&lt;</span><span style="color: Green;">property</span><span style="color: Gray;">&nbsp;</span><span style="color: #00008b;">name</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">form.build.dir</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;"> </span><span style="color: #00008b;">location</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">../../../build/form</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">/&gt;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Olive;">&lt;</span><span style="color: Green;">property</span><span style="color: Gray;">&nbsp;</span><span style="color: #00008b;">name</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">src.dir</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;"> </span><span style="color: #00008b;">location</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">.</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">/&gt;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Olive;">&lt;</span><span style="color: Green;">property</span><span style="color: Gray;">&nbsp;</span><span style="color: #00008b;">name</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">uploader.build.dir</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;"> </span><span style="color: #00008b;">location</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">${form.build.dir}/uploader</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">/&gt;</span></li>
<li><span style="color: Gray;">&nbsp;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: #ffa500;">&lt;!--合并源码文件，排除模板js--&gt;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Olive;">&lt;</span><span style="color: Green;">target</span><span style="color: Gray;">&nbsp;</span><span style="color: #00008b;">name</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">concat</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">&gt;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Olive;">&lt;</span><span style="color: Green;">concat</span><span style="color: Gray;">&nbsp;</span><span style="color: #00008b;">destfile</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">render-pkg.js</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;"> </span><span style="color: #00008b;">encoding</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">${charset}</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;"> </span><span style="color: #00008b;">outputencoding</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">${charset}</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">&gt;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Olive;">&lt;</span><span style="color: Green;">fileset</span><span style="color: Gray;">&nbsp;</span><span style="color: #00008b;">dir</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">${src.dir}</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;"> </span><span style="color: #00008b;">includes</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">**/*.js</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;"> </span><span style="color: #00008b;">excludes</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">tests/*.js,demo/**/*.js,auth/*.js,themes/**/*.js</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">/&gt;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Olive;">&lt;</span><span style="color: Green;">filterchain</span><span style="color: Olive;">&gt;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Olive;">&lt;</span><span style="color: Green;">deletecharacters</span><span style="color: Gray;">&nbsp;</span><span style="color: #00008b;">chars</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">&amp;#xFEFF;</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">/&gt;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Olive;">&lt;/</span><span style="color: Green;">filterchain</span><span style="color: Olive;">&gt;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Olive;">&lt;/</span><span style="color: Green;">concat</span><span style="color: Olive;">&gt;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Olive;">&lt;/</span><span style="color: Green;">target</span><span style="color: Olive;">&gt;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: #ffa500;">&lt;!--移动合并后源文件到build目录下--&gt;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Olive;">&lt;</span><span style="color: Green;">target</span><span style="color: Gray;">&nbsp;</span><span style="color: #00008b;">name</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">move</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">&gt;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Olive;">&lt;</span><span style="color: Green;">move</span><span style="color: Gray;">&nbsp;</span><span style="color: #00008b;">file</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">render-pkg.js</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;"> </span><span style="color: #00008b;">tofile</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">${uploader.build.dir}/render.js</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">/&gt;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Olive;">&lt;/</span><span style="color: Green;">target</span><span style="color: Olive;">&gt;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: #ffa500;">&lt;!--删除build目录下的所有文件--&gt;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Olive;">&lt;</span><span style="color: Green;">target</span><span style="color: Gray;">&nbsp;</span><span style="color: #00008b;">name</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">clean-build</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">&gt;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Olive;">&lt;</span><span style="color: Green;">delete</span><span style="color: Olive;">&gt;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Olive;">&lt;</span><span style="color: Green;">fileset</span><span style="color: Gray;">&nbsp;</span><span style="color: #00008b;">dir</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">${uploader.build.dir}</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;"> </span><span style="color: #00008b;">includes</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">**/*.js,**/*.css,**/*.swf</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">/&gt;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Olive;">&lt;/</span><span style="color: Green;">delete</span><span style="color: Olive;">&gt;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Olive;">&lt;/</span><span style="color: Green;">target</span><span style="color: Olive;">&gt;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: #ffa500;">&lt;!--移动uploader.swf--&gt;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Olive;">&lt;</span><span style="color: Green;">target</span><span style="color: Gray;">&nbsp;</span><span style="color: #00008b;">name</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">move-swf</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">&gt;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Olive;">&lt;</span><span style="color: Green;">copy</span><span style="color: Gray;">&nbsp;</span><span style="color: #00008b;">file</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">plugins/ajbridge/uploader.swf</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;"> </span><span style="color: #00008b;">todir</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">${uploader.build.dir}/plugins/ajbridge</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">/&gt;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Olive;">&lt;/</span><span style="color: Green;">target</span><span style="color: Olive;">&gt;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: #ffa500;">&lt;!--移动模板的源码文件到build目录下--&gt;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Olive;">&lt;</span><span style="color: Green;">target</span><span style="color: Gray;">&nbsp;</span><span style="color: #00008b;">name</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">move-theme</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">&gt;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Olive;">&lt;</span><span style="color: Green;">copy</span><span style="color: Gray;">&nbsp;</span><span style="color: #00008b;">todir</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">${uploader.build.dir}/themes</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;"> </span><span style="color: #00008b;">overwrite</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">true</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">&gt;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Olive;">&lt;</span><span style="color: Green;">fileset</span><span style="color: Gray;">&nbsp;</span><span style="color: #00008b;">dir</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">${src.dir}/themes</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">/&gt;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Olive;">&lt;/</span><span style="color: Green;">copy</span><span style="color: Olive;">&gt;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Olive;">&lt;</span><span style="color: Green;">delete</span><span style="color: Olive;">&gt;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Olive;">&lt;</span><span style="color: Green;">fileset</span><span style="color: Gray;">&nbsp;</span><span style="color: #00008b;">dir</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">${uploader.build.dir}/themes</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;"> </span><span style="color: #00008b;">includes</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">**/*.html</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">/&gt;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Olive;">&lt;/</span><span style="color: Green;">delete</span><span style="color: Olive;">&gt;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Olive;">&lt;/</span><span style="color: Green;">target</span><span style="color: Olive;">&gt;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: #ffa500;">&lt;!--构建模板，合并模板下的js文件，生成index-pkg.js，删除源文件，将index-pkg.js改成index.js--&gt;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Olive;">&lt;</span><span style="color: Green;">target</span><span style="color: Gray;">&nbsp;</span><span style="color: #00008b;">name</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">build-theme</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;"> </span><span style="color: #00008b;">depends</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">move-theme</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">&gt;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Olive;">&lt;</span><span style="color: Green;">ac:for</span><span style="color: Gray;">&nbsp;</span><span style="color: #00008b;">param</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">file</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">&gt;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Olive;">&lt;</span><span style="color: Green;">path</span><span style="color: Olive;">&gt;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Olive;">&lt;</span><span style="color: Green;">fileset</span><span style="color: Gray;">&nbsp;</span><span style="color: #00008b;">dir</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">${uploader.build.dir}/themes</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;"> </span><span style="color: #00008b;">includes</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">**/index.js</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">/&gt;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Olive;">&lt;/</span><span style="color: Green;">path</span><span style="color: Olive;">&gt;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Olive;">&lt;</span><span style="color: Green;">sequential</span><span style="color: Olive;">&gt;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Olive;">&lt;</span><span style="color: Green;">ac:var</span><span style="color: Gray;">&nbsp;</span><span style="color: #00008b;">name</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">var.dir</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;"> </span><span style="color: #00008b;">unset</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">true</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">/&gt;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Olive;">&lt;</span><span style="color: Green;">dirname</span><span style="color: Gray;">&nbsp;</span><span style="color: #00008b;">property</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">var.dir</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;"> </span><span style="color: #00008b;">file</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">@{file}</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">/&gt;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Olive;">&lt;</span><span style="color: Green;">echo</span><span style="color: Olive;">&gt;</span><span style="color: Gray;">concat ${var.dir}</span><span style="color: Olive;">&lt;/</span><span style="color: Green;">echo</span><span style="color: Olive;">&gt;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Olive;">&lt;</span><span style="color: Green;">concat</span><span style="color: Gray;">&nbsp;</span><span style="color: #00008b;">destfile</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">${var.dir}/index-pkg.js</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;"> </span><span style="color: #00008b;">encoding</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">${charset}</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;"> </span><span style="color: #00008b;">outputencoding</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">${charset}</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">&gt;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Olive;">&lt;</span><span style="color: Green;">fileset</span><span style="color: Gray;">&nbsp;</span><span style="color: #00008b;">dir</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">${var.dir}</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;"> </span><span style="color: #00008b;">includes</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">*.js</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">/&gt;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Olive;">&lt;</span><span style="color: Green;">filterchain</span><span style="color: Olive;">&gt;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Olive;">&lt;</span><span style="color: Green;">deletecharacters</span><span style="color: Gray;">&nbsp;</span><span style="color: #00008b;">chars</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">&amp;#xFEFF;</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">/&gt;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Olive;">&lt;/</span><span style="color: Green;">filterchain</span><span style="color: Olive;">&gt;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Olive;">&lt;/</span><span style="color: Green;">concat</span><span style="color: Olive;">&gt;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Olive;">&lt;</span><span style="color: Green;">delete</span><span style="color: Olive;">&gt;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Olive;">&lt;</span><span style="color: Green;">fileset</span><span style="color: Gray;">&nbsp;</span><span style="color: #00008b;">dir</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">${var.dir}/</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;"> </span><span style="color: #00008b;">includes</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">*.js</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;"> </span><span style="color: #00008b;">excludes</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">index-pkg.js</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">/&gt;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Olive;">&lt;/</span><span style="color: Green;">delete</span><span style="color: Olive;">&gt;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Olive;">&lt;</span><span style="color: Green;">rename</span><span style="color: Gray;">&nbsp;</span><span style="color: #00008b;">src</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">${var.dir}/index-pkg.js</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;"> </span><span style="color: #00008b;">dest</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">${var.dir}/index.js</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">/&gt;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Olive;">&lt;/</span><span style="color: Green;">sequential</span><span style="color: Olive;">&gt;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Olive;">&lt;/</span><span style="color: Green;">ac:for</span><span style="color: Olive;">&gt;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Olive;">&lt;/</span><span style="color: Green;">target</span><span style="color: Olive;">&gt;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: #ffa500;">&lt;!--压缩前去除页面多余空白--&gt;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Olive;">&lt;</span><span style="color: Green;">target</span><span style="color: Gray;">&nbsp;</span><span style="color: #00008b;">name</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">crlf</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">&gt;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Olive;">&lt;</span><span style="color: Green;">fixcrlf</span><span style="color: Gray;">&nbsp;</span><span style="color: #00008b;">includes</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">*.js</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;"> </span><span style="color: #00008b;">srcdir</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">${uploader.build.dir}</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;"> </span><span style="color: #00008b;">encoding</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">utf8</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;"> </span><span style="color: #00008b;">eol</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">crlf</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">&gt;&lt;/</span><span style="color: Green;">fixcrlf</span><span style="color: Olive;">&gt;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Olive;">&lt;/</span><span style="color: Green;">target</span><span style="color: Olive;">&gt;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: #ffa500;">&lt;!--压缩脚本--&gt;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Olive;">&lt;</span><span style="color: Green;">target</span><span style="color: Gray;">&nbsp;</span><span style="color: #00008b;">name</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">minify</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;"> </span><span style="color: #00008b;">depends</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">crlf</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">&gt;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Olive;">&lt;</span><span style="color: Green;">apply</span><span style="color: Gray;">&nbsp;</span><span style="color: #00008b;">executable</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">java</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;"> </span><span style="color: #00008b;">verbose</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">true</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;"> </span><span style="color: #00008b;">dest</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">${uploader.build.dir}</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;"> </span><span style="color: #00008b;">failonerror</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">true</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;"> </span><span style="color: #00008b;">parallel</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">false</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">&gt;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Olive;">&lt;</span><span style="color: Green;">fileset</span><span style="color: Gray;">&nbsp;</span><span style="color: #00008b;">dir</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">${uploader.build.dir}</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;"> </span><span style="color: #00008b;">includes</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">**/*.js</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">/&gt;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Olive;">&lt;</span><span style="color: Green;">arg</span><span style="color: Gray;">&nbsp;</span><span style="color: #00008b;">line</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">-jar</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">/&gt;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Olive;">&lt;</span><span style="color: Green;">arg</span><span style="color: Gray;">&nbsp;</span><span style="color: #00008b;">path</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">${compiler}</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">/&gt;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Olive;">&lt;</span><span style="color: Green;">arg</span><span style="color: Gray;">&nbsp;</span><span style="color: #00008b;">line</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">--charset utf8</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">/&gt;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Olive;">&lt;</span><span style="color: Green;">arg</span><span style="color: Gray;">&nbsp;</span><span style="color: #00008b;">value</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">--warning_level</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">/&gt;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Olive;">&lt;</span><span style="color: Green;">arg</span><span style="color: Gray;">&nbsp;</span><span style="color: #00008b;">value</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">QUIET</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">/&gt;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Olive;">&lt;</span><span style="color: Green;">arg</span><span style="color: Gray;">&nbsp;</span><span style="color: #00008b;">value</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">--js</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">/&gt;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Olive;">&lt;</span><span style="color: Green;">srcfile</span><span style="color: Olive;">/&gt;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Olive;">&lt;</span><span style="color: Green;">arg</span><span style="color: Gray;">&nbsp;</span><span style="color: #00008b;">value</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">--js_output_file</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">/&gt;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Olive;">&lt;</span><span style="color: Green;">targetfile</span><span style="color: Olive;">/&gt;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Olive;">&lt;</span><span style="color: Green;">mapper</span><span style="color: Gray;">&nbsp;</span><span style="color: #00008b;">type</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">regexp</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;"> </span><span style="color: #00008b;">from</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">^(.*)\.js$</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;"> </span><span style="color: #00008b;">to</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">\1-min.js</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">/&gt;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Olive;">&lt;/</span><span style="color: Green;">apply</span><span style="color: Olive;">&gt;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Olive;">&lt;/</span><span style="color: Green;">target</span><span style="color: Olive;">&gt;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Olive;">&lt;</span><span style="color: Green;">target</span><span style="color: Gray;">&nbsp;</span><span style="color: #00008b;">name</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">build</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;"> </span><span style="color: #00008b;">depends</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">concat,clean-build,move,build-theme,minify,move-swf</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">&gt;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Olive;">&lt;/</span><span style="color: Green;">target</span><span style="color: Olive;">&gt;</span></li>
<li><span style="color: Olive;">&lt;/</span><span style="color: Green;">project</span><span style="color: Olive;">&gt;</span></li></ol></div>
]]></content:encoded>
			<wfw:commentRss>http://www.36ria.com/5003/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>IE8 bug—使用max-width属性导致图片消失</title>
		<link>http://www.36ria.com/4991</link>
		<comments>http://www.36ria.com/4991#comments</comments>
		<pubDate>Wed, 15 Feb 2012 02:08:05 +0000</pubDate>
		<dc:creator>飞绿</dc:creator>
				<category><![CDATA[浏览器]]></category>
		<category><![CDATA[ie bug]]></category>
		<category><![CDATA[IE8]]></category>

		<guid isPermaLink="false">http://www.36ria.com/?p=4991</guid>
		<description><![CDATA[bug症状： 在一些设计中给img设置max-width: 100%，以便图片能完整呈现，而不是被截掉部分。这样设置在其他浏览器下都表现完美，但唯独IE8下却出了问题。 IE8下，图片竟然不见了！ bug重现： 大家所知的一般常见的IE bug中没见过这样情况的，所以花费了一些时间来重现这个问题，max-width的设置只是导致这个现象的部分条件。 在做了一系列试验后得出了问题重现的条件。 首先给i......]]></description>
			<content:encoded><![CDATA[<h4>bug症状：</h4>
<p>在一些设计中给img设置<strong>max-width: 100%</strong>，以便图片能完整呈现，而不是被截掉部分。这样设置在其他浏览器下都表现完美，但唯独IE8下却出了问题。<br />
IE8下，图片竟然不见了！</p>
<h4>bug重现：</h4>
<p>大家所知的一般常见的IE bug中没见过这样情况的，所以花费了一些时间来重现这个问题，max-width的设置只是导致这个现象的部分条件。<br />
在做了一系列试验后得出了问题重现的条件。<br />
首先给img设置<strong>max-width</strong>，但却<strong>没有明确给出width数值</strong>，并且给img标签设置width属性（不是通过css设置的width），并且<strong>img的父容器设置了浮动</strong>，IE8下查看img的width为<strong>0</strong>！表现为IE8（标准模式下）下图片消失了！</p>
<h4>如何修复这个bug？</h4>
<p>有三种方法：</p>
<ul>
<li>删除img标签的width属性</li>
<li>通过css，给浮动元素明确的width值</li>
<li>通过css，给出问题的img明确声明width:auto或max-width:none</li>
</ul>
<p>最好的办法第三方案：<strong>通过设置CSS，给浮动元素中的没有明确设置width的img设置width:auto;或max-width: none;</strong>。<br />
来看个demo：</p>
<ul class="tow-columns clearfix">
<li class="l"><a href="http://www.456bereastreet.com/lab/img-max-width/" class="btn-view-demo" target="_blank">点此查看demo</a></li>
</ul>
<p>其中有三个logo。在IE8下，第一个logo将消失；第二个通过CSS给img设置了width:auto；第三个在img标签上没有设置width属性。<br />
一个神奇的bug！！！！</p>
<p>文章翻译自<a href="http://www.456bereastreet.com/archive/201202/using_max-width_on_images_can_make_them_disappear_in_ie8/" target="_blank">Using max-width on images can make them disappear in IE8</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.36ria.com/4991/feed</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
		<item>
		<title>Chosen—强大的jquery模拟选择框插件</title>
		<link>http://www.36ria.com/4976</link>
		<comments>http://www.36ria.com/4976#comments</comments>
		<pubDate>Mon, 13 Feb 2012 11:36:28 +0000</pubDate>
		<dc:creator>明河</dc:creator>
				<category><![CDATA[jquery插件]]></category>
		<category><![CDATA[jquery]]></category>
		<category><![CDATA[选择框组件]]></category>

		<guid isPermaLink="false">http://www.36ria.com/?p=4976</guid>
		<description><![CDATA[很久没写jquery相关的内容了。今天明河向大家推荐个相当不错的模拟选择框插件：Chosen。Chosen提供了suggest功能，强大的是实现了选项分组和多选关键词处理。 点此查看demo 如何使用？ 引入jquery库和脚本 &#60;script src=&#34;https://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js&#34; type=&#34;text/javascript&#34;&#62;&#60;/script&#62; &#60;script&#160;src=&#34;chosen/chosen.jquery.js&#34; type=&#34;text/javascript&#34;&#6......]]></description>
			<content:encoded><![CDATA[<p>很久没写jquery相关的内容了。今天明河向大家推荐个相当不错的模拟选择框插件：Chosen。Chosen提供了suggest功能，强大的是实现了选项分组和多选关键词处理。<br />
<a href="http://www.36ria.com/4976/chosen-1" rel="attachment wp-att-4977"><img src="http://www.36ria.com/wp-content/uploads/2012/02/Chosen-1.png" alt="" title="Chosen-1" width="373" height="341" class="alignnone size-full wp-image-4977" /></a><br />
<a href="http://www.36ria.com/4976/chosen-2" rel="attachment wp-att-4978"><img src="http://www.36ria.com/wp-content/uploads/2012/02/Chosen-2.png" alt="" title="Chosen-2" width="380" height="293" class="alignnone size-full wp-image-4978" /></a><br />
<a href="http://www.36ria.com/4976/chosen-3" rel="attachment wp-att-4979"><img src="http://www.36ria.com/wp-content/uploads/2012/02/Chosen-3.png" alt="" title="Chosen-3" width="367" height="316" class="alignnone size-full wp-image-4979" /></a></p>
<ul class="tow-columns clearfix">
<li class="l"><a target="_blank" class="btn-view-demo" href="http://harvesthq.github.com/chosen/">点此查看demo</a></li>
<li class="l"><a href="http://www.36ria.com/wp-content/plugins/download-monitor/download.php?id=225" title="名称：chosen，下载次数：208，文件大小：59.64 kB" class="btn-download">点此下载</a></li>
</ul>
<h4>如何使用？</h4>
<h5>引入jquery库和脚本</h5>
<div class="hl-surround"><ol class="hl-main ln-show" title="Double click to hide line number." ondblclick = "linenumber(this)"><li class="hl-firstline"><span style="color: Olive;">&lt;</span><span style="color: Green;">script</span><span style="color: Gray;"> </span><span style="color: #00008b;">src</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">https://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;"> </span><span style="color: #00008b;">type</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">text/javascript</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">&gt;&lt;/</span><span style="color: Green;">script</span><span style="color: Olive;">&gt;</span></li>
<li><span style="color: Olive;">&lt;</span><span style="color: Green;">script</span><span style="color: Gray;">&nbsp;</span><span style="color: #00008b;">src</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">chosen/chosen.jquery.js</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;"> </span><span style="color: #00008b;">type</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">text/javascript</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">&gt;&lt;/</span><span style="color: Green;">script</span><span style="color: Olive;">&gt;</span></li></ol></div>
<h5>选择框html片段</h5>
<div class="hl-surround"><ol class="hl-main ln-show" title="Double click to hide line number." ondblclick = "linenumber(this)"><li class="hl-firstline"><span style="color: Olive;">&lt;</span><span style="color: Green;">select</span><span style="color: Gray;"> </span><span style="color: #00008b;">class</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">chzn-select</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;"> </span><span style="color: #00008b;">data-placeholder</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">Choose a Country</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;"> </span><span style="color: #00008b;">style</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">width:350px;</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;"> </span><span style="color: #00008b;">tabindex</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">1</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">&gt;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Olive;">&lt;</span><span style="color: Green;">option</span><span style="color: Gray;">&nbsp;</span><span style="color: #00008b;">value</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;&quot;</span><span style="color: Olive;">&gt;&lt;/</span><span style="color: Green;">option</span><span style="color: Olive;">&gt;</span><span style="color: Gray;">&nbsp;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Olive;">&lt;</span><span style="color: Green;">option</span><span style="color: Gray;">&nbsp;</span><span style="color: #00008b;">value</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">United States</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">&gt;</span><span style="color: Gray;">United States</span><span style="color: Olive;">&lt;/</span><span style="color: Green;">option</span><span style="color: Olive;">&gt;</span><span style="color: Gray;">&nbsp;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Olive;">&lt;</span><span style="color: Green;">option</span><span style="color: Gray;">&nbsp;</span><span style="color: #00008b;">value</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">United Kingdom</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">&gt;</span><span style="color: Gray;">United Kingdom</span><span style="color: Olive;">&lt;/</span><span style="color: Green;">option</span><span style="color: Olive;">&gt;</span><span style="color: Gray;">&nbsp;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Olive;">&lt;</span><span style="color: Green;">option</span><span style="color: Gray;">&nbsp;</span><span style="color: #00008b;">value</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">Afghanistan</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">&gt;</span><span style="color: Gray;">Afghanistan</span><span style="color: Olive;">&lt;/</span><span style="color: Green;">option</span><span style="color: Olive;">&gt;</span><span style="color: Gray;">&nbsp;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Olive;">&lt;</span><span style="color: Green;">option</span><span style="color: Gray;">&nbsp;</span><span style="color: #00008b;">value</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">Albania</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">&gt;</span><span style="color: Gray;">Albania</span><span style="color: Olive;">&lt;/</span><span style="color: Green;">option</span><span style="color: Olive;">&gt;</span><span style="color: Gray;">&nbsp;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ...</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Olive;">&lt;/</span><span style="color: Green;">select</span><span style="color: Olive;">&gt;</span></li></ol></div>
<h5>初始化组件</h5>
<div class="hl-surround"><ol class="hl-main ln-show" title="Double click to hide line number." ondblclick = "linenumber(this)"><li class="hl-firstline"><span style="color: Gray;">$</span><span style="color: Olive;">(</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">.chzn-select</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">)</span><span style="color: Gray;">.</span><span style="color: Blue;">chosen</span><span style="color: Olive;">()</span><span style="color: Gray;">;</span></li></ol></div>
<p>就这么简单。</p>
<h4>Chosen使用技巧</h4>
<p><strong>如何设置模拟选择框的默认文本？</strong><br />
设置<strong>data-placeholder</strong>=”"，即可。<br />
如果不存在data-placeholder，组件会自动设置默认文本为“Select Some Option”或“”Select Some Options”。<br />
<strong>如何设置没有搜索结果时显示的文本？</strong></p>
<div class="hl-surround"><ol class="hl-main ln-show" title="Double click to hide line number." ondblclick = "linenumber(this)"><li class="hl-firstline"><span style="color: Gray;">$</span><span style="color: Olive;">(</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">.chzn-select</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">)</span><span style="color: Gray;">.</span><span style="color: Blue;">chosen</span><span style="color: Olive;">({</span><span style="color: Blue;">no_results_text</span><span style="color: Gray;">: </span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">没有匹配结果</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">})</span><span style="color: Gray;">;</span></li></ol></div>
<p><strong>如何给选项分组？</strong><br />
在html中增加optgroup标签。</p>
<div class="hl-surround"><ol class="hl-main ln-show" title="Double click to hide line number." ondblclick = "linenumber(this)"><li class="hl-firstline"><span style="color: Olive;">&lt;</span><span style="color: Green;">select</span><span style="color: Gray;"> </span><span style="color: #00008b;">data-placeholder</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">Your Favorite Football Teams</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;"> </span><span style="color: #00008b;">style</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">width:350px;</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;"> </span><span style="color: #00008b;">class</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">chzn-select</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;"> </span><span style="color: #00008b;">multiple</span><span style="color: Gray;"> </span><span style="color: #00008b;">tabindex</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">6</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">&gt;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Olive;">&lt;</span><span style="color: Green;">option</span><span style="color: Gray;">&nbsp;</span><span style="color: #00008b;">value</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;&quot;</span><span style="color: Olive;">&gt;&lt;/</span><span style="color: Green;">option</span><span style="color: Olive;">&gt;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Olive;">&lt;</span><span style="color: Green;">optgroup</span><span style="color: Gray;">&nbsp;</span><span style="color: #00008b;">label</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">NFC EAST</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">&gt;</span></li>
<li><span style="color: Gray;">&nbsp;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Olive;">&lt;</span><span style="color: Green;">option</span><span style="color: Olive;">&gt;</span><span style="color: Gray;">Dallas Cowboys</span><span style="color: Olive;">&lt;/</span><span style="color: Green;">option</span><span style="color: Olive;">&gt;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Olive;">&lt;</span><span style="color: Green;">option</span><span style="color: Olive;">&gt;</span><span style="color: Gray;">New York Giants</span><span style="color: Olive;">&lt;/</span><span style="color: Green;">option</span><span style="color: Olive;">&gt;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Olive;">&lt;</span><span style="color: Green;">option</span><span style="color: Olive;">&gt;</span><span style="color: Gray;">Philadelphia Eagles</span><span style="color: Olive;">&lt;/</span><span style="color: Green;">option</span><span style="color: Olive;">&gt;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Olive;">&lt;</span><span style="color: Green;">option</span><span style="color: Olive;">&gt;</span><span style="color: Gray;">Washington Redskins</span><span style="color: Olive;">&lt;/</span><span style="color: Green;">option</span><span style="color: Olive;">&gt;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Olive;">&lt;</span><span style="color: Green;">optgroup</span><span style="color: Olive;">&gt;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Olive;">&lt;</span><span style="color: Green;">optgroup</span><span style="color: Gray;">&nbsp;</span><span style="color: #00008b;">label</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">NFC NORTH</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">&gt;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Olive;">&lt;</span><span style="color: Green;">option</span><span style="color: Olive;">&gt;</span><span style="color: Gray;">Chicago Bears</span><span style="color: Olive;">&lt;/</span><span style="color: Green;">option</span><span style="color: Olive;">&gt;</span></li>
<li><span style="color: Gray;">&nbsp;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Olive;">&lt;</span><span style="color: Green;">option</span><span style="color: Olive;">&gt;</span><span style="color: Gray;">Detroit Lions</span><span style="color: Olive;">&lt;/</span><span style="color: Green;">option</span><span style="color: Olive;">&gt;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Olive;">&lt;</span><span style="color: Green;">option</span><span style="color: Olive;">&gt;</span><span style="color: Gray;">Green Bay Packers</span><span style="color: Olive;">&lt;/</span><span style="color: Green;">option</span><span style="color: Olive;">&gt;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Olive;">&lt;</span><span style="color: Green;">option</span><span style="color: Olive;">&gt;</span><span style="color: Gray;">Minnesota Vikings</span><span style="color: Olive;">&lt;/</span><span style="color: Green;">option</span><span style="color: Olive;">&gt;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Olive;">&lt;/</span><span style="color: Green;">optgroup</span><span style="color: Olive;">&gt;</span></li>
<li><span style="color: Olive;">&lt;/</span><span style="color: Green;">select</span><span style="color: Olive;">&gt;</span></li></ol></div>
<p><strong>如何开启多选支持？</strong><br />
增加个多选属性<strong>multiple</strong></p>
<div class="hl-surround"><ol class="hl-main ln-show" title="Double click to hide line number." ondblclick = "linenumber(this)"><li class="hl-firstline"><span style="color: Olive;">&lt;</span><span style="color: Green;">select</span><span style="color: Gray;"> </span><span style="color: #00008b;">data-placeholder</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">Choose a Country</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;"> </span><span style="color: #00008b;">class</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">chzn-select</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;"> </span><span style="color: #00008b;">multiple</span><span style="color: Gray;"> </span><span style="color: #00008b;">style</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">width:350px;</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;"> </span><span style="color: #00008b;">tabindex</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">4</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">&gt;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Olive;">&lt;</span><span style="color: Green;">option</span><span style="color: Gray;">&nbsp;</span><span style="color: #00008b;">value</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;&quot;</span><span style="color: Olive;">&gt;&lt;/</span><span style="color: Green;">option</span><span style="color: Olive;">&gt;</span><span style="color: Gray;">&nbsp;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Olive;">&lt;</span><span style="color: Green;">option</span><span style="color: Gray;">&nbsp;</span><span style="color: #00008b;">value</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">United States</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">&gt;</span><span style="color: Gray;">United States</span><span style="color: Olive;">&lt;/</span><span style="color: Green;">option</span><span style="color: Olive;">&gt;</span><span style="color: Gray;">&nbsp;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Olive;">&lt;</span><span style="color: Green;">option</span><span style="color: Gray;">&nbsp;</span><span style="color: #00008b;">value</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">United Kingdom</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">&gt;</span><span style="color: Gray;">United Kingdom</span><span style="color: Olive;">&lt;/</span><span style="color: Green;">option</span><span style="color: Olive;">&gt;</span><span style="color: Gray;">&nbsp;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Olive;">&lt;</span><span style="color: Green;">option</span><span style="color: Gray;">&nbsp;</span><span style="color: #00008b;">value</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">Afghanistan</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">&gt;</span><span style="color: Gray;">Afghanistan</span><span style="color: Olive;">&lt;/</span><span style="color: Green;">option</span><span style="color: Olive;">&gt;</span><span style="color: Gray;">&nbsp;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Olive;">&lt;</span><span style="color: Green;">option</span><span style="color: Gray;">&nbsp;</span><span style="color: #00008b;">value</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">Albania</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">&gt;</span><span style="color: Gray;">Albania</span><span style="color: Olive;">&lt;/</span><span style="color: Green;">option</span><span style="color: Olive;">&gt;</span><span style="color: Gray;">&nbsp;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Olive;">&lt;</span><span style="color: Green;">option</span><span style="color: Gray;">&nbsp;</span><span style="color: #00008b;">value</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">Algeria</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">&gt;</span><span style="color: Gray;">Algeria</span><span style="color: Olive;">&lt;/</span><span style="color: Green;">option</span><span style="color: Olive;">&gt;</span><span style="color: Gray;">&nbsp;</span></li>
<li><span style="color: Olive;">&lt;/</span><span style="color: Green;">select</span><span style="color: Olive;">&gt;</span></li></ol></div>
]]></content:encoded>
			<wfw:commentRss>http://www.36ria.com/4976/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>EDM邮件中的html/css兼容性问题</title>
		<link>http://www.36ria.com/4892</link>
		<comments>http://www.36ria.com/4892#comments</comments>
		<pubDate>Fri, 10 Feb 2012 15:26:37 +0000</pubDate>
		<dc:creator>妙净</dc:creator>
				<category><![CDATA[css]]></category>
		<category><![CDATA[前端原创推荐]]></category>
		<category><![CDATA[EDM]]></category>
		<category><![CDATA[html邮件]]></category>
		<category><![CDATA[兼容性]]></category>

		<guid isPermaLink="false">http://www.36ria.com/?p=4892</guid>
		<description><![CDATA[最近需要配合用研同学做个问卷调查的邮件模板，表现形式不是纯文本，需要有美观的布局和多彩的内容，也就是说邮件里面需要用html/css来表现内容。这种应用已经非常普遍了，如今邮箱里面充斥着各种facebook动态、团购网站推荐、支付宝提醒等等的富文本邮件，这就是EDM（Email Direct Marketing ）电子邮件营销，那如何利用html/css/js更好地在邮件客户端（web邮箱就不讨论了）中......]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.36ria.com/4892/edm" rel="attachment wp-att-4968"><img src="http://www.36ria.com/wp-content/uploads/2012/02/edm.png" alt="" title="edm" width="680" height="200" class="alignnone size-full wp-image-4968" /></a><br />
最近需要配合用研同学做个问卷调查的邮件模板，表现形式不是纯文本，需要有美观的布局和多彩的内容，也就是说邮件里面需要用html/css来表现内容。这种应用已经非常普遍了，如今邮箱里面充斥着各种facebook动态、团购网站推荐、支付宝提醒等等的富文本邮件，这就是EDM（Email Direct Marketing ）电子邮件营销，那如何利用html/css/js更好地在邮件客户端（web邮箱就不讨论了）中表现富文本内容呢。</p>
<p>&nbsp;</p>
<p style="text-align: center;"><a href="http://www.36ria.com/4892/%e8%81%9a%e5%88%92%e7%ae%97-2" rel="attachment wp-att-4902"><img class="aligncenter size-full wp-image-4902" title="聚划算" src="http://www.36ria.com/wp-content/uploads/2012/02/聚划算1.jpg" alt="" width="594" height="201" /></a></p>
<p>&nbsp;</p>
<p>遇到这样的视觉稿的话，什么<a href="http://www.36ria.com/3399">双飞翼布局yui3布局</a>的大家还是别指望了，因为邮件客户端不支持某些看起来很基础的html和css。目前为大家所知的<a title="邮件客户端" href="http://zh.wikipedia.org/zh/%E7%94%B5%E5%AD%90%E9%82%AE%E4%BB%B6%E5%AE%A2%E6%88%B7%E7%AB%AF%E6%AF%94%E8%BE%83" target="_blank">邮件客户端</a>有微软的microsoft office outlook、苹果的apple mail、mozilla的mozilla Thunderbird等等，其中用户数量占据霸主地位的当然非outlook莫属，以下是全球的邮件客户端的市场占有率统计图，在特殊国情的我国outlook的占有率应该更高了。</p>
<p>&nbsp;</p>
<p style="text-align: center;"><a href="http://www.36ria.com/4892/email-client" rel="attachment wp-att-4903"><img class="aligncenter size-full wp-image-4903" title="email client" src="http://www.36ria.com/wp-content/uploads/2012/02/email-client.jpg" alt="" width="626" height="311" /></a></p>
<p style="text-align: left;">下面以常用的microsoft office outlook 2007客户端为例，看看html和css的兼容性问题。根据<a title="outlook" href="http://msdn.microsoft.com/en-us/library/aa338201.aspx" target="_blank">微软官方outlook 2007</a>文档指出，outlook 2007采用和word 2007一样的引擎解析渲染含html/css的内容。outlook 2007部分支持HTML 4.0.1，同时部分支持css1。</p>
<p>&nbsp;</p>
<h3>outlook 2007不支持html 4.0.1的标签有：</h3>
<ul>
<li>applet/bdo</li>
<li>button/form/input/select/option  不支持form、button、input、select等表单元素，所以在邮件中直接提问让用户填写的方式不可行，所以一般都是给出超链接，让用户去新的链接地址进行进一步操作。</li>
<li>noframes/iframe   不支持iframe，所以邮件中无法嵌入网页</li>
<li>isindex/menu</li>
<li>object 所以邮件中flash什么的不建议用</li>
<li>optgroup/param/q</li>
<li>noscript/script  不支持script，所以不支持js</li>
</ul>
<p>&nbsp;</p>
<h3>outlook 2007不支持html 4.0.1的标签属性有：</h3>
<ul>
<li>accept-charset/accept/accesskey/archive/</li>
<li>background/checked/classid/code/codecore/</li>
<li>codetype/compact/data/declare/defer/disabled/</li>
<li>enctype/longdesc/marginheight/marginwidth/</li>
<li>media ( screen | print | projection | braille | speech | all )/method/multiple/noresize/object/</li>
<li><strong>onblur/onchange/onclick/ondblclick/onfocus/onkeydown/onkeypress/</strong></li>
<li><strong>onkeyup/</strong><strong>onload/onmousedown/onmousemove/onmouseout</strong></li>
<li><strong>/onmouseover/</strong><strong>onmouseup/</strong><strong>onreset/onselect/onsubmit/onunload</strong>/</li>
<li>readonly/scrolling/selected/standby/tabindex/title/valuetype</li>
</ul>
<p>上面的这些onblur/onfocus/onsubmit/onclick事件属性的不支持，加上也不支持script标签，所以outlook完全不支持javascript。</p>
<p>&nbsp;</p>
<h3>某些标签的某些属性值，outlook 2007也表示不支持，如下：</h3>
<table>
<tbody>
<tr>
<th colspan="1">textarea</th>
<th colspan="1">cols</th>
</tr>
<tr>
<td colspan="1" style="text-align: center">td</td>
<td colspan="1" style="text-align: center">colspan=0</td>
</tr>
<tr>
<td colspan="1" style="text-align: center">th</td>
<td colspan="1" style="text-align: center">colspan=0</td>
</tr>
<tr>
<td colspan="1" style="text-align: center">frame</td>
<td colspan="1" style="text-align: center">frameborder=0</td>
</tr>
<tr>
<td colspan="1" style="text-align: center">td</td>
<td colspan="1" style="text-align: center">rowspan=0</td>
</tr>
<tr>
<td colspan="1" style="text-align: center">th</td>
<td colspan="1" style="text-align: center">rowspan=0</td>
</tr>
</tbody>
</table>
<p>&nbsp;</p>
<h3>outlook 2007不支持css1的样式有：</h3>
<ul>
<li>background-position/background-repeat/background-image/background-attachment   所以别用css背景图，需要用图片的地方请直接用img元素</li>
<li>display  不支持display，yui3布局pass</li>
<li>float/clear 不支持浮动，双飞翼布局pass，故table布局是首选。</li>
<li>list-style-image/list-style-position</li>
<li>text-transform/word-spacing</li>
</ul>
<p>&nbsp;</p>
<h3>结合其他邮件客户端，邮件html的编写还需要注意：</h3>
<p>1.&lt;link rel=”stylesheet” ……虽然outlook2007支持css外链，但是其他如yahoo、gmail的客户端等<a href="http://www.hanlinweb.com/edm-mail-for-the-full-version.html">客户端邮箱不支持</a>，而实现样式还有其他方式可替代，所以建议选择直接在内联的style属性上面。</p>
<p>2.css背景图片不建议加，可用img标签代替，但是一方面img图片本身的大小比文本型肯定要大很多，图片过大导致整个邮件过大会被容易视为垃圾邮件；另外一方面图片在outlook2007等大部分邮件客户端基于安全考虑不会下载图片，而是要右键一下手动允许下载才行，所以图片最初是显示不出来的，为了不打乱布局，最好的方法是给图片加上width、height和alt属性，alt描述了未下载图片的内容。</p>
<p><a href="http://www.36ria.com/4892/%e5%9b%be%e7%89%87%e8%a2%ab%e7%a6%81%e6%ad%a2%e4%b8%8b%e8%bd%bd" rel="attachment wp-att-4906"><img class="aligncenter size-medium wp-image-4906" title="图片被禁止下载" src="http://www.36ria.com/wp-content/uploads/2012/02/图片被禁止下载-295x200.jpg" alt="" width="295" height="200" /></a></p>
<p>3.因web邮箱的流行，所以一般html邮件不包含html和head标签，body里面的内容可直接作为web邮箱页面的一部分，在客户端邮箱显示也正常。</p>
<p>4.因邮件客户端的自身宽度原因，html邮件页面宽度一般为550-650px。</p>
<p>5.关于EMD电子邮件营销的更多问题，如：如何让你的html邮件防止被过滤，如何提高电子邮件营销的效果等，可以参考《<a href="http://www.lyris.com/media/pdf/whitepapers/whitepaper_87_tips_tricks.pdf">87 ways to improve your email marketing</a>》、《<a href="http://www.lyris.com/media/pdf/whitepapers/503_Lyris_Guru%27sGuide_2008.pdf">guide to Email Marketing success</a>》。</p>
<p>&nbsp;</p>
<h3>参考资料：</h3>
<p><a href="http://msdn.microsoft.com/en-us/library/aa338201.aspx">Word 2007 HTML and CSS Rendering Capabilities in Outlook 2007 (Part 1 of 2)</a></p>
<p><a href="http://www.lyris.com/media/pdf/whitepapers/emaillabs_html_guide.pdf">The complete guide for creating html emails: technical and design best practices</a></p>
<p><a href="http://www.hanlinweb.com/edm-mail-for-the-full-version.html">http://www.hanlinweb.com/edm-mail-for-the-full-version.html</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.36ria.com/4892/feed</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>发布jasmine-kissy</title>
		<link>http://www.36ria.com/4880</link>
		<comments>http://www.36ria.com/4880#comments</comments>
		<pubDate>Wed, 08 Feb 2012 12:18:11 +0000</pubDate>
		<dc:creator>明河</dc:creator>
				<category><![CDATA[javascript]]></category>
		<category><![CDATA[Jasmine]]></category>
		<category><![CDATA[前端单元测试]]></category>
		<category><![CDATA[单元测试]]></category>

		<guid isPermaLink="false">http://www.36ria.com/?p=4880</guid>
		<description><![CDATA[jasmine-kissy向Jasmine增加二个功能： .快速加载html片段。jsTestDriver使用jasmine-jstd-adapter(jasmine对jsTestDriver的适配器)，由于有自己的测试运行页面，无法向运行页面插入测试用html片段，所以在你的spec脚本中需要插入html片段。 增加用于KISSY的machers，目前只作用于KISSY的Node模块。 代码下载和说明文档：https://github.com/minghe/jasmine-kissy 明河为什么写jasmine-kissy？ 明河是使用jsTestDriver测试......]]></description>
			<content:encoded><![CDATA[<p>jasmine-kissy向Jasmine增加二个功能：</p>
<ul>
<li>.快速加载html片段。jsTestDriver使用<a href="https://github.com/ibolmo/jasmine-jstd-adapter" title="jasmine-jstd-adapter" target="_blank">jasmine-jstd-adapter</a>(jasmine对jsTestDriver的适配器)，由于有自己的测试运行页面，无法向运行页面插入测试用html片段，所以在你的spec脚本中需要插入html片段。</li>
<li>增加用于KISSY的machers，目前只作用于KISSY的Node模块。</li>
</ul>
<p><b>代码下载和说明文档：</b><a href="https://github.com/minghe/jasmine-kissy" title="jasmine-kissy" target="_blank">https://github.com/minghe/jasmine-kissy</a></p>
<h4>明河为什么写jasmine-kissy？</h4>
<p>明河是使用<a href="http://code.google.com/p/js-test-driver/wiki/DesignPrinciples" title="js-test-driver" target="_blank">jsTestDriver</a>测试工具来运行jasmine的单元测试代码，遇到一个问题：<br />
jsTestDriver没有使用jasmine的跑单元测试的html页面，它只有本地的服务器路径，比如：http://localhost:9876/capture。很多情况我们需要在页面中插入测试用的html片段，比如明河想要测试分享组件，我需要向页面插入个容器</p>
<div class="hl-surround"><ol class="hl-main ln-show" title="Double click to hide line number." ondblclick = "linenumber(this)"><li class="hl-firstline"><span style="color: Olive;">&lt;</span><span style="color: Green;">div</span><span style="color: Gray;"> </span><span style="color: #00008b;">id</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">J_ShareListWrapper</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">&gt;&lt;/</span><span style="color: Green;">div</span><span style="color: Olive;">&gt;</span></li></ol></div>
<p>，在jsTestDriver中只能使用js向body插入dom结构。如果你的dom结构很简单，那没什么问题，但是如果你的html片段非常长，在测试js中用脚本插入html片段就非常蛋疼，极度不利于维护。<br />
如何解决这个问题呢？</p>
<h5>使用ajax加载html片段</h5>
<p>利用ajax的确可以解决问题，但又引入了一个新的问题：如何处理异步的测试呢？难道每次都加waits()和run()，那更蛋疼&#8230;<br />
大多人觉得ajax=异步，其实这是不对的，ajax也可以是阻塞式加载。在kissy的ajax方法加个参数<strong>async:false</strong>，关闭异步加载方式。正是使用阻塞式加载，可以避免使用waits()+run()的异步繁琐方式。</p>
<h4>jasmine-kissy的用法</h4>
<h5>1.全局变量</h5>
<p>为了方便测试用例页面直接使用，定义了几个全局变量:</p>
<ul>
<li><strong>JF</strong>：JamineFixture的实例，使用JF的<strong>load()</strong>读取html片段</li>
<li><strong>S</strong>：KISSY的缩写变量</li>
<li><strong>$</strong>：KISSY.Node.all的缩写变量</li>
</ul>
<h5>2.加载html片段</h5>
<p>在<strong>jsTestDriver.conf</strong>中需要加载静态html片段文件，比如：</p>
<p>必须先配置html片段所放的目录路径，<strong>JF.path = &#8216;spec/fixtures&#8217;</strong>。<br />
特别留意在jsTestDriver中起始路径应该是<strong>http://localhost:9876/test/</strong><br />
假设在你的spec/fixtures目录有个html片段文件jasmine-kissy_fixture.html。</p>
<div class="hl-surround"><ol class="hl-main ln-show" title="Double click to hide line number." ondblclick = "linenumber(this)"><li class="hl-firstline"><span style="color: Gray;">serve:</span></li>
<li><span style="color: Gray;"> - spec/fixtures/*.html</span></li></ol></div>
<p>加载spec/fixtures/目录下的所有html文件。<br />
<strong>这是必须配置的！不然使用ajax加载时会报找不到文件的错误！</strong><br />
文件的内容如下：<br />
my name is minghe.<br />
使用如下语法加载这个文件：</p>
<div class="hl-surround"><ol class="hl-main ln-show" title="Double click to hide line number." ondblclick = "linenumber(this)"><li class="hl-firstline"><span style="color: Blue;">JF</span><span style="color: Gray;">.</span><span style="color: Blue;">load</span><span style="color: Olive;">(</span><span style="color: #8b0000;">'</span><span style="color: Red;">jasmine-kissy_fixture.html</span><span style="color: #8b0000;">'</span><span style="color: Olive;">)</span><span style="color: Gray;">;</span></li></ol></div>
<p>你可以测试下#test这个div是否存在：</p>
<div class="hl-surround"><ol class="hl-main ln-show" title="Double click to hide line number." ondblclick = "linenumber(this)"><li class="hl-firstline"><span style="color: Blue;">expect</span><span style="color: Olive;">(</span><span style="color: Gray;">$</span><span style="color: Olive;">(</span><span style="color: #8b0000;">'</span><span style="color: Red;">#test</span><span style="color: #8b0000;">'</span><span style="color: Olive;">))</span><span style="color: Gray;">.</span><span style="color: Blue;">toExist</span><span style="color: Olive;">()</span><span style="color: Gray;">;</span></li></ol></div>
<p>(ps:<strong>toExist()</strong>是jasmine-kissy新增的macher，用于测试节点是否存在)</p>
<p>加载的片段会放入缓存，避免重复加载。</p>
<p>需要加载多个文件，语法如下：</p>
<div class="hl-surround"><ol class="hl-main ln-show" title="Double click to hide line number." ondblclick = "linenumber(this)"><li class="hl-firstline"><span style="color: Blue;">JF</span><span style="color: Gray;">.</span><span style="color: Blue;">load</span><span style="color: Olive;">(</span><span style="color: #8b0000;">'</span><span style="color: Red;">jasmine-kissy_fixture.html</span><span style="color: #8b0000;">'</span><span style="color: Gray;">，</span><span style="color: #8b0000;">'</span><span style="color: Red;">jasmine-kissy-2_fixture.html</span><span style="color: #8b0000;">'</span><span style="color: Olive;">)</span><span style="color: Gray;">;</span></li></ol></div>
<p>加载的html片段会放在页面的测试容器内，容器id为#J_JF。</p>
<p>清理html片段，（jasmine-kissy会自动清理），使用<strong>JF.clean()</strong>。</p>
<p>清理缓存，使用<strong>JF.cleanCache()</strong>。</p>
<h5>3.KISSY matchers</h5>
<p>留意这些matcher目前只适用于KISSY的Node方式。</p>
<ul>
<li>toExist() 测试节点的存在性</li>
<li>toHasClass() 测试节点是否拥有指定的class名</li>
<li>toHasAttr() 测试节点是否拥有指定的属性值</li>
<li>toHasProp() 测试节点是否拥有指定的property值</li>
<li>toHasData() 测试节点是否拥有指定扩展属性值</li>
<li>toContain() 测试节点是否有子节点</li>
<li>toEqualValue() 测试节点的的value值</li>
<li>toEqualText() 测试节点的text</li>
</ul>
<p>示例代码：</p>
<div class="hl-surround"><ol class="hl-main ln-show" title="Double click to hide line number." ondblclick = "linenumber(this)"><li class="hl-firstline"><span style="color: Blue;">expect</span><span style="color: Olive;">(</span><span style="color: Gray;">$</span><span style="color: Olive;">(</span><span style="color: #8b0000;">'</span><span style="color: Red;">#test</span><span style="color: #8b0000;">'</span><span style="color: Olive;">))</span><span style="color: Gray;">.</span><span style="color: Blue;">toHasClass</span><span style="color: Olive;">(</span><span style="color: #8b0000;">'</span><span style="color: Red;">test-wrapper</span><span style="color: #8b0000;">'</span><span style="color: Olive;">)</span><span style="color: Gray;">;</span></li>
<li><span style="color: Blue;">expect</span><span style="color: Olive;">(</span><span style="color: Gray;">$</span><span style="color: Olive;">(</span><span style="color: #8b0000;">'</span><span style="color: Red;">#test</span><span style="color: #8b0000;">'</span><span style="color: Olive;">))</span><span style="color: Gray;">.</span><span style="color: Blue;">toEqualText</span><span style="color: Olive;">(</span><span style="color: #8b0000;">'</span><span style="color: Red;">my name is minghe.</span><span style="color: #8b0000;">'</span><span style="color: Olive;">)</span><span style="color: Gray;">;</span></li></ol></div>
]]></content:encoded>
			<wfw:commentRss>http://www.36ria.com/4880/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>用reveal.js做幻灯片</title>
		<link>http://www.36ria.com/4856</link>
		<comments>http://www.36ria.com/4856#comments</comments>
		<pubDate>Fri, 20 Jan 2012 02:53:35 +0000</pubDate>
		<dc:creator>飞绿</dc:creator>
				<category><![CDATA[css3]]></category>
		<category><![CDATA[javascript]]></category>

		<guid isPermaLink="false">http://www.36ria.com/?p=4856</guid>
		<description><![CDATA[如果你想你的在线分享给人留下深刻的印象，可以考虑用reveal.js。reveal.js是一个制作3D幻灯片效果的插件，它同时应用最新的web技术，来创建漂亮的html演示效果。 reveal.js不依赖其他任何javascript库，是一个独立的javascript插件库。 当然，它应用了最新web新技术，所以需要浏览器对CSS 3D变形的支持，这就意味着在IE下看不到漂亮的动画效果。在safari、chrome、firefox下效果都很好。不......]]></description>
			<content:encoded><![CDATA[<p>如果你想你的在线分享给人留下深刻的印象，可以考虑用reveal.js。reveal.js是一个制作3D幻灯片效果的插件，它同时应用最新的web技术，来创建漂亮的html演示效果。 reveal.js不依赖其他任何javascript库，是一个独立的javascript插件库。<br />
当然，它应用了最新web新技术，所以需要浏览器对CSS 3D变形的支持，这就意味着在IE下看不到漂亮的动画效果。在safari、chrome、firefox下效果都很好。不过如果浏览器不支持CSS 3D，那么会以2D效果呈现。</p>
<ul class="tow-columns clearfix">
<li class="l"><a href="http://lab.hakim.se/reveal-js/#/" class="btn-view-demo" target="_blank">点此查看demo</a></li>
</ul>
<h3>特征：</h3>
<ul>
<li>导航控制</li>
<li>支持键盘导航</li>
<li>带进度条</li>
<li>内置代码语法高亮（highlight.js）</li>
<li>支持幻灯片预览</li>
<li>多层次、嵌套式幻灯片</li>
<li>独特的网址书签和内部链接</li>
<li>各种主题和各种变形效果（立方体、翻页、陷下……）</li>
<li>支持触屏设备</li>
</ul>
<h3>截图：</h3>
<p><a href="http://www.36ria.com/4856/1-16" rel="attachment wp-att-4866"><img src="http://www.36ria.com/wp-content/uploads/2012/01/1.jpg" alt="" title="1" width="500" height="330" class="alignnone size-full wp-image-4866" /></a><br />
<a href="http://www.36ria.com/4856/2-15" rel="attachment wp-att-4867"><img src="http://www.36ria.com/wp-content/uploads/2012/01/2.jpg" alt="" title="2" width="500" height="331" class="alignnone size-full wp-image-4867" /></a><br />
<a href="http://www.36ria.com/4856/3-19" rel="attachment wp-att-4868"><img src="http://www.36ria.com/wp-content/uploads/2012/01/3.jpg" alt="" title="3" width="500" height="332" class="alignnone size-full wp-image-4868" /></a><br />
<a href="http://www.36ria.com/4856/4-17" rel="attachment wp-att-4869"><img src="http://www.36ria.com/wp-content/uploads/2012/01/4.jpg" alt="" title="4" width="500" height="331" class="alignnone size-full wp-image-4869" /></a></p>
<p>文章翻译自<a href="http://www.queness.com/post/10361/use-revealjs-to-create-css-3d-slideshow" target="_blank">Use Reveal.js to Create CSS 3D Slideshow</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.36ria.com/4856/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>使用JsTestDriver插件—idea使用技巧</title>
		<link>http://www.36ria.com/4823</link>
		<comments>http://www.36ria.com/4823#comments</comments>
		<pubDate>Mon, 16 Jan 2012 11:37:09 +0000</pubDate>
		<dc:creator>明河</dc:creator>
				<category><![CDATA[前端开发工具]]></category>
		<category><![CDATA[idea使用技巧]]></category>
		<category><![CDATA[JsTestDriver]]></category>

		<guid isPermaLink="false">http://www.36ria.com/?p=4823</guid>
		<description><![CDATA[去年一整年关于前端开发工具，明河写了不少教程，可以看《web前端开发七武器》，里面有文章列表。 今天介绍著名的IDE—idea11的技巧：如何集成JsTestDriver对js单元测试代码进行自动化测试，说白了，就是如何一键批量跑单元测试js。 什么是JsTestDriver JsTestDriver官网：http://code.google.com/p/js-test-driver/，经常被墙上不了-_-! 首先，JsTestDriver是一个TDD式js单元测试框架，作用类似明河......]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.36ria.com/4823/idea-jstestdriver-11" rel="attachment wp-att-4849"><img src="http://www.36ria.com/wp-content/uploads/2012/01/idea-jsTestDriver1.png" alt="" title="idea-jsTestDriver" width="680" height="200" class="alignnone size-full wp-image-4849" /></a><br />
去年一整年关于前端开发工具，明河写了不少教程，可以看<a href="http://www.36ria.com/3795" title="web前端开发七武器">《web前端开发七武器》</a>，里面有文章列表。<br />
今天介绍著名的IDE—idea11的技巧：如何集成JsTestDriver对js单元测试代码进行自动化测试，说白了，就是如何一键批量跑单元测试js。</p>
<h4>什么是JsTestDriver</h4>
<p>JsTestDriver官网：<a href="http://code.google.com/p/js-test-driver/" target="_blank">http://code.google.com/p/js-test-driver/</a>，经常被墙上不了-_-!<br />
首先，JsTestDriver是一个TDD式js单元测试框架，作用类似明河和苏河之前介绍过的<a href="http://www.36ria.com/4457" title="Jasmine入门教程—web前端开发七武器（上）" target="_blank">jasmine</a>；<br />
其次，JsTestDriver是一个单元测试自动化工具，它并不是非得使用自家的测试框架，使用第三方的测试框架也是可以的，比如jasmine、qunit、junit的等。本文主要使用jasmine（淘宝前端基本上都是使用这个单元测试框架，很易用，也有JsTestDriver的适配器）。<br />
阅读推荐：</p>
<ul>
<li><a href="http://www.open-open.com/lib/view/1322640524327" title="高效 JavaScript 单元测试" target="_blank">高效JavaScript单元测试</a></li>
<li><a href="http://net.tutsplus.com/tutorials/javascript-ajax/test-driven-javascript-development-in-practice/" title="Test-Driven JavaScript Development in Practice" target="_blank">Test-Driven JavaScript Development in Practice</a></li>
<li><a href="http://blog.theanalogguy.be/2011/01/25/automated-javascript-unit-testing-with-jstestdriver/" title="Automated Javascript unit testing with JsTestDriver" target="_blank">Automated Javascript unit testing with JsTestDriver</a></li>
<li><a href="http://msdn.microsoft.com/en-us/scriptjunkie/gg655487.aspx" target="_blank">Unit Testing 101: Are You Testing Your JavaScript?</a>
</li>
</ul>
<h4>安装JsTestDriver插件</h4>
<p>进入idea的“setter”界面，找到“plugins”：<br />
<a href="http://www.36ria.com/4823/idea-jstestdriver" rel="attachment wp-att-4837"><img src="http://www.36ria.com/wp-content/uploads/2012/01/idea-jsTestDriver.png" alt="" title="idea-jsTestDriver" width="647" height="177" class="alignnone size-full wp-image-4837" /></a><br />
这是常规手段，插件服务器不给力，经常连不上，这时候请到idea的插件页下载，<a href="http://plugins.intellij.net/plugin/?idea&#038;id=4468" target="_blank">传送门在此</a>。<br />
下载下来后，解压到你的idea配置目录下的plugins目录下，明河机子上是“c:\Users\Administrator\.IntelliJIdea11\config\plugins”。重启下idea，不出意外的话将会多出<br />
jsTestDriver的界面，比如下图：<br />
<a href="http://www.36ria.com/4823/idea-jstestdriver-2" rel="attachment wp-att-4838"><img src="http://www.36ria.com/wp-content/uploads/2012/01/idea-jsTestDriver-2.png" alt="" title="idea-jsTestDriver-2" width="588" height="256" class="alignnone size-full wp-image-4838" /></a></p>
<h4>运行个jsTestDriver的示例工程</h4>
<p>下载<a href="http://confluence.jetbrains.net/download/attachments/41490213/greeter-sample.zip" title="greeter-sample" target="_blank">greeter-sample.zip</a>。解压出来后，使用idea打开这个工程。<br />
如果第一次打开GreeterTest.js，TestCase方法的错误提示，移动焦点到代码上，使用<strong>Alt+Enter/Option+Enter</strong>，选择“Add JsTestDriver assertion framework support”。在js类库中会增加JsTestDriver语法提示等。<br />
<a href="http://www.36ria.com/4823/idea-jstestdriver-3" rel="attachment wp-att-4841"><img src="http://www.36ria.com/wp-content/uploads/2012/01/idea-jsTestDriver-3.png" alt="" title="idea-jsTestDriver-3" width="649" height="210" class="alignnone size-full wp-image-4841" /></a></p>
<h5>运行JsTestDriver服务器</h5>
<p><a href="http://www.36ria.com/4823/idea-jstestdriver-4" rel="attachment wp-att-4842"><img src="http://www.36ria.com/wp-content/uploads/2012/01/idea-jsTestDriver-4.png" alt="" title="idea-jsTestDriver-4" width="620" height="176" class="alignnone size-full wp-image-4842" /></a><br />
复制url到你想要运行单元测试的浏览器上。<br />
<a href="http://www.36ria.com/4823/idea-jstestdriver-5" rel="attachment wp-att-4843"><img src="http://www.36ria.com/wp-content/uploads/2012/01/idea-jsTestDriver-5.png" alt="" title="idea-jsTestDriver-5" width="617" height="180" class="alignnone size-full wp-image-4843" /></a></p>
<h5>开始run测试集</h5>
<p>选择“greeter.jstd”，会有个run选项。<br />
<a href="http://www.36ria.com/4823/idea-jstestdriver-6" rel="attachment wp-att-4844"><img src="http://www.36ria.com/wp-content/uploads/2012/01/idea-jsTestDriver-6.png" alt="" title="idea-jsTestDriver-6" width="620" height="203" class="alignnone size-full wp-image-4844" /></a><br />
更详细的教程可以看：<a href="http://blog.jetbrains.com/webide/2011/10/javascript-unit-testing-support/" target="_blank">http://blog.jetbrains.com/webide/2011/10/javascript-unit-testing-support/</a>。<br />
接下来明河关键要讲下如何适配jasmine。</p>
<h4>使用JsTestDriver运行jasmine的测试代码</h4>
<h5>通过jasmine-jstd-adapter来适配JsTestDriver</h5>
<p>请先到<a href="https://github.com/ibolmo/jasmine-jstd-adapter" title="jasmine-jstd-adapter" target="_blank">jasmine-jstd-adapter</a>首页下载个JasmineAdapter.js。</p>
<h5>在工程根目录创建jstestdriver.conf文件</h5>
<p>文件的内容类似如下：</p>
<div class="hl-surround"><ol class="hl-main ln-show" title="Double click to hide line number." ondblclick = "linenumber(this)"><li class="hl-firstline"><span style="color: Gray;">server: http://localhost:9876</span></li>
<li><span style="color: Gray;">load:</span></li>
<li><span style="color: Gray;">&nbsp; - tool/jasmine/jasmine.js</span></li>
<li><span style="color: Gray;">&nbsp; - tool/jasmine/JasmineAdapter.js</span></li>
<li><span style="color: Gray;">&nbsp; - tool/jasmine/jasmine-html.js</span></li>
<li><span style="color: Gray;">test:</span></li>
<li><span style="color: Gray;"> - spec/*.js</span></li></ol></div>
<p>jstestdriver的配置文件，采用YAML的格式，</p>
<ul>
<li>server：服务器路径</li>
<li>load：依赖脚本</li>
<li>test：测试脚本</li>
</ul>
<p>load依赖脚本，假设你的工程目录结构跟明河类似：<br />
<a href="http://www.36ria.com/4823/idea-jstestdriver-7" rel="attachment wp-att-4845"><img src="http://www.36ria.com/wp-content/uploads/2012/01/idea-jsTestDriver-7.png" alt="" title="idea-jsTestDriver-7" width="200" height="207" class="alignnone size-full wp-image-4845" /></a></p>
<h5>导入JsTestDriver配置</h5>
<p>右击工程顶点目录，可以找到“creat XX”的选项（选项图标是JsTestDriver的logo），弹出一个配置确认页，直接确定就好，然后在idea的上方会出现如下图界面：<br />
<a href="http://www.36ria.com/4823/idea-jstestdriver-8" rel="attachment wp-att-4846"><img src="http://www.36ria.com/wp-content/uploads/2012/01/idea-jsTestDriver-8.png" alt="" title="idea-jsTestDriver-8" width="271" height="46" class="alignnone size-full wp-image-4846" /></a><br />
点击绿色图标就开始跑jasmine测试！！！<br />
<a href="http://www.36ria.com/4823/idea-jstestdriver-9" rel="attachment wp-att-4847"><img src="http://www.36ria.com/wp-content/uploads/2012/01/idea-jsTestDriver-9.png" alt="" title="idea-jsTestDriver-9" width="589" height="256" class="alignnone size-full wp-image-4847" /></a></p>
<h4>解决JsTestDriver测试ajax异步过程问题</h4>
<p>假设你的ajax请求的路径指向fixtures下的文件：<br />
<a href="http://www.36ria.com/4823/idea-jstestdriver-10" rel="attachment wp-att-4848"><img src="http://www.36ria.com/wp-content/uploads/2012/01/idea-jsTestDriver-10.png" alt="" title="idea-jsTestDriver-10" width="224" height="143" class="alignnone size-full wp-image-4848" /></a><br />
直接运行测试代码会报文件找不到的错误。<br />
这并不是JsTestDriver的bug，而是你需要在jstestdriver.conf中配置加载静态文件。<br />
比如增加下面的配置：</p>
<div class="hl-surround"><ol class="hl-main ln-show" title="Double click to hide line number." ondblclick = "linenumber(this)"><li class="hl-firstline"><span style="color: Gray;">serve:</span></li>
<li><span style="color: Gray;"> - spec/fixtures/*.html</span></li></ol></div>
<p>留意这个参数是<strong>serve</strong>不是配置服务器的<strong>server</strong>。<br />
上面的配置，会加载spec/fixtures/下的所有html文件，留意是对应的路劲是在<strong>test</strong>目录下，也就是说路径应该是“http://localhost:9876/test/spec/fixtures/upload-success.html”。</p>
<h4>解决缺少运行页面不方便插入html片段问题</h4>
<p>如果你是kissy的使用者，那么可以使用明河写的<a href="https://github.com/minghe/jasmine-kissy" title="jasmine-kissy" target="_blank">jasmine-kissy</a>，首页有详细的使用说明，下一篇教程也会说明。<br />
如果你是jquery的使用者，请使用<a href="https://github.com/velesin/jasmine-jquery" title="jasmine-jquery" target="_blank">jasmine-jquery</a>。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.36ria.com/4823/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>ant结合jsdoc构建js文档—ant入门指南8</title>
		<link>http://www.36ria.com/4816</link>
		<comments>http://www.36ria.com/4816#comments</comments>
		<pubDate>Sun, 08 Jan 2012 11:39:57 +0000</pubDate>
		<dc:creator>明河</dc:creator>
				<category><![CDATA[前端开发工具]]></category>
		<category><![CDATA[ant教程]]></category>
		<category><![CDATA[jsdoc]]></category>

		<guid isPermaLink="false">http://www.36ria.com/?p=4816</guid>
		<description><![CDATA[上一篇教程明河演示了如何使用ant自动压缩文件，今天讲解ant如何ant结合jsdoc构建js文档。 JsDoc Toolkit 是一个将抽离js代码中的注释形成文档的程序，利用ant，你可以自动化打包js文档，需要用到的工具是jsdoc-toolkit-ant-task。调用的过程其实非常简单，整个过程类似ant调用yui-compressor。 下面的代码中，明河通过构建kissy-form库（明河和其他同事一起写的form组件集，目前还在编码阶......]]></description>
			<content:encoded><![CDATA[<p>上一篇教程明河演示了如何使用ant自动压缩文件，今天讲解ant如何ant结合jsdoc构建js文档。<br />
<strong><a href="http://code.google.com/p/jsdoc-toolkit/" title="jsdoc-toolkit" target="_blank">JsDoc Toolkit </a></strong>是一个将抽离js代码中的注释形成文档的程序，利用ant，你可以自动化打包js文档，需要用到的工具是<strong><a href="http://code.google.com/p/jsdoc-toolkit-ant-task/" title="jsdoc-toolkit-ant-task" target="_blank">jsdoc-toolkit-ant-task</a></strong>。调用的过程其实非常简单，整个过程类似ant调用yui-compressor。<br />
下面的代码中，明河通过构建<a href="https://github.com/minghe/kissy-form" title="kissy-form" target="_blank">kissy-form</a>库（明河和其他同事一起写的form组件集，目前还在编码阶段）的文档，演示jsdoc的用法。</p>
<h4>1.准备</h4>
<p>假设你已经下载了jsdoc-toolkit-ant-task，且保证你的js代码风格符合jsdoc要求，比如下面的代码：</p>
<div class="hl-surround"><ol class="hl-main ln-show" title="Double click to hide line number." ondblclick = "linenumber(this)"><li class="hl-firstline"><span style="color: Green;">var</span><span style="color: Gray;"> </span><span style="color: Blue;">MyClass</span><span style="color: Gray;"> = </span><span style="color: Blue;">Class</span><span style="color: Gray;">.</span><span style="color: Blue;">create</span><span style="color: Olive;">(</span><span style="color: Gray;">&nbsp; </span></li>
<li><span style="color: #ffa500;">/** @lends MyClass# */</span><span style="color: Gray;">&nbsp; </span></li>
<li><span style="color: Olive;">{</span><span style="color: Gray;">&nbsp; </span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: #ffa500;">/** </span></li>
<li><span style="color: #ffa500;">&nbsp; &nbsp;&nbsp; * Description of constructor. </span></li>
<li><span style="color: #ffa500;">&nbsp; &nbsp;&nbsp; * @class Description of class. </span></li>
<li><span style="color: #ffa500;">&nbsp; &nbsp;&nbsp; * @constructs </span></li>
<li><span style="color: #ffa500;">&nbsp; &nbsp;&nbsp; */</span><span style="color: Gray;">&nbsp; </span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Blue;">initialize</span><span style="color: Gray;"> : </span><span style="color: Green;">function</span><span style="color: Olive;">(</span><span style="color: Blue;">arg0</span><span style="color: Gray;">, </span><span style="color: Blue;">arg1</span><span style="color: Olive;">)</span><span style="color: Gray;">&nbsp;</span><span style="color: Olive;">{</span><span style="color: Gray;">&nbsp; </span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: #ffa500;">//...&nbsp; </span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Olive;">}</span><span style="color: Gray;">,&nbsp; </span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: #ffa500;">/** A method. */</span><span style="color: Gray;">&nbsp; </span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Blue;">myFunc</span><span style="color: Gray;"> : </span><span style="color: Green;">function</span><span style="color: Olive;">()</span><span style="color: Gray;">&nbsp;</span><span style="color: Olive;">{</span><span style="color: Gray;">&nbsp; </span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Olive;">}</span><span style="color: Gray;">,&nbsp; </span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: #ffa500;">/** An instance field. */</span><span style="color: Gray;">&nbsp; </span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Blue;">myVar</span><span style="color: Gray;"> : </span><span style="color: Maroon;">123</span><span style="color: Gray;">&nbsp; </span></li>
<li><span style="color: Olive;">})</span><span style="color: Gray;">;&nbsp; </span></li>
<li><span style="color: Gray;">&nbsp; </span></li>
<li><span style="color: #ffa500;">// ... and if you want to add class fields ...&nbsp; </span></li>
<li><span style="color: Gray;">&nbsp; </span></li>
<li><span style="color: Blue;">Object</span><span style="color: Gray;">.</span><span style="color: Blue;">extend</span><span style="color: Olive;">(</span><span style="color: Blue;">MyClass</span><span style="color: Gray;">,&nbsp; </span></li>
<li><span style="color: #ffa500;">/** @lends MyClass */</span><span style="color: Gray;">&nbsp; </span></li>
<li><span style="color: Olive;">{</span><span style="color: Gray;">&nbsp; </span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: #ffa500;">/** A class method. */</span><span style="color: Gray;">&nbsp; </span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Blue;">classFunc</span><span style="color: Gray;"> : </span><span style="color: Green;">function</span><span style="color: Olive;">()</span><span style="color: Gray;">&nbsp;</span><span style="color: Olive;">{</span><span style="color: Gray;">&nbsp; </span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Olive;">}</span><span style="color: Gray;">&nbsp; </span></li>
<li><span style="color: Olive;">})</span><span style="color: Gray;">;</span></li></ol></div>
<p>详尽的jsdoc语法说明，请看jsdoc的<a href="http://code.google.com/p/jsdoc-toolkit/w/list" title="jsdoc-toolkit-wiki" target="_blank">wiki</a>。</p>
<h4>2.定义property</h4>
<div class="hl-surround"><ol class="hl-main ln-show" title="Double click to hide line number." ondblclick = "linenumber(this)"><li class="hl-firstline"><span style="color: #ffa500;">&lt;!--jsdoc-toolkit所在目录--&gt;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Olive;">&lt;</span><span style="color: Green;">property</span><span style="color: Gray;">&nbsp;</span><span style="color: #00008b;">name</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">jsdoc.dir</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;"> </span><span style="color: #00008b;">location</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">jsdoc-toolkit/</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;"> </span><span style="color: Olive;">/&gt;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: #ffa500;">&lt;!--源代码目录--&gt;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Olive;">&lt;</span><span style="color: Green;">property</span><span style="color: Gray;">&nbsp;</span><span style="color: #00008b;">name</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">src.dir</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;"> </span><span style="color: #00008b;">location</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">../src/</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;"> </span><span style="color: Olive;">/&gt;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: #ffa500;">&lt;!--文档输出目录--&gt;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Olive;">&lt;</span><span style="color: Green;">property</span><span style="color: Gray;">&nbsp;</span><span style="color: #00008b;">name</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">output.dir</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;"> </span><span style="color: #00008b;">location</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">../doc/</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;"> </span><span style="color: Olive;">/&gt;</span></li></ol></div>
<p>请根据你本机的情况自行修改目录。</p>
<h4>3.调用jsdoc</h4>
<div class="hl-surround"><ol class="hl-main ln-show" title="Double click to hide line number." ondblclick = "linenumber(this)"><li class="hl-firstline"><span style="color: Olive;">&lt;</span><span style="color: Green;">target</span><span style="color: Gray;"> </span><span style="color: #00008b;">name</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">render</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">&gt;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Olive;">&lt;</span><span style="color: Green;">taskdef</span><span style="color: Gray;">&nbsp;</span><span style="color: #00008b;">name</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">jsdoctoolkit</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;"> </span><span style="color: #00008b;">classname</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">uk.co.darrenhurley.ant.tasks.JsDocToolkit</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;"> </span><span style="color: #00008b;">classpath</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">${jsdoc.dir}/jsdoc-toolkit-ant-task-1.1.2.jar;${jsdoc.dir}/java/classes/js.jar</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">&gt;&lt;/</span><span style="color: Green;">taskdef</span><span style="color: Olive;">&gt;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Olive;">&lt;</span><span style="color: Green;">jsdoctoolkit</span><span style="color: Gray;">&nbsp;</span><span style="color: #00008b;">template</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">jsdoc</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;"> </span><span style="color: #00008b;">jsdochome</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">${jsdoc.dir}/</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;"> </span><span style="color: #00008b;">outputdir</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">${output.dir}/</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;"> </span><span style="color: #00008b;">inputdir</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">${src.dir}</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;"> </span><span style="color: #00008b;">encoding</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">utf-8</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">&gt;</span></li>
<li><span style="color: Gray;">&nbsp;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Olive;">&lt;/</span><span style="color: Green;">jsdoctoolkit</span><span style="color: Olive;">&gt;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Olive;">&lt;/</span><span style="color: Green;">target</span><span style="color: Olive;">&gt;</span></li></ol></div>
<p>target目标下有二个任务：<strong>taskdef</strong>定义jsdockit的程序路径，<strong>jsdoctoolkit</strong>执行真正的构建任务。<br />
接下来明河简单说明下其关键属性。</p>
<table border="0" cellspacing="0" cellpadding="0" class="tab1">
<colgroup>
<col width="160">
<col>
</colgroup>
<thead>
<tr>
<td valign="top">
<p><strong>属性</strong></p>
</td>
<td valign="top">
<p><strong>说明</strong></p>
</td>
</tr>
</thead>
<tbody>
<tr>
<td valign="top">
<p><strong>template</strong></p>
</td>
<td valign="top">
<p>文档模板</p>
</td>
</tr>
<tr>
<td valign="top">
<p><strong>outputdir</strong></p>
</td>
<td valign="top">
<p>文档输出路径</p>
</td>
</tr>
<tr>
<td valign="top">
<p><strong>inputdir</strong></p>
</td>
<td valign="top">
<p>js源码目录</p>
</td>
</tr>
<tr>
<td valign="top">
<p><strong>encoding</strong></p>
</td>
<td valign="top">
<p>输出文档页面编码，默认是utf-8</p>
</td>
</tr>
<tr>
<td valign="top">
<p><strong>depth</strong></p>
</td>
<td valign="top">
<p>程序遍历源码目录的深度，默认是10</p>
</td>
</tr>
</tbody>
</table>
<p>完成的构建代码如下：</p>
<div class="hl-surround"><ol class="hl-main ln-show" title="Double click to hide line number." ondblclick = "linenumber(this)"><li class="hl-firstline"><span style="color: Olive;">&lt;?</span><span style="color: Green;">xml</span><span style="color: Gray;"> </span><span style="color: #00008b;">version</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">1.0</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">?&gt;</span></li>
<li><span style="color: #ffa500;">&lt;!--</span></li>
<li><span style="color: #ffa500;">@author:剑平（明河）&lt;minghe36@126.com&gt;</span></li>
<li><span style="color: #ffa500;">--&gt;</span></li>
<li><span style="color: Olive;">&lt;</span><span style="color: Green;">project</span><span style="color: Gray;">&nbsp;</span><span style="color: #00008b;">name</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">doc</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;"> </span><span style="color: #00008b;">default</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">render</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;"> </span><span style="color: #00008b;">basedir</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">.</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">&gt;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: #ffa500;">&lt;!--jsdoc-toolkit所在目录--&gt;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Olive;">&lt;</span><span style="color: Green;">property</span><span style="color: Gray;">&nbsp;</span><span style="color: #00008b;">name</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">jsdoc.dir</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;"> </span><span style="color: #00008b;">location</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">jsdoc-toolkit/</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;"> </span><span style="color: Olive;">/&gt;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: #ffa500;">&lt;!--源代码目录--&gt;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Olive;">&lt;</span><span style="color: Green;">property</span><span style="color: Gray;">&nbsp;</span><span style="color: #00008b;">name</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">src.dir</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;"> </span><span style="color: #00008b;">location</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">../src/</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;"> </span><span style="color: Olive;">/&gt;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: #ffa500;">&lt;!--文档输出目录--&gt;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Olive;">&lt;</span><span style="color: Green;">property</span><span style="color: Gray;">&nbsp;</span><span style="color: #00008b;">name</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">output.dir</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;"> </span><span style="color: #00008b;">location</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">../doc/</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;"> </span><span style="color: Olive;">/&gt;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Olive;">&lt;</span><span style="color: Green;">target</span><span style="color: Gray;">&nbsp;</span><span style="color: #00008b;">name</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">render</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">&gt;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Olive;">&lt;</span><span style="color: Green;">taskdef</span><span style="color: Gray;">&nbsp;</span><span style="color: #00008b;">name</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">jsdoctoolkit</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;"> </span><span style="color: #00008b;">classname</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">uk.co.darrenhurley.ant.tasks.JsDocToolkit</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;"> </span><span style="color: #00008b;">classpath</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">${jsdoc.dir}/jsdoc-toolkit-ant-task-1.1.2.jar;${jsdoc.dir}/java/classes/js.jar</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">&gt;&lt;/</span><span style="color: Green;">taskdef</span><span style="color: Olive;">&gt;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Olive;">&lt;</span><span style="color: Green;">jsdoctoolkit</span><span style="color: Gray;">&nbsp;</span><span style="color: #00008b;">template</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">jsdoc</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;"> </span><span style="color: #00008b;">jsdochome</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">${jsdoc.dir}/</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;"> </span><span style="color: #00008b;">outputdir</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">${output.dir}/</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;"> </span><span style="color: #00008b;">inputdir</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">${src.dir}</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;"> </span><span style="color: #00008b;">encoding</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">utf-8</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">&gt;</span></li>
<li><span style="color: Gray;">&nbsp;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Olive;">&lt;/</span><span style="color: Green;">jsdoctoolkit</span><span style="color: Olive;">&gt;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Olive;">&lt;/</span><span style="color: Green;">target</span><span style="color: Olive;">&gt;</span></li>
<li><span style="color: Olive;">&lt;/</span><span style="color: Green;">project</span><span style="color: Olive;">&gt;</span></li></ol></div>
<p>下面是明河构建成功后目录情况：<br />
<a href="http://www.36ria.com/4816/jsdoc" rel="attachment wp-att-4817"><img src="http://www.36ria.com/wp-content/uploads/2012/01/jsdoc.png" alt="" title="jsdoc" width="151" height="163" class="alignnone size-full wp-image-4817" /></a><br />
有机会再给大家讲解常用的jsdoc语法。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.36ria.com/4816/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>github快速使用指南—git学习笔记</title>
		<link>http://www.36ria.com/4742</link>
		<comments>http://www.36ria.com/4742#comments</comments>
		<pubDate>Wed, 04 Jan 2012 13:35:51 +0000</pubDate>
		<dc:creator>明河</dc:creator>
				<category><![CDATA[javascript]]></category>
		<category><![CDATA[github]]></category>
		<category><![CDATA[git学习笔记]]></category>

		<guid isPermaLink="false">http://www.36ria.com/?p=4742</guid>
		<description><![CDATA[如果你是使用git作为版本控制工具，那么github基本上是必备的网站，github可以托管你的git版本库，作用类似于SourceForge和Google Code，github的界面是非常人性化的，由于git本身会比svn来的复杂，所以在操作上github会比SourceForge来的难点。所以就有了今天的这篇教程。 跳过账户注册阶段。 1.在github上创建一个新的版本库 github首页，找到下图界面，点击“new repository”按钮： 填下项......]]></description>
			<content:encoded><![CDATA[<p>如果你是使用git作为版本控制工具，那么github基本上是必备的网站，github可以托管你的git版本库，作用类似于SourceForge和Google Code，github的界面是非常人性化的，由于git本身会比svn来的复杂，所以在操作上github会比SourceForge来的难点。所以就有了今天的这篇教程。<br />
跳过账户注册阶段。</p>
<h4>1.在github上创建一个新的版本库</h4>
<p>github首页，找到下图界面，点击“new repository”按钮：<br />
<a href="http://www.36ria.com/4742/github-1" rel="attachment wp-att-4745"><img src="http://www.36ria.com/wp-content/uploads/2011/12/github-1.png" alt="" title="github-1" width="375" height="224" class="alignnone size-full wp-image-4745" /></a><br />
填下项目名称、描述、url等信息，然后提交。<br />
<a href="http://www.36ria.com/4742/github-2" rel="attachment wp-att-4746"><img src="http://www.36ria.com/wp-content/uploads/2011/12/github-2.png" alt="" title="github-2" width="594" height="416" class="alignnone size-full wp-image-4746" /></a><br />
图中标红的一项的意思是只有付费用户才有私有库托管服务，在github上开源（public）项目托管是免费的。<br />
这样一个新的版本库就创建完毕了。<br />
接下来我们需要本地版本库和远程版本库（github上的）进行通信，还需要一些配置。</p>
<h4>2.ssh配置</h4>
<p>想要让本地版本库与远程版本库通信，需要配置下SSH key。</p>
<h5>2.1检查计算机上是否已经有SSH key</h5>
<div class="hl-surround"><ol class="hl-main ln-show" title="Double click to hide line number." ondblclick = "linenumber(this)"><li class="hl-firstline"><span style="color: Gray;">$ </span><span style="color: Blue;">cd</span><span style="color: Gray;"> ~</span><span style="color: #8b0000;">/</span><span style="color: Red;">.ssh</span></li></ol></div>
<p>如果出现““No such file or directory”或类似的语句，说明缺少ssh的key。</p>
<h5>2.2创建个新的SSH key</h5>
<div class="hl-surround"><ol class="hl-main ln-show" title="Double click to hide line number." ondblclick = "linenumber(this)"><li class="hl-firstline"><span style="color: Gray;">$ </span><span style="color: Blue;">ssh</span><span style="color: Gray;">-</span><span style="color: Blue;">keygen</span><span style="color: Gray;"> -</span><span style="color: Blue;">t</span><span style="color: Gray;"> </span><span style="color: Blue;">rsa</span><span style="color: Gray;"> -</span><span style="color: Blue;">C</span><span style="color: Gray;"> </span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">your_email@youremail.com</span><span style="color: #8b0000;">&quot;</span></li></ol></div>
<p>比如明河机子上的</p>
<div class="hl-surround"><ol class="hl-main ln-show" title="Double click to hide line number." ondblclick = "linenumber(this)"><li class="hl-firstline"><span style="color: Gray;">$ </span><span style="color: Blue;">ssh</span><span style="color: Gray;">-</span><span style="color: Blue;">keygen</span><span style="color: Gray;"> -</span><span style="color: Blue;">t</span><span style="color: Gray;"> </span><span style="color: Blue;">rsa</span><span style="color: Gray;"> -</span><span style="color: Blue;">C</span><span style="color: Gray;"> </span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">minghe36@126.com</span><span style="color: #8b0000;">&quot;</span></li></ol></div>
<p>会出现类似下图的提示：<br />
<a href="http://www.36ria.com/4742/2012-1-4-20-49-02" rel="attachment wp-att-4805"><img src="http://www.36ria.com/wp-content/uploads/2012/01/2012-1-4-20-49-02.png" alt="" title="2012-1-4 20-49-02" width="390" height="52" class="alignnone size-full wp-image-4805" /></a><br />
直接按下“enter”键即可，然后输入密码。<br />
<a href="http://www.36ria.com/4742/2012-1-4-20-50-24" rel="attachment wp-att-4806"><img src="http://www.36ria.com/wp-content/uploads/2012/01/2012-1-4-20-50-24.png" alt="" title="2012-1-4 20-50-24" width="449" height="47" class="alignnone size-full wp-image-4806" /></a><br />
一切顺利的话，你可以查看下c:\Users\Administrator\.ssh\id_rsa.pub文件，复制里面的key码。</p>
<h5>2.3增加ssh key到github上</h5>
<p><a href="http://www.36ria.com/4742/2012-1-4-20-54-50" rel="attachment wp-att-4807"><img src="http://www.36ria.com/wp-content/uploads/2012/01/2012-1-4-20-54-50.png" alt="" title="2012-1-4 20-54-50" width="281" height="68" class="alignnone size-full wp-image-4807" /></a><br />
<a href="http://www.36ria.com/4742/2012-1-4-20-55-52" rel="attachment wp-att-4808"><img src="http://www.36ria.com/wp-content/uploads/2012/01/2012-1-4-20-55-52.png" alt="" title="2012-1-4 20-55-52" width="680" height="332" class="alignnone size-full wp-image-4808" /></a><br />
留意并不需要填写title，github会自动生成，直接把复制的key黏贴到key输入框确定即可。</p>
<h5>2.4配置下git的用户名和email</h5>
<div class="hl-surround"><ol class="hl-main ln-show" title="Double click to hide line number." ondblclick = "linenumber(this)"><li class="hl-firstline"><span style="color: Gray;">$ </span><span style="color: Blue;">git</span><span style="color: Gray;"> </span><span style="color: Blue;">config</span><span style="color: Gray;"> --</span><span style="color: Blue;">global</span><span style="color: Gray;"> </span><span style="color: Blue;">user</span><span style="color: Gray;">.</span><span style="color: Blue;">name</span><span style="color: Gray;"> </span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">minghe</span><span style="color: #8b0000;">&quot;</span></li>
<li><span style="color: Gray;">$ </span><span style="color: Blue;">git</span><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">config</span><span style="color: Gray;"> --</span><span style="color: Blue;">global</span><span style="color: Gray;"> </span><span style="color: Blue;">user</span><span style="color: Gray;">.</span><span style="color: Blue;">email</span><span style="color: Gray;"> </span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">minghe36@126.com</span><span style="color: #8b0000;">&quot;</span></li></ol></div>
<p>配置结束。</p>
<h4>3.本地版本库和远程版本库的通信</h4>
<h5>3.1克隆个远程版本库</h5>
<p><a href="http://www.36ria.com/4742/github-6" rel="attachment wp-att-4809"><img src="http://www.36ria.com/wp-content/uploads/2012/01/github-6.png" alt="" title="github-6" width="530" height="150" class="alignnone size-full wp-image-4809" /></a><br />
“cd d:\git-test”切换到该目录。</p>
<h5>3.2推送更新到远程版本库</h5>
<p>先随意提交个文件到版本库<br />
<a href="http://www.36ria.com/4742/github-7" rel="attachment wp-att-4810"><img src="http://www.36ria.com/wp-content/uploads/2012/01/github-7.png" alt="" title="github-7" width="405" height="166" class="alignnone size-full wp-image-4810" /></a><br />
由于是克隆远程版本库，已经存在远程分支origin，无需再创建。<br />
（PS：创建远程分支：git remote add origin git@github.com:minghe/git-test.git）<br />
查看远程分支情况，可以使用<strong>git branch -r</strong>命令。<br />
推送修改到远程版本库：<br />
<a href="http://www.36ria.com/4742/github-8" rel="attachment wp-att-4811"><img src="http://www.36ria.com/wp-content/uploads/2012/01/github-8.png" alt="" title="github-8" width="513" height="152" class="alignnone size-full wp-image-4811" /></a><br />
git push命名将推送内容到远程服务器。<br />
与之相反的命令就是git pull。</p>
<p>有机会给大家深入讲解下远程分支。这是一个非常巧妙的设计，git会将远程分支都复制到目录.git/refs/remotes/origin下，类似于远程分支会有个独立的origin命名空间，降低了多用户操作时候合并分支的分险。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.36ria.com/4742/feed</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>JS Filter</title>
		<link>http://www.36ria.com/4787</link>
		<comments>http://www.36ria.com/4787#comments</comments>
		<pubDate>Sat, 31 Dec 2011 11:52:11 +0000</pubDate>
		<dc:creator>天河</dc:creator>
				<category><![CDATA[javascript]]></category>

		<guid isPermaLink="false">http://www.36ria.com/?p=4787</guid>
		<description><![CDATA[这个是前一阵做一个话题PK页面时折腾的东西。类似于后端可以对url进行Filter，这里可以对一组操作用 filter 进行过滤，来完成数据准备、条件验证等。 话题PK是一个单页应用。用户可以在上面完成投票、发布/查看评论的功能。不过，有些操作是需要验证的，比如投票、评论，都需要首先验证是否登陆，然后再验证用户是否已经有阵营信息了（不能反水）。假设投票的方法叫 p......]]></description>
			<content:encoded><![CDATA[<p>这个是前一阵做一个话题PK页面时折腾的东西。类似于后端可以对url进行Filter，这里可以对一组操作用 filter 进行过滤，来完成数据准备、条件验证等。</p>
<p>话题PK是一个单页应用。用户可以在上面完成投票、发布/查看评论的功能。不过，有些操作是需要验证的，比如投票、评论，都需要首先验证是否登陆，然后再验证用户是否已经有阵营信息了（不能反水）。假设投票的方法叫 postTicket，发表观点的方法叫 postMsg， 我们可以直接对名称为 postXXX 的方法进行过滤，来验证用户是否登陆及阵营信息。使用方式如下：</p>
<div class="hl-surround"><ol class="hl-main ln-show" title="Double click to hide line number." ondblclick = "linenumber(this)"><li class="hl-firstline"><span style="color: Blue;">App</span><span style="color: Gray;">.</span><span style="color: Blue;">filter</span><span style="color: Olive;">({</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Blue;">route</span><span style="color: Gray;">: </span><span style="color: #8b0000;">/</span><span style="color: Red;">^post.*</span><span style="color: #8b0000;">/</span><span style="color: Gray;">,</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Blue;">fns</span><span style="color: Gray;">: </span><span style="color: Olive;">[</span><span style="color: Blue;">login</span><span style="color: Gray;">, </span><span style="color: Blue;">side</span><span style="color: Olive;">]</span></li>
<li><span style="color: Olive;">})</span><span style="color: Gray;">;</span></li></ol></div>
<p>其中route是要匹配的方法名称，fns是用来过滤的方法，这些函数如果返回true，就说明验证通过，会继续执行下一个过滤函数。如果返回false，就说明验证没有通过，后面的方法也就不用执行了。只有fns里的方法全部返回true时，route匹配到的方法才会执行。</p>
<p>这样，投票的业务逻辑就可以跟权限验证的业务逻辑分离，最大限度地对模块进行解耦，提高模块开发速度及复用率了。</p>
<p>Filter的实现，这个实现目前并不复杂，但性能可能不是最优的。我这里也说明下，抛砖引玉，如果你有更好的方式，欢迎告诉我 <img src='http://www.36ria.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>前面说过了，这里的应用场景是单页的，也没有改变页面hash等操作，所以route就直接对函授名进行匹配了。其实现思路就是备份原来的函授，然后替换掉原有的方法，改成一个代理方法。这样，再用户调用这些方法的时候，实际上是在调用我们的代理方法。proxy方法如下：</p>
<div class="hl-surround"><ol class="hl-main ln-show" title="Double click to hide line number." ondblclick = "linenumber(this)"><li class="hl-firstline"><span style="color: Blue;">add</span><span style="color: Gray;">: </span><span style="color: Green;">function</span><span style="color: Olive;">(</span><span style="color: Blue;">o</span><span style="color: Gray;">, </span><span style="color: Blue;">method</span><span style="color: Olive;">)</span><span style="color: Gray;"> </span><span style="color: Olive;">{</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Green;">var</span><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">me</span><span style="color: Gray;"> = </span><span style="color: Green;">this</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Blue;">me</span><span style="color: Gray;">.</span><span style="color: Blue;">_actions</span><span style="color: Olive;">[</span><span style="color: Blue;">method</span><span style="color: Olive;">]</span><span style="color: Gray;"> = </span><span style="color: Blue;">o</span><span style="color: Olive;">[</span><span style="color: Blue;">method</span><span style="color: Olive;">]</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: #ffa500;">// proxy function</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Blue;">o</span><span style="color: Olive;">[</span><span style="color: Blue;">method</span><span style="color: Olive;">]</span><span style="color: Gray;"> = </span><span style="color: Green;">function</span><span style="color: Olive;">()</span><span style="color: Gray;">&nbsp;</span><span style="color: Olive;">{</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Green;">var</span><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">route</span><span style="color: Gray;">, </span><span style="color: Blue;">fns</span><span style="color: Gray;">,</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Blue;">tag</span><span style="color: Gray;"> = </span><span style="color: Green;">true</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Green;">for</span><span style="color: Olive;">(</span><span style="color: Blue;">filter</span><span style="color: Gray;">&nbsp;</span><span style="color: Green;">in</span><span style="color: Gray;"> </span><span style="color: Blue;">me</span><span style="color: Gray;">.</span><span style="color: Blue;">_filters</span><span style="color: Olive;">)</span><span style="color: Gray;"> </span><span style="color: Olive;">{</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Blue;">filter</span><span style="color: Gray;"> = </span><span style="color: Blue;">me</span><span style="color: Gray;">.</span><span style="color: Blue;">_filters</span><span style="color: Olive;">[</span><span style="color: Blue;">filter</span><span style="color: Olive;">]</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Blue;">route</span><span style="color: Gray;"> = </span><span style="color: Blue;">filter</span><span style="color: Gray;">.</span><span style="color: Blue;">route</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Blue;">fns</span><span style="color: Gray;"> = </span><span style="color: Blue;">filter</span><span style="color: Gray;">.</span><span style="color: Blue;">fns</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Green;">if</span><span style="color: Olive;">(</span><span style="color: Blue;">method</span><span style="color: Gray;">.</span><span style="color: Blue;">match</span><span style="color: Olive;">(</span><span style="color: Blue;">route</span><span style="color: Olive;">))</span><span style="color: Gray;">&nbsp;</span><span style="color: Olive;">{</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Green;">for</span><span style="color: Olive;">(</span><span style="color: Blue;">fn</span><span style="color: Gray;">&nbsp;</span><span style="color: Green;">in</span><span style="color: Gray;"> </span><span style="color: Blue;">fns</span><span style="color: Olive;">)</span><span style="color: Gray;"> </span><span style="color: Olive;">{</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Blue;">fn</span><span style="color: Gray;"> = </span><span style="color: Blue;">fns</span><span style="color: Olive;">[</span><span style="color: Blue;">fn</span><span style="color: Olive;">]</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Green;">if</span><span style="color: Olive;">(</span><span style="color: Gray;">!</span><span style="color: Blue;">fn</span><span style="color: Gray;">.</span><span style="color: Blue;">apply</span><span style="color: Olive;">(</span><span style="color: Blue;">o</span><span style="color: Gray;">, </span><span style="color: Olive;">[]</span><span style="color: Gray;">.</span><span style="color: Blue;">slice</span><span style="color: Gray;">.</span><span style="color: Blue;">call</span><span style="color: Olive;">(</span><span style="color: Blue;">arguments</span><span style="color: Olive;">)))</span><span style="color: Gray;">&nbsp;</span><span style="color: Olive;">{</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Blue;">tag</span><span style="color: Gray;"> = </span><span style="color: Green;">false</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Green;">break</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Olive;">}</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Olive;">}</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Olive;">}</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Olive;">}</span></li>
<li><span style="color: Gray;">&nbsp;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Green;">if</span><span style="color: Olive;">(</span><span style="color: Blue;">tag</span><span style="color: Olive;">)</span><span style="color: Gray;">&nbsp;</span><span style="color: Olive;">{</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Blue;">me</span><span style="color: Gray;">.</span><span style="color: Blue;">_actions</span><span style="color: Olive;">[</span><span style="color: Blue;">method</span><span style="color: Olive;">]</span><span style="color: Gray;">.</span><span style="color: Blue;">apply</span><span style="color: Olive;">(</span><span style="color: Blue;">o</span><span style="color: Gray;">, </span><span style="color: Olive;">[]</span><span style="color: Gray;">.</span><span style="color: Blue;">slice</span><span style="color: Gray;">.</span><span style="color: Blue;">call</span><span style="color: Olive;">(</span><span style="color: Blue;">arguments</span><span style="color: Olive;">))</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Olive;">}</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Olive;">}</span><span style="color: Gray;">;</span></li>
<li><span style="color: Olive;">}</span></li></ol></div>
]]></content:encoded>
			<wfw:commentRss>http://www.36ria.com/4787/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>飞绿说说几个有意思的IEbug</title>
		<link>http://www.36ria.com/4744</link>
		<comments>http://www.36ria.com/4744#comments</comments>
		<pubDate>Fri, 30 Dec 2011 12:39:51 +0000</pubDate>
		<dc:creator>飞绿</dc:creator>
				<category><![CDATA[javascript]]></category>
		<category><![CDATA[IEbug]]></category>

		<guid isPermaLink="false">http://www.36ria.com/?p=4744</guid>
		<description><![CDATA[最近工作中遇到的一些坑爹bug，下面列举三个，都来自IE…… 1、IE7自动换行bug 代码如下： &#60;style&#62; &#160; &#160; &#160; &#160; ul { &#160; &#160; &#160; &#160; &#160; &#160; width: 100%; &#160; &#160; &#160; &#160; &#160; &#160; height: auto; &#160; &#160; &#160; &#160; } &#160; &#160; &#160; &#160; ul li { &#160; &#160; &#160; &#160; &#160; &#160; clear: both; &#160; &#160; &#160; &#160; &#160; &#160; float: left; &#160; [.........]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.36ria.com/4744/feilv-ie-bug-2" rel="attachment wp-att-4802"><img src="http://www.36ria.com/wp-content/uploads/2011/12/feilv-ie-bug1.png" alt="" title="feilv-ie-bug" width="680" height="200" class="alignnone size-full wp-image-4802" /></a><br />
最近工作中遇到的一些坑爹bug，下面列举三个，都来自IE…… <img src='http://www.36ria.com/wp-includes/images/smilies/icon_arrow.gif' alt=':arrow:' class='wp-smiley' />  </p>
<h3>1、IE7自动换行bug</h3>
<p>代码如下： </p>
<div class="hl-surround"><ol class="hl-main ln-show" title="Double click to hide line number." ondblclick = "linenumber(this)"><li class="hl-firstline"><span style="color: Olive;">&lt;</span><span style="color: Green;">style</span><span style="color: Olive;">&gt;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; ul {</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; width: 100%;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; height: auto;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; }</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; ul li {</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; clear: both;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; float: left;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; margin: 12px;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; border: #cdcdcd 1px solid;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; padding: 6px;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; width: auto;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; background-color: #eaeaea;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; list-style: none;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; </span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Olive;">&lt;/</span><span style="color: Green;">style</span><span style="color: Olive;">&gt;</span></li>
<li><span style="color: Gray;">&nbsp;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Olive;">&lt;</span><span style="color: Green;">ul</span><span style="color: Olive;">&gt;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Olive;">&lt;</span><span style="color: Green;">li</span><span style="color: Olive;">&gt;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 类目地图模板1&gt;一级类目&gt;二级类目/购书券</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Olive;">&lt;</span><span style="color: Green;">a</span><span style="color: Gray;">&nbsp;</span><span style="color: #00008b;">href</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">#</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">&gt;</span><span style="color: Gray;">取消选择</span><span style="color: Olive;">&lt;/</span><span style="color: Green;">a</span><span style="color: Olive;">&gt;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Olive;">&lt;/</span><span style="color: Green;">li</span><span style="color: Olive;">&gt;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Olive;">&lt;</span><span style="color: Green;">li</span><span style="color: Olive;">&gt;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 类目地图模板1&gt;一级类目&gt;二级类目/购书券&gt;三级类目/网上购书券&gt;四级类目/教育培训卡&gt;五级类目/高中培训卡</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Olive;">&lt;</span><span style="color: Green;">a</span><span style="color: Gray;">&nbsp;</span><span style="color: #00008b;">href</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">#</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">&gt;</span><span style="color: Gray;">取消选择</span><span style="color: Olive;">&lt;/</span><span style="color: Green;">a</span><span style="color: Olive;">&gt;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Olive;">&lt;/</span><span style="color: Green;">li</span><span style="color: Olive;">&gt;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Olive;">&lt;</span><span style="color: Green;">li</span><span style="color: Olive;">&gt;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 类目地图模板1&gt;二级类目/吃喝玩乐折扣券&gt;三级类目/购书券</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Olive;">&lt;</span><span style="color: Green;">a</span><span style="color: Gray;">&nbsp;</span><span style="color: #00008b;">href</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">#</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">&gt;</span><span style="color: Gray;">取消选择</span><span style="color: Olive;">&lt;/</span><span style="color: Green;">a</span><span style="color: Olive;">&gt;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Olive;">&lt;/</span><span style="color: Green;">li</span><span style="color: Olive;">&gt;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Olive;">&lt;/</span><span style="color: Green;">ul</span><span style="color: Olive;">&gt;</span></li></ol></div>
<p>需求上希望li路径的外边框宽度自适应，正常的显示如图：<br />
<a href="http://www.36ria.com/4744/ie7bug-yes" rel="attachment wp-att-4753"><img src="http://www.36ria.com/wp-content/uploads/2011/12/ie7bug-yes-680x119.jpg" alt="" title="ie7bug-yes" width="450" height="78" class="aligncenter size-large wp-image-4753" /></a><br />
但在ie7下会出现这样的换行现象，如下图：<br />
<a href="http://www.36ria.com/4744/ie7bug-no" rel="attachment wp-att-4752"><img src="http://www.36ria.com/wp-content/uploads/2011/12/ie7bug-no-680x159.jpg" alt="" title="ie7bug-no" width="450" height="105" class="aligncenter size-large wp-image-4752" /></a><br />
在测试中还发现该换行现象跟屏幕显示器分辨率相关，上面ie7的效果是在分辨率1280*800下看到的，如果分辨率更低换行的现象就更易发现。</p>
<p>解决的方法是在li里再套一层div，给div设置宽度自适应</p>
<div class="hl-surround"><ol class="hl-main ln-show" title="Double click to hide line number." ondblclick = "linenumber(this)"><li class="hl-firstline"><span style="color: Olive;">&lt;</span><span style="color: Green;">style</span><span style="color: Olive;">&gt;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; ul {</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; width: 100%;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; height: auto;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; }</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; li {</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; list-style: none;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; }</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; ul div {</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; clear: both;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; float: left;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; margin: 12px;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; border: #cdcdcd 1px solid;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; padding: 6px;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; width: auto;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; background-color: #eaeaea;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; </span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Olive;">&lt;/</span><span style="color: Green;">style</span><span style="color: Olive;">&gt;</span></li>
<li><span style="color: Gray;">&nbsp;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Olive;">&lt;</span><span style="color: Green;">ul</span><span style="color: Olive;">&gt;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Olive;">&lt;</span><span style="color: Green;">li</span><span style="color: Olive;">&gt;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Olive;">&lt;</span><span style="color: Green;">div</span><span style="color: Olive;">&gt;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 类目地图模板1&gt;一级类目&gt;二级类目/购书券</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Olive;">&lt;</span><span style="color: Green;">a</span><span style="color: Gray;">&nbsp;</span><span style="color: #00008b;">data-id</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">1-50019418</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;"> </span><span style="color: #00008b;">class</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">delete-cat</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;"> </span><span style="color: #00008b;">href</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">#</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">&gt;</span><span style="color: Gray;">取消选择</span><span style="color: Olive;">&lt;/</span><span style="color: Green;">a</span><span style="color: Olive;">&gt;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Olive;">&lt;/</span><span style="color: Green;">div</span><span style="color: Olive;">&gt;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Olive;">&lt;/</span><span style="color: Green;">li</span><span style="color: Olive;">&gt;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Olive;">&lt;</span><span style="color: Green;">li</span><span style="color: Olive;">&gt;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Olive;">&lt;</span><span style="color: Green;">div</span><span style="color: Olive;">&gt;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 类目地图模板1&gt;一级类目&gt;二级类目/购书券&gt;三级类目/网上购书券&gt;四级类目/教育培训卡&gt;五级类目/高中培训卡</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Olive;">&lt;</span><span style="color: Green;">a</span><span style="color: Gray;">&nbsp;</span><span style="color: #00008b;">data-id</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">1-50019418</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;"> </span><span style="color: #00008b;">class</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">delete-cat</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;"> </span><span style="color: #00008b;">href</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">#</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">&gt;</span><span style="color: Gray;">取消选择</span><span style="color: Olive;">&lt;/</span><span style="color: Green;">a</span><span style="color: Olive;">&gt;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Olive;">&lt;/</span><span style="color: Green;">div</span><span style="color: Olive;">&gt;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Olive;">&lt;/</span><span style="color: Green;">li</span><span style="color: Olive;">&gt;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Olive;">&lt;</span><span style="color: Green;">li</span><span style="color: Olive;">&gt;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Olive;">&lt;</span><span style="color: Green;">div</span><span style="color: Olive;">&gt;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 类目地图模板1&gt;二级类目/吃喝玩乐折扣券&gt;三级类目/购书券</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Olive;">&lt;</span><span style="color: Green;">a</span><span style="color: Gray;">&nbsp;</span><span style="color: #00008b;">data-id</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">1-50019418</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;"> </span><span style="color: #00008b;">class</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">delete-cat</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;"> </span><span style="color: #00008b;">href</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">#</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">&gt;</span><span style="color: Gray;">取消选择</span><span style="color: Olive;">&lt;/</span><span style="color: Green;">a</span><span style="color: Olive;">&gt;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Olive;">&lt;/</span><span style="color: Green;">div</span><span style="color: Olive;">&gt;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Olive;">&lt;/</span><span style="color: Green;">li</span><span style="color: Olive;">&gt;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Olive;">&lt;/</span><span style="color: Green;">ul</span><span style="color: Olive;">&gt;</span></li></ol></div>
<ul class="tow-columns clearfix">
<li class="l"><a href="http://www.36ria.com/demo/feilv-demo/ie7bug-demo.html" class="btn-view-demo" target="_blank">点此查看demo</a></li>
</ul>
<h3>2、IE8 overflow和max-height引起的bug</h3>
<p>现象：在IE8下，a容器设置max-height, overflow: auto或overflow: srcoll。会使得a容器把max-height当做height来渲染。</p>
<div class="hl-surround"><ol class="hl-main ln-show" title="Double click to hide line number." ondblclick = "linenumber(this)"><li class="hl-firstline"><span style="color: Olive;">&lt;</span><span style="color: Green;">style</span><span style="color: Olive;">&gt;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; .a {</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; width: 800px;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; max-height: 200px;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; overflow: scroll;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; /*overflow-x: auto;*/</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; background: #0f0;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; }</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; p {</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; width: 900px;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; }</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Olive;">&lt;/</span><span style="color: Green;">style</span><span style="color: Olive;">&gt;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Olive;">&lt;</span><span style="color: Green;">div</span><span style="color: Gray;">&nbsp;</span><span style="color: #00008b;">class</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">a</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">&gt;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Olive;">&lt;</span><span style="color: Green;">p</span><span style="color: Olive;">&gt;</span><span style="color: Gray;">A容器设置了max-height，A容器设置了overflow: auto或srcoll，A容器会把max-height当做height来渲染。</span><span style="color: Olive;">&lt;/</span><span style="color: Green;">p</span><span style="color: Olive;">&gt;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Olive;">&lt;/</span><span style="color: Green;">div</span><span style="color: Olive;">&gt;</span></li></ol></div>
<p>解决办法是去掉a容器的overflow设置，再给a容器套一个容器b，给b设置overflow。代码如下：</p>
<div class="hl-surround"><ol class="hl-main ln-show" title="Double click to hide line number." ondblclick = "linenumber(this)"><li class="hl-firstline"><span style="color: Olive;">&lt;</span><span style="color: Green;">style</span><span style="color: Olive;">&gt;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; .a {</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; width: 800px;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; max-height: 200px;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; background: #0f0;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; }</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; .b {</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; width: 800px;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; overflow: auto;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; }</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; p {</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; width: 900px;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; }</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Olive;">&lt;/</span><span style="color: Green;">style</span><span style="color: Olive;">&gt;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Olive;">&lt;</span><span style="color: Green;">div</span><span style="color: Gray;">&nbsp;</span><span style="color: #00008b;">class</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">b</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">&gt;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Olive;">&lt;</span><span style="color: Green;">div</span><span style="color: Gray;">&nbsp;</span><span style="color: #00008b;">class</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">a</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">&gt;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Olive;">&lt;</span><span style="color: Green;">p</span><span style="color: Olive;">&gt;</span><span style="color: Gray;">解决办法是去掉a容器的overflow设置，再给a容器外面套一个容器b，给b容器设置overflow。</span><span style="color: Olive;">&lt;/</span><span style="color: Green;">p</span><span style="color: Olive;">&gt;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Olive;">&lt;/</span><span style="color: Green;">div</span><span style="color: Olive;">&gt;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Olive;">&lt;/</span><span style="color: Green;">div</span><span style="color: Olive;">&gt;</span></li></ol></div>
<p>关于IE8 overflow的相关问题可以看看这篇<a href="http://edskes.com/ie/ie8overflowandexpandingboxbugs.htm" target="_blank">《IE8 overflow and expanding box bugs》</a></p>
<ul class="tow-columns clearfix">
<li class="l"><a href="http://www.36ria.com/demo/feilv-demo/ie8_overflow_max-height.html" class="btn-view-demo" target="_blank">点此查看demo</a></li>
</ul>
<h3>3、IE9 overflow和:hover引起的bug</h3>
<p>这是一个神奇的现象，IE9下，容器a设置overflow：auto，a容器中的内容导致a容器的滚动条出现，这种情况下若给a容器设置伪类：hover。那么在鼠标移动到hover元素上，a容器高度会变高。代码如下：</p>
<div class="hl-surround"><ol class="hl-main ln-show" title="Double click to hide line number." ondblclick = "linenumber(this)"><li class="hl-firstline"><span style="color: Gray;">.a {</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; margin: 20px;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; border: 2px solid #cdcdcd;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; width: 800px;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; overflow: auto;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; }</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; p {</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; width: 900px;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; }</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; p:hover {</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; color: #f60;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; }</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Olive;">&lt;/</span><span style="color: Green;">style</span><span style="color: Olive;">&gt;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Olive;">&lt;</span><span style="color: Green;">div</span><span style="color: Gray;">&nbsp;</span><span style="color: #00008b;">class</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">a</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">&gt;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Olive;">&lt;</span><span style="color: Green;">p</span><span style="color: Olive;">&gt;</span><span style="color: Gray;">容器a设置overflow：auto,a中的内容导致a的滚动条出现，这种情况下若给a容器中的元素设置伪类:hover。那么在鼠标移动到hover元素上后a容器的高度会变高。</span><span style="color: Olive;">&lt;/</span><span style="color: Green;">p</span><span style="color: Olive;">&gt;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Olive;">&lt;/</span><span style="color: Green;">div</span><span style="color: Olive;">&gt;</span></li></ol></div>
<p>解决办法是给a容器设置伪类:hover{height: 100%}或者给a容器设置overflow-y/x:scroll.代码如下：</p>
<div class="hl-surround"><ol class="hl-main ln-show" title="Double click to hide line number." ondblclick = "linenumber(this)"><li class="hl-firstline"><span style="color: Olive;">&lt;</span><span style="color: Green;">style</span><span style="color: Olive;">&gt;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; .a:hover {</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; height: 100%;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; }</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Olive;">&lt;/</span><span style="color: Green;">style</span><span style="color: Olive;">&gt;</span></li></ol></div>
<ul class="tow-columns clearfix">
<li class="l"><a href="http://www.36ria.com/demo/feilv-demo/ie9_overflow_hover.html" class="btn-view-demo" target="_blank">点此查看demo</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.36ria.com/4744/feed</wfw:commentRss>
		<slash:comments>10</slash:comments>
		</item>
	</channel>
</rss>

