<?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>Fri, 20 Jan 2012 02:53:35 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<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>2</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>3</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>2</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>3</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>9</slash:comments>
		</item>
		<item>
		<title>jasmine快速入门（PPT）</title>
		<link>http://www.36ria.com/4732</link>
		<comments>http://www.36ria.com/4732#comments</comments>
		<pubDate>Tue, 27 Dec 2011 03:24:38 +0000</pubDate>
		<dc:creator>明河</dc:creator>
				<category><![CDATA[前端开发工具]]></category>
		<category><![CDATA[Jasmine教程]]></category>

		<guid isPermaLink="false">http://www.36ria.com/?p=4732</guid>
		<description><![CDATA[之前明河和苏河有翻译了jasmine的入门教程，传送门在此，明河正好上上周有在团队中做了个jasmine的入门分享，现在把PPT贡献出来，有兴趣的朋友可以下载下来，里面有demo。 点此下载jasmine快......]]></description>
			<content:encoded><![CDATA[<p>之前明河和苏河有翻译了jasmine的入门教程，<a href="http://www.36ria.com/4457" title="传送门在此" target="_blank">传送门在此</a>，明河正好上上周有在团队中做了个jasmine的入门分享，现在把PPT贡献出来，有兴趣的朋友可以下载下来，里面有demo。<br />
<a href="http://www.36ria.com/4732/jasmine-3" rel="attachment wp-att-4733"><img src="http://www.36ria.com/wp-content/uploads/2011/12/jasmine.png" alt="" title="jasmine" width="592" height="446" class="alignnone size-full wp-image-4733" /></a><br />
<strong><a href="http://www.36ria.com/demo/jasmine-ppt.zip" title="点此下载jasmine快速" target="_blank">点此下载jasmine快速</a></strong></p>
]]></content:encoded>
			<wfw:commentRss>http://www.36ria.com/4732/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>前端中文原创推荐—年年至日长为客</title>
		<link>http://www.36ria.com/4720</link>
		<comments>http://www.36ria.com/4720#comments</comments>
		<pubDate>Fri, 23 Dec 2011 03:51:45 +0000</pubDate>
		<dc:creator>明河</dc:creator>
				<category><![CDATA[前端原创推荐]]></category>
		<category><![CDATA[前端中文原创推荐]]></category>

		<guid isPermaLink="false">http://www.36ria.com/?p=4720</guid>
		<description><![CDATA[昨天是冬至，贴首应景的诗——杜甫《冬至》。 1.人人网首页拖拽上传详解(HTML5 Drag&#038;Drop、FileReader API、FormData) 推荐指数： 作者：彬Go 2.另类MVC模式 – 思考和雏形 推荐指数： 作者：张立理 3.javascript单元测试框架jasmine入门 推荐指数： 作者：Z.J.T 4.如何在jquery的基础上构建一个中间层 推荐指数： 作者：小爝 5.Node.js学习系列笔记：Events 事件模块 推荐指数： 作者：何畏 6.Sim......]]></description>
			<content:encoded><![CDATA[<p>昨天是冬至，贴首应景的诗——杜甫《冬至》。<br />
<a href="http://www.36ria.com/4720/recommend-2" rel="attachment wp-att-4727"><img src="http://www.36ria.com/wp-content/uploads/2011/12/recommend.png" alt="" title="recommend" width="680" height="240" class="alignnone size-full wp-image-4727" /></a></p>
<h4>1.<a href="http://fed.renren.com/2011/12/391" target="_blank">人人网首页拖拽上传详解(HTML5 Drag&#038;Drop、FileReader API、FormData)</a></h4>
<p><img alt="" src="http://fed.renren.com/wp-content/uploads/2011/12/fed-title.jpg" class="alignnone" width="620" height="260" /></p>
<ul>
<li>推荐指数：<img class="icon-star" src="http://www.36ria.com/star.png" alt="" /><img class="icon-star" src="http://www.36ria.com/star.png" alt="" /><img class="icon-star" src="http://www.36ria.com/star.png" alt="" /><img class="icon-star" src="http://www.36ria.com/star.png" alt="" /><img class="icon-star" src="http://www.36ria.com/star.png" alt="" /></li>
<li>作者：<a href="http://blog.bingo929.com/">彬Go</a></li>
</ul>
<h4>2.<a href="http://www.otakustay.com/another-mvc-pattern-1/" target="_blank">另类MVC模式 – 思考和雏形</a></h4>
<ul>
<li>推荐指数：<img class="icon-star" src="http://www.36ria.com/star.png" alt="" /><img class="icon-star" src="http://www.36ria.com/star.png" alt="" /><img class="icon-star" src="http://www.36ria.com/star.png" alt="" /><img class="icon-star" src="http://www.36ria.com/star.png" alt="" /></li>
<li>作者：<a href="http://www.otakustay.com/">张立理</a></li>
</ul>
<h4>3.<a href="http://orzpoint.com/learning-jasmine/" target="_blank">javascript单元测试框架jasmine入门</a></h4>
<ul>
<li>推荐指数：<img class="icon-star" src="http://www.36ria.com/star.png" alt="" /><img class="icon-star" src="http://www.36ria.com/star.png" alt="" /><img class="icon-star" src="http://www.36ria.com/star.png" alt="" /><img class="icon-star" src="http://www.36ria.com/star.png" alt="" /></li>
<li>作者：<a href="http://orzpoint.com/">Z.J.T</a></li>
</ul>
<h4>4.<a href="http://www.designsor.com/2011/08/22/%e5%a6%82%e4%bd%95%e5%9c%a8jquery%e7%9a%84%e5%9f%ba%e7%a1%80%e4%b8%8a%e6%9e%84%e5%bb%ba%e4%b8%80%e4%b8%aa%e4%b8%ad%e9%97%b4%e5%b1%82/" target="_blank">如何在jquery的基础上构建一个中间层</a></h4>
<ul>
<li>推荐指数：<img class="icon-star" src="http://www.36ria.com/star.png" alt="" /><img class="icon-star" src="http://www.36ria.com/star.png" alt="" /><img class="icon-star" src="http://www.36ria.com/star.png" alt="" /></li>
<li>作者：<a href="http://www.designsor.com/">小爝</a></li>
</ul>
<h4>5.<a href="http://www.lzlu.com/blog/?p=796" target="_blank">Node.js学习系列笔记：Events 事件模块</a></h4>
<ul>
<li>推荐指数：<img class="icon-star" src="http://www.36ria.com/star.png" alt="" /><img class="icon-star" src="http://www.36ria.com/star.png" alt="" /><img class="icon-star" src="http://www.36ria.com/star.png" alt="" /></li>
<li>作者：<a href="http://www.lzlu.com/blog/">何畏</a></li>
</ul>
<h4>6.<a href="http://www.planabc.net/2011/05/31/simple_javascript_template_substitute/" target="_blank">Simple JavaScript Template : substitute</a></h4>
<ul>
<li>推荐指数：<img class="icon-star" src="http://www.36ria.com/star.png" alt="" /><img class="icon-star" src="http://www.36ria.com/star.png" alt="" /><img class="icon-star" src="http://www.36ria.com/star.png" alt="" /></li>
<li>作者：<a href="http://www.planabc.net/">圆心</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.36ria.com/4720/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>10个css3/javascript动画插件/框架</title>
		<link>http://www.36ria.com/4685</link>
		<comments>http://www.36ria.com/4685#comments</comments>
		<pubDate>Sun, 18 Dec 2011 04:50:32 +0000</pubDate>
		<dc:creator>明河</dc:creator>
				<category><![CDATA[javascript]]></category>
		<category><![CDATA[css3动画]]></category>
		<category><![CDATA[javascript动画]]></category>

		<guid isPermaLink="false">http://www.36ria.com/?p=4685</guid>
		<description><![CDATA[1.jQuery Transit jquery的一个用的人比较多的动画插件，非常的易用，效果也非常全面。 $('.box').transition({ rotate: '30deg' }); 2.Transform.js 应该是目前针对transform最为全面的动画库，特点支持3D动画特性： $('#test').css({ &#160; &#160; &#160; '-webkit-transform': 'translate(10px,10px)', &#160; &#160; &#160; '-moz-transform': 'translate(10px,10px)', &#160; &#160; &#160; '-o-transform': 'translate(10px,10px)', &#160; &#160; &#160; '-ms-transform'......]]></description>
			<content:encoded><![CDATA[<h4><a href="http://ricostacruz.com/jquery.transit/" target="_blank">1.jQuery Transit</a></h4>
<p><a href="http://www.36ria.com/4685/1-15" rel="attachment wp-att-4698"><img src="http://www.36ria.com/wp-content/uploads/2011/12/1.jpg" alt="" title="1" width="500" height="250" class="alignnone size-full wp-image-4698" /></a><br />
jquery的一个用的人比较多的动画插件，非常的易用，效果也非常全面。</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;">'</span><span style="color: Red;">.box</span><span style="color: #8b0000;">'</span><span style="color: Olive;">)</span><span style="color: Gray;">.</span><span style="color: Blue;">transition</span><span style="color: Olive;">({</span><span style="color: Gray;"> </span><span style="color: Blue;">rotate</span><span style="color: Gray;">: </span><span style="color: #8b0000;">'</span><span style="color: Red;">30deg</span><span style="color: #8b0000;">'</span><span style="color: Gray;"> </span><span style="color: Olive;">})</span><span style="color: Gray;">;</span></li></ol></div>
<h4><a href="http://transformjs.strobeapp.com/" target="_blank">2.Transform.js</a></h4>
<p><a href="http://www.36ria.com/4685/2-14" rel="attachment wp-att-4699"><img src="http://www.36ria.com/wp-content/uploads/2011/12/2.jpg" alt="" title="2" width="500" height="250" class="alignnone size-full wp-image-4699" /></a><br />
应该是目前针对transform最为全面的动画库，特点支持3D动画特性：</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;">'</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;">css</span><span style="color: Olive;">({</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; </span><span style="color: #8b0000;">'</span><span style="color: Red;">-webkit-transform</span><span style="color: #8b0000;">'</span><span style="color: Gray;">: </span><span style="color: #8b0000;">'</span><span style="color: Red;">translate(10px,10px)</span><span style="color: #8b0000;">'</span><span style="color: Gray;">,</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; </span><span style="color: #8b0000;">'</span><span style="color: Red;">-moz-transform</span><span style="color: #8b0000;">'</span><span style="color: Gray;">: </span><span style="color: #8b0000;">'</span><span style="color: Red;">translate(10px,10px)</span><span style="color: #8b0000;">'</span><span style="color: Gray;">,</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; </span><span style="color: #8b0000;">'</span><span style="color: Red;">-o-transform</span><span style="color: #8b0000;">'</span><span style="color: Gray;">: </span><span style="color: #8b0000;">'</span><span style="color: Red;">translate(10px,10px)</span><span style="color: #8b0000;">'</span><span style="color: Gray;">,</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; </span><span style="color: #8b0000;">'</span><span style="color: Red;">-ms-transform</span><span style="color: #8b0000;">'</span><span style="color: Gray;">: </span><span style="color: #8b0000;">'</span><span style="color: Red;">translate(10px,10px)</span><span style="color: #8b0000;">'</span><span style="color: Gray;">,</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; </span><span style="color: #8b0000;">'</span><span style="color: Red;">transform</span><span style="color: #8b0000;">'</span><span style="color: Gray;">: </span><span style="color: #8b0000;">'</span><span style="color: Red;">translate(10px,10px)</span><span style="color: #8b0000;">'</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Olive;">})</span><span style="color: Gray;">;</span></li></ol></div>
<h4><a href="http://paperjs.org/" target="_blank">3.Paper.js</a></h4>
<p><a href="http://www.36ria.com/4685/3-18" rel="attachment wp-att-4700"><img src="http://www.36ria.com/wp-content/uploads/2011/12/3.jpg" alt="" title="3" width="500" height="250" class="alignnone size-full wp-image-4700" /></a><br />
非常牛逼的动画效果，文档和demo都很详细，虽然用于实战的场景不多（基于canvas的动画），不过依旧推荐认真看下。</p>
<h4><a href="http://visionmedia.github.com/move.js/" target="_blank">4.Move.js</a></h4>
<p><a href="http://www.36ria.com/4685/4-16" rel="attachment wp-att-4701"><img src="http://www.36ria.com/wp-content/uploads/2011/12/4.jpg" alt="" title="4" width="500" height="250" class="alignnone size-full wp-image-4701" /></a><br />
相当不错的小动画库，能够产生大部分css3动画效果，关键是API非常易于理解，比如下面的代码：</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;">move</span><span style="color: Olive;">(</span><span style="color: #8b0000;">'</span><span style="color: Red;">#example-11 .box</span><span style="color: #8b0000;">'</span><span style="color: Olive;">)</span></li>
<li><span style="color: Gray;">&nbsp; .</span><span style="color: Blue;">set</span><span style="color: Olive;">(</span><span style="color: #8b0000;">'</span><span style="color: Red;">background-color</span><span style="color: #8b0000;">'</span><span style="color: Gray;">, </span><span style="color: #8b0000;">'</span><span style="color: Red;">red</span><span style="color: #8b0000;">'</span><span style="color: Olive;">)</span></li>
<li><span style="color: Gray;">&nbsp; .</span><span style="color: Blue;">duration</span><span style="color: Olive;">(</span><span style="color: Maroon;">1000</span><span style="color: Olive;">)</span></li>
<li><span style="color: Gray;">&nbsp; .</span><span style="color: Blue;">end</span><span style="color: Olive;">(</span><span style="color: Green;">function</span><span style="color: Olive;">(){</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Blue;">move</span><span style="color: Olive;">(</span><span style="color: #8b0000;">'</span><span style="color: Red;">#example-11 .box</span><span style="color: #8b0000;">'</span><span style="color: Olive;">)</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; .</span><span style="color: Blue;">set</span><span style="color: Olive;">(</span><span style="color: #8b0000;">'</span><span style="color: Red;">background-color</span><span style="color: #8b0000;">'</span><span style="color: Gray;">, </span><span style="color: #8b0000;">'</span><span style="color: Red;">white</span><span style="color: #8b0000;">'</span><span style="color: Olive;">)</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; .</span><span style="color: Blue;">end</span><span style="color: Olive;">()</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp; </span><span style="color: Olive;">})</span><span style="color: Gray;">;</span></li></ol></div>
<p>是不是有点jquery的影子？</p>
<h4><a href="http://jsanim.com/" target="_blank">5.JSAnim</a></h4>
<p><a href="http://www.36ria.com/4685/5-15" rel="attachment wp-att-4702"><img src="http://www.36ria.com/wp-content/uploads/2011/12/5.jpg" alt="" title="5" width="500" height="250" class="alignnone size-full wp-image-4702" /></a></p>
<h4><a href="http://gx.riccardodegni.net/" target="_blank">6.GX</a></h4>
<p><a href="http://www.36ria.com/4685/6-14" rel="attachment wp-att-4703"><img src="http://www.36ria.com/wp-content/uploads/2011/12/6.jpg" alt="" title="6" width="500" height="250" class="alignnone size-full wp-image-4703" /></a><br />
GX非常小，只有10K左右，难得可贵的是gx可以兼容所有浏览器，利用gx可以轻松的利用所有的css属性实现动画。<br />
gx是jquery的插件哦。</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;">'</span><span style="color: Red;">#el2</span><span style="color: #8b0000;">'</span><span style="color: Olive;">)</span><span style="color: Gray;">.</span><span style="color: Blue;">gx</span><span style="color: Olive;">({</span><span style="color: #8b0000;">'</span><span style="color: Red;">width</span><span style="color: #8b0000;">'</span><span style="color: Gray;">: </span><span style="color: Maroon;">200</span><span style="color: Gray;">, </span><span style="color: #8b0000;">'</span><span style="color: Red;">height</span><span style="color: #8b0000;">'</span><span style="color: Gray;">: </span><span style="color: Maroon;">200</span><span style="color: Gray;">, </span><span style="color: #8b0000;">'</span><span style="color: Red;">color</span><span style="color: #8b0000;">'</span><span style="color: Gray;">: </span><span style="color: #8b0000;">'</span><span style="color: Red;">red</span><span style="color: #8b0000;">'</span><span style="color: Gray;">, </span><span style="color: #8b0000;">'</span><span style="color: Red;">background-color</span><span style="color: #8b0000;">'</span><span style="color: Gray;">: </span><span style="color: #8b0000;">'</span><span style="color: Red;">#ff00ff</span><span style="color: #8b0000;">'</span><span style="color: Gray;">, </span><span style="color: #8b0000;">'</span><span style="color: Red;">border-width</span><span style="color: #8b0000;">'</span><span style="color: Gray;">: </span><span style="color: Maroon;">8</span><span style="color: Gray;">, </span><span style="color: #8b0000;">'</span><span style="color: Red;">border-color</span><span style="color: #8b0000;">'</span><span style="color: Gray;">: </span><span style="color: #8b0000;">'</span><span style="color: Red;">#fa0</span><span style="color: #8b0000;">'</span><span style="color: Olive;">}</span><span style="color: Gray;">, </span><span style="color: Maroon;">4000</span><span style="color: Gray;">, </span><span style="color: #8b0000;">'</span><span style="color: Red;">Linear</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;">el</span><span style="color: Olive;">)</span><span style="color: Gray;"> </span><span style="color: Olive;">{</span><span style="color: Gray;"> </span><span style="color: Blue;">el</span><span style="color: Gray;">.</span><span style="color: Blue;">html</span><span style="color: Olive;">(</span><span style="color: #8b0000;">'</span><span style="color: Red;">Completed!</span><span style="color: #8b0000;">'</span><span style="color: Olive;">)</span><span style="color: Gray;">; </span><span style="color: Olive;">})</span><span style="color: Gray;">;</span></li></ol></div>
<h4><a href="http://leaverou.github.com/animatable/" target="_blank">7.Animatable</a></h4>
<p><a href="http://www.36ria.com/4685/7-12" rel="attachment wp-att-4704"><img src="http://www.36ria.com/wp-content/uploads/2011/12/7.jpg" alt="" title="7" width="500" height="250" class="alignnone size-full wp-image-4704" /></a><br />
纯粹的css3动画解决方案，Animatable更像css3动画的demo集合，如果你正在学习css3动画，那么推荐认真看下。</p>
<h4><a href="http://daneden.me/animate/" target="_blank">8.Animate.css</a></h4>
<p><a href="http://www.36ria.com/4685/8-9" rel="attachment wp-att-4705"><img src="http://www.36ria.com/wp-content/uploads/2011/12/8.jpg" alt="" title="8" width="500" height="250" class="alignnone size-full wp-image-4705" /></a></p>
<h4><a href="http://fx.inetcat.com/" target="_blank">9.$fx</a></h4>
<p><a href="http://www.36ria.com/4685/9-10" rel="attachment wp-att-4706"><img src="http://www.36ria.com/wp-content/uploads/2011/12/9.jpg" alt="" title="9" width="500" height="250" class="alignnone size-full wp-image-4706" /></a><br />
$fx是非常轻量的js动画库，只有3.7k。$fx可以实现一些很有意思的叠加动画（结合背景动画），有兴趣的朋友可以看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: Green;">var</span><span style="color: Gray;"> </span><span style="color: Blue;">moveBg0</span><span style="color: Gray;"> = </span><span style="color: Olive;">{</span><span style="color: Blue;">type</span><span style="color: Gray;">: </span><span style="color: #8b0000;">'</span><span style="color: Red;">backgroundx</span><span style="color: #8b0000;">'</span><span style="color: Gray;">, </span><span style="color: Blue;">to</span><span style="color: Gray;">: -</span><span style="color: Maroon;">314</span><span style="color: Gray;">, </span><span style="color: Blue;">step</span><span style="color: Gray;">: -</span><span style="color: Maroon;">1</span><span style="color: Gray;">, </span><span style="color: Blue;">delay</span><span style="color: Gray;">: </span><span style="color: Maroon;">20</span><span style="color: Olive;">}</span></li>
<li><span style="color: Green;">var</span><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">moveBg1</span><span style="color: Gray;"> = </span><span style="color: Olive;">{</span><span style="color: Blue;">type</span><span style="color: Gray;">: </span><span style="color: #8b0000;">'</span><span style="color: Red;">backgroundx</span><span style="color: #8b0000;">'</span><span style="color: Gray;">, </span><span style="color: Blue;">to</span><span style="color: Gray;">: -</span><span style="color: Maroon;">269</span><span style="color: Gray;">, </span><span style="color: Blue;">step</span><span style="color: Gray;">: -</span><span style="color: Maroon;">1</span><span style="color: Gray;">, </span><span style="color: Blue;">delay</span><span style="color: Gray;">: </span><span style="color: Maroon;">50</span><span style="color: Olive;">}</span></li>
<li><span style="color: Green;">var</span><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">stars</span><span style="color: Gray;"> = </span><span style="color: Teal;">document</span><span style="color: Gray;">.</span><span style="color: Blue;">getElementById</span><span style="color: Olive;">(</span><span style="color: #8b0000;">'</span><span style="color: Red;">sample1</span><span style="color: #8b0000;">'</span><span style="color: Olive;">)</span><span style="color: Gray;">.</span><span style="color: Blue;">getElementsByTagName</span><span style="color: Olive;">(</span><span style="color: #8b0000;">'</span><span style="color: Red;">div</span><span style="color: #8b0000;">'</span><span style="color: Olive;">)</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;">fx</span><span style="color: Olive;">(</span><span style="color: Blue;">stars</span><span style="color: Olive;">[</span><span style="color: Maroon;">0</span><span style="color: Olive;">])</span><span style="color: Gray;">.</span><span style="color: Blue;">fxAdd</span><span style="color: Olive;">(</span><span style="color: Blue;">moveBg0</span><span style="color: Olive;">)</span><span style="color: Gray;">.</span><span style="color: Blue;">fxRun</span><span style="color: Olive;">(</span><span style="color: Green;">null</span><span style="color: Gray;">, -</span><span style="color: Maroon;">1</span><span style="color: Olive;">)</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">$</span><span style="color: Blue;">fx</span><span style="color: Olive;">(</span><span style="color: Blue;">stars</span><span style="color: Olive;">[</span><span style="color: Maroon;">1</span><span style="color: Olive;">])</span><span style="color: Gray;">.</span><span style="color: Blue;">fxAdd</span><span style="color: Olive;">(</span><span style="color: Blue;">moveBg1</span><span style="color: Olive;">)</span><span style="color: Gray;">.</span><span style="color: Blue;">fxRun</span><span style="color: Olive;">(</span><span style="color: Green;">null</span><span style="color: Gray;">, -</span><span style="color: Maroon;">1</span><span style="color: Olive;">)</span><span style="color: Gray;">;</span></li></ol></div>
<h4><a href="http://scripty2.com/" target="_blank">10.Scripty2</a></h4>
<p><a href="http://www.36ria.com/4685/10-7" rel="attachment wp-att-4707"><img src="http://www.36ria.com/wp-content/uploads/2011/12/10.jpg" alt="" title="10" width="500" height="250" class="alignnone size-full wp-image-4707" /></a><br />
原文：<a href="http://www.queness.com/post/9999/10-css-and-javascript-animation-plugins-frameworks-and-libraries" target="_blank">http://www.queness.com/post/9999/10-css-and-javascript-animation-plugins-frameworks-and-libraries</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.36ria.com/4685/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>CommonJS Modules/1.1.1笔记</title>
		<link>http://www.36ria.com/4687</link>
		<comments>http://www.36ria.com/4687#comments</comments>
		<pubDate>Fri, 16 Dec 2011 10:15:12 +0000</pubDate>
		<dc:creator>天河</dc:creator>
				<category><![CDATA[javascript]]></category>

		<guid isPermaLink="false">http://www.36ria.com/?p=4687</guid>
		<description><![CDATA[先简单说明下CommonJS模块。每个模块都有对应的标示符，而标示符有两种：相对标示符与绝对标示符。模块的上下文中，有require、exports以及module三个变量。 &#160; 模块的引入是通过模块中的require函数完成的，参数是要引入的模块标示符，返回值是被引入模块暴露的API。require可以有一个main属性，这个属性是只读的，一般指向主模块的”module”对象（没有主模块时为undefined）。......]]></description>
			<content:encoded><![CDATA[<p>先简单说明下CommonJS模块。每个模块都有对应的标示符，而标示符有两种：相对标示符与绝对标示符。模块的上下文中，有<strong>require</strong>、<strong>exports</strong>以及<strong>module</strong>三个变量。</p>
<p>&nbsp;</p>
<p>模块的引入是通过模块中的<strong>require</strong>函数完成的，参数是要引入的模块标示符，返回值是被引入模块暴露的API。require可以有一个<strong>main</strong>属性，这个属性是只读的，一般指向主模块的”module”对象（没有主模块时为undefined）。比如，在<a href="http://nodejs.org/docs/latest/api/modules.html#accessing_the_main_module">nodejs环境</a>中，你可以使用<strong>require.main === module</strong>来判断当前模块是否为主模块。如果不是沙箱环境，require还可以有一个paths属性，这个属性是一个字符串数组，内容是顶级标示符对应的模块查找目录。paths属性是全局唯一的，对它的修改会影响模块的搜索行为。需要注意的是，<strong>paths</strong>内容的格式是由模块的loader程序决定的，规范没有统一规定。</p>
<p>&nbsp;</p>
<p>模块引入部分最让我费解的是模块出现循环依赖时的处理方式。不过，在<a href="http://yiminghe.iteye.com/blog/1305021">承玉</a>同学的帮助下，终于搞明白了。比如下面的例子：</p>
<p>a.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;">exports</span><span style="color: Gray;">.</span><span style="color: Blue;">done</span><span style="color: Gray;"> = </span><span style="color: Green;">false</span><span style="color: Gray;">;</span></li>
<li><span style="color: Green;">var</span><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">b</span><span style="color: Gray;"> = </span><span style="color: Blue;">require</span><span style="color: Olive;">(</span><span style="color: #8b0000;">'</span><span style="color: Red;">./b.js</span><span style="color: #8b0000;">'</span><span style="color: Olive;">)</span><span style="color: Gray;">;</span></li>
<li><span style="color: Blue;">exports</span><span style="color: Gray;">.</span><span style="color: Blue;">done</span><span style="color: Gray;"> = </span><span style="color: Green;">true</span><span style="color: Gray;">;</span></li></ol></div>
<p>b.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: Green;">var</span><span style="color: Gray;"> </span><span style="color: Blue;">a</span><span style="color: Gray;"> = </span><span style="color: Blue;">require</span><span style="color: Olive;">(</span><span style="color: #8b0000;">'</span><span style="color: Red;">./a.js</span><span style="color: #8b0000;">'</span><span style="color: Olive;">)</span><span style="color: Gray;">;</span></li>
<li><span style="color: Blue;">console</span><span style="color: Gray;">.</span><span style="color: Blue;">log</span><span style="color: Olive;">(</span><span style="color: #8b0000;">'</span><span style="color: Red;">in b, a.done = %j</span><span style="color: #8b0000;">'</span><span style="color: Gray;">, </span><span style="color: Blue;">a</span><span style="color: Gray;">.</span><span style="color: Blue;">done</span><span style="color: Olive;">)</span><span style="color: Gray;">;</span></li></ol></div>
<p>&nbsp;</p>
<p>如果直接运行a.js，在b.js中引入模块a时，a实际上并没有完全执行。这个时候，按规范的要求，require至少会返回被require时已经执行的部分，这里是exports.done = false。因此，这段代码会输出“in b, a.done = false”。（如果你有兴趣，可以用nodejs测试一下循环依赖的问题。不过需要注意，在nodejs中，模块在第一次执行后，会被缓存下来）</p>
<p>&nbsp;</p>
<p>与引入相反，模块向外界暴露API是通过exports对象实现的。</p>
<p>&nbsp;</p>
<p>模块最后一个属性：”module”有一个必选属性”id”和一个可选属性”uri”。模块的id的值是改模块的顶级标示符，这个值是只读的。而”uri”属性指向该模块所在的资源文件的URI。在沙箱环境里是没有”uri”属性的。</p>
<p>&nbsp;</p>
<p>模块的标示符是一个字符串，内容是由&#8217;/'分割的”terms”，每个”term”都是驼峰式的标示符、”.”或”..”。如果标示符以”.”或”..”开始，该标示符就是相对标示符。相对标示符是相对调用”require”的模块，顶级标示符是相对于模块的根命名空间。最后一点，标示符可以没有”.js”这样的文件后缀。</p>
<p>&nbsp;</p>
<p>个人感觉顶级标示符这里，规范的解释并不是很清晰，使用时还是应该以模块的loader为准。</p>
<p>&nbsp;</p>
<p>整体看下来，<a href="http://wiki.commonjs.org/wiki/Modules/1.1.1">Modules/1.1.1规范</a>还有不少不清楚或有争议的地方，这个在CommonJS的<a href="http://wiki.commonjs.org/wiki/Modules">wiki</a>里也承认。不过模块的组织思想应该不会变了。人们的实践也走在了规范的前面，比如<a href="http://seajs.com/">seajs</a> <img src='http://www.36ria.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://www.36ria.com/4687/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>ant结合yui-compressor和closure-compiler—ant入门指南（7）</title>
		<link>http://www.36ria.com/4644</link>
		<comments>http://www.36ria.com/4644#comments</comments>
		<pubDate>Tue, 06 Dec 2011 11:02:32 +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=4644</guid>
		<description><![CDATA[接下来几篇明河将开始讲解ant的实战部分的教程。今天介绍是ant如何结合前端必备的yui-compressor或closure-compiler的用法。 ant与yui-compressor 关于yui-compressor，明河以前有发个详细的教程，如果有不明白其使用的朋友，请点击《YUI Compressor快速使用指南—web前端开发七武器》。 为什么yui-compressor需要和ant结合使用？ yui-compressor已经批处理工具，右键可以压缩文件，已经颇为方便了，......]]></description>
			<content:encoded><![CDATA[<p>接下来几篇明河将开始讲解ant的实战部分的教程。今天介绍是ant如何结合前端必备的yui-compressor或closure-compiler的用法。</p>
<h4>ant与yui-compressor</h4>
<p>关于yui-compressor，明河以前有发个详细的教程，如果有不明白其使用的朋友，请点击<a href="http://www.36ria.com/3948">《YUI Compressor快速使用指南—web前端开发七武器》</a>。</p>
<h5>为什么yui-compressor需要和ant结合使用？</h5>
<p>yui-compressor已经批处理工具，右键可以压缩文件，已经颇为方便了，为什么还需要ant去调用yui-compressor呢？<br />
思考以下场景：</p>
<ol>
<li>你需要批量压缩10个或更多的js或css文件（一个一个人肉点右键？）</li>
<li>你需要经常维护一批js或css文件，每次发布都人肉右键？</li>
</ol>
<p>作为典型的懒人，明河渴望有一种工具，运行一次帮我批量压缩文件，然后使用FTP发布到服务器上。ant就是这样的工具。</p>
<h5>接下来看下如何使用ant调用yui-compressor</h5>
<p>明河已经准备好demo文件（是明河正在写的异步文件上传组件），但是务必修改下build.xml文件中的yui-compressor和closure-compiler的路径。</p>
<ul class="tow-columns clearfix">
<li class="l"><a href="http://www.36ria.com/wp-content/plugins/download-monitor/download.php?id=224" title="名称：ant-demo-7，下载次数：74，文件大小：24.79 kB" class="btn-download">点此下载</a></li>
<li class="l"></li>
</ul>
<p>定义属性：源码文件路径，css路径，yuicompressor.jar的路径</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;">property</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.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;">${current.dir}/../uploader/</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;!--css路径--&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;">css.path</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;">${uploader.dir}/uploader.css</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;!--yuicompressor程序路径--&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;">yuicompressor.path</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;">${current.dir}/yuicompressor/yuicompressor.jar</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">/&gt;</span></li></ol></div>
<p><strong>任务1：压缩uploader/uploader.css到uploader-min.css</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;">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-css</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.dir}/../</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;">&nbsp; </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.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;">uploader.css</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;">${yuicompressor.path}</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 gbk</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;">--type</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;">css</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;">-o</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;">glob</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;">*.css</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;">*-min.css</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>minify-css任务执行yuicompressor.jar，apply标签（dataType），明河在上一篇教程中并没有讲到。apply用于执行java程序。留意dest属性，用于指定输出目录，是必须的。<br />
子元素fileset用于提取源文件，这里只需要uploader/uploader.css这个文件。<br />
arg标签上一篇教程明河已经讲过了，最后会合并成1行命名。</p>
<ul>
<li>-jar：yuicompressor.jar路径</li>
<li>&#8211;charset：输出文件编码</li>
<li>&#8211;type：文件压缩类型，css或js</li>
<li>-o：输出路径</li>
</ul>
<p>代码中的mapper标签(dataType)的用途是什么？<br />
mapper定义了一组源文件和一组目标文件的关联方式。共有三个关键属性：</p>
<ul>
<li>type：关联方式，值有glob、identity、flattern、merge、regexp</li>
<li>from：源文件</li>
<li>to：目标文件</li>
</ul>
<p>关键看下type属性，当值为glob时，表示基于简单的通配模式（比如*、**）确定文件名。大多数情况glob属性已经够用了。<br />
yuicompressor需要使用mapper来确定批量输出文件规则，明河的demo代码很简单，将*.css输出成*-min.css即可。<br />
尝试执行ant minify-css，如果构建顺利的话如下图：<br />
<a href="http://www.36ria.com/4644/2011-12-6-16-40-47" rel="attachment wp-att-4676"><img src="http://www.36ria.com/wp-content/uploads/2011/12/2011-12-6-16-40-47.png" alt="" title="2011-12-6 16-40-47" width="426" height="237" class="alignnone size-full wp-image-4676" /></a><br />
<strong>任务2：压缩uploader目录下的js文件为*-min.js</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: #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;">minify-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: 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;">dest</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">${uploader.dir}/../</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.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;">${yuicompressor.path}</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;">-o</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;">glob</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;">*-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>如果执行顺利的话将输出以下文件：<br />
<a href="http://www.36ria.com/4644/2011-12-6-17-14-25" rel="attachment wp-att-4677"><img src="http://www.36ria.com/wp-content/uploads/2011/12/2011-12-6-17-14-25.png" alt="" title="2011-12-6 17-14-25" width="442" height="105" class="alignnone size-full wp-image-4677" /></a></p>
<h4>ant与closure-compiler</h4>
<p>ant执行closure-compiler与yui-compressor基本上一样。closure-compiler的js压缩比yui-compressor强悍，明河一般使用closure-compiler压缩js文件，使用yui-compressor压缩css文件。接下来来看下closure-compiler的调用语法。<br />
<strong>任务：合并几个js文件，并压缩合并后的文件</strong><br />
合并uploader/base.js、uploader/render.sj、uploader/renderUploader.js为uploader.source.js，并压缩成uploader-min.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;">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;">closure</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,minify-js-closure</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; </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--&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;">${uploader.dir}/../uploader.source.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: Gray;">&nbsp;</span><span style="color: #00008b;">path</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">${uploader.dir}/base.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: Gray;">&nbsp;</span><span style="color: #00008b;">path</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">${uploader.dir}/render.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: Gray;">&nbsp;</span><span style="color: #00008b;">path</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">${uploader.dir}/renderUploader.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;">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;!--使用closure压缩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;">minify-js-closure</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.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.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;">${closure.path}</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 gbk</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;">^(.*)\.source\.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>关于concat任务标签，之前的教程已经讲过乐，明河不再累述。重点看下minify-js-closure这个任务。<br />
closure-compiler的调用参数与yui-compressor有一些不同，输出不是使用-o参数，而是使用&#8211;js_output_file。<br />
明河这里也演示了mapper标签中type=”regexp”的情况，使用正则规则来匹配源文件和目标问题。<br />
（PS:补充个正则知识，(.*)为建立分组捕获，to=”\1-min.js”中的\1，使用该分组。）</p>
]]></content:encoded>
			<wfw:commentRss>http://www.36ria.com/4644/feed</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
		<item>
		<title>让css动起来&#8212;-lesscss（1）</title>
		<link>http://www.36ria.com/4648</link>
		<comments>http://www.36ria.com/4648#comments</comments>
		<pubDate>Wed, 23 Nov 2011 11:02:56 +0000</pubDate>
		<dc:creator>苏河</dc:creator>
				<category><![CDATA[css]]></category>

		<guid isPermaLink="false">http://www.36ria.com/?p=4648</guid>
		<description><![CDATA[为什么今天要谈lesscss呢，因为首先css语言是静态的，而lesscss却是动态的，如果有需要的童鞋请点击这里进行下载lesscss，lesscss的官网lesscss.org至今还是被墙的，这里截图留恋吧。 css木有变量，但是lesscss有，css木有继承，但是lesscss有，lesscss甚至有函数，可以进行属性合并，重写，lesscss优点还有很多很多，提高代码的维护成本，减少代码量（正所谓less嘛），让代码更加优雅。l......]]></description>
			<content:encoded><![CDATA[<p>为什么今天要谈lesscss呢，因为首先css语言是静态的，而lesscss却是动态的，如果有需要的童鞋请点击<a href="https://nodeload.github.com/cloudhead/less/zipball/master">这里</a>进行下载lesscss，lesscss的官网<a href="http://lesscss.org">lesscss.org</a>至今还是被墙的，这里截图留恋吧。<br />
<a href="http://www.36ria.com/4648/attachment/2011080118002730" rel="attachment wp-att-4651"><img src="http://www.36ria.com/wp-content/uploads/2011/11/2011080118002730-400x146.jpg" alt="" title="2011080118002730" width="400" height="146" class="aligncenter size-medium wp-image-4651" /></a><br />
css木有变量，但是lesscss有，css木有继承，但是lesscss有，lesscss甚至有函数，可以进行属性合并，重写，lesscss优点还有很多很多，提高代码的维护成本，减少代码量（正所谓less嘛），让代码更加优雅。lesscss有这么多的优点，怎么，心动了么，下面苏河来给大家介绍下lesscss的一些用法吧。</p>
<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: Gray;">@nice-blue: #5B83AD;</span></li>
<li><span style="color: Gray;">@light-blue: @nice-blue + #111;</span></li>
<li><span style="color: Gray;">#header { color: @light-blue; }</span></li></ol></div>
<h5>函数值传递</h5>
<p>我们可以通过定义参数来达到值传递的目的，类似函数，我们可以将一些hack整理成统一的函数来达到牵一发而动全身的目的</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;">border-radius (@radius) {</span></li>
<li><span style="color: Gray;">border-radius: @radius;</span></li>
<li><span style="color: Gray;">-moz-border-radius: @radius;</span></li>
<li><span style="color: Gray;">-webkit-border-radius: @radius;</span></li>
<li><span style="color: Gray;">}</span></li>
<li><span style="color: Gray;">#header {</span></li>
<li><span style="color: Gray;">border-radius(4px);</span></li>
<li><span style="color: Gray;">}</span></li></ol></div>
<h5>嵌套</h5>
<p>我们可以在lesscss使用嵌套的处理方式，这样可以给我们精简很多的代码，让css的层级更加具有归属感，我们甚至可以用&#038;符号来申明伪类属性</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;">#header {</span></li>
<li><span style="color: Gray;">color: black;</span></li>
<li><span style="color: Gray;">.navigation {</span></li>
<li><span style="color: Gray;">font-size: 12px;</span></li>
<li><span style="color: Gray;">}</span></li>
<li><span style="color: Gray;">.logo {</span></li>
<li><span style="color: Gray;">width: 300px;</span></li>
<li><span style="color: Gray;">&amp;:hover { text-decoration: none }</span></li>
<li><span style="color: Gray;">}</span></li>
<li><span style="color: Gray;">}</span></li></ol></div>
<h5>变量的操作</h5>
<p>我们可以通过变量的+-*/操作来达到一些运算的目的，想象一下运用场景，一个容器，我们会有三个等量大小的子容器用来填充，那么我们只需要做简单的除法运算即可，或许更复杂级别更深的会比较适合体现lesscss的优势</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;">@base: 5%;</span></li>
<li><span style="color: Gray;">@filler: @base * 2;</span></li>
<li><span style="color: Gray;">@other: @base + @filler;</span></li>
<li><span style="color: Gray;">color: #888 / 4;</span></li>
<li><span style="color: Gray;">background-color: @base-color + #111;</span></li>
<li><span style="color: Gray;">height: 100% / 2 + @filler</span></li></ol></div>
<h5>颜色函数</h5>
<p>lesscss提供了丰富的颜色函数，没有你想不到的。。</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;">@base: #f04615;</span></li>
<li><span style="color: Gray;">.class {</span></li>
<li><span style="color: Gray;">color: saturate(@base, 5%);</span></li>
<li><span style="color: Gray;">background-color: lighten(spin(@base, 8), 25%);</span></li>
<li><span style="color: Gray;">}</span></li></ol></div>
<p>今天关于less的介绍就到这里把，这里都是less的简单用法，怎么样，接下来的日子苏河会给大家介绍less的其他用法。</p>
<p>但是，lesscss有一个致命的缺点，就是依赖服务器语言进行编译，虽然说现在对于less的服务器语言支持是越来越多了，比如基于ruby的，nodejs，.NET,php的，但是仅仅这点会让很多的项目组成员变的敬而远之，增加学习成本。</p>
<p>这里大部分的内容源自lesscss的官方网站，也感谢法海提供的PPT，<a href="http://www.pushiming.com/blog/tag/lesscss/">http://www.pushiming.com/blog/tag/lesscss/</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.36ria.com/4648/feed</wfw:commentRss>
		<slash:comments>12</slash:comments>
		</item>
		<item>
		<title>dataType—ant入门指南（6）</title>
		<link>http://www.36ria.com/4591</link>
		<comments>http://www.36ria.com/4591#comments</comments>
		<pubDate>Tue, 15 Nov 2011 12:45:51 +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=4591</guid>
		<description><![CDATA[这是ant理论部分的最后一章，也是非常重要的一章，明河将介绍ant中常用的几种dataType的用法。 dataType可以理解为复杂数据集合，比如特定规则的文件列表集合。 ant的所有dataType标签 fileset：定义一个文件集合列表，这些文件必须确实存在 filelist：定义一个文件集合列表，这些文件无需确实存在 path：以某种在不同操作系统间可移植的方式指定路径 patternset：将一组模式分组在......]]></description>
			<content:encoded><![CDATA[<p>这是ant理论部分的最后一章，也是非常重要的一章，明河将介绍ant中常用的几种dataType的用法。<br />
dataType可以理解为复杂数据集合，比如特定规则的文件列表集合。</p>
<h4>ant的所有dataType标签</h4>
<ul>
<li><strong>fileset</strong>：定义一个文件集合列表，这些文件必须确实存在</li>
<li><strong>filelist</strong>：定义一个文件集合列表，这些文件无需确实存在</li>
<li><strong>path</strong>：以某种在不同操作系统间可移植的方式指定路径</li>
<li><strong>patternset</strong>：将一组模式分组在一起</li>
<li><strong>argument</strong>：对于由一个ant构建文件调用的程序，向其传递命令行参数（标签名是arg）</li>
<li><strong>filterlist</strong>：将一组过滤器分组在一起</li>
<li><strong>mapper</strong>：定义一组输入文件和一组输出文件间的复杂关系</li>
<li><strong>environment</strong>：于由一个ant构建文件调用的程序，向其传递环境变量</li>
</ul>
<p>必须掌握的是：<strong>fileset</strong>、<strong>filelist</strong>、<strong>path</strong>、<strong>argument</strong>、<strong>patternset</strong>。</p>
<ul class="tow-columns clearfix">
<li class="l"><a href="http://www.36ria.com/wp-content/plugins/download-monitor/download.php?id=223" title="名称：ant的demo，下载次数：39，文件大小：38.94 kB" class="btn-download">点此下载</a></li>
<li class="l"></li>
</ul>
<h4>fileset</h4>
<p>fileset和filelist（下面会讲到），功能上非常相近，都是用于获取一组文件列表，二者的不同之处在于fileset内的文件必须存在，filelist则没这要求；fileset的属性也比filelist更为的丰富，所以功能上更为的强大，一般使用fileset来获取文件。</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>dir</strong></p>
</td>
<td valign="top">
<p>fileset的基目录</p>
</td>
</tr>
<tr>
<td valign="top">
<p><strong>dir</strong></p>
</td>
<td valign="top">
<p>fileset的基目录</p>
</td>
</tr>
<tr>
<td valign="top">
<p><strong>casesensitive</strong></p>
</td>
<td valign="top">
<p>如果为false，那么匹配文件名时不区分大小写，默认为true</p>
</td>
</tr>
<tr>
<td valign="top">
<p><strong>defaultexcludes</strong></p>
</td>
<td valign="top">
<p>是否使用默认的排除模式，默认为true。默认的排除模式会把一些版本控制的文件夹或文件排除</p>
</td>
</tr>
<tr>
<td valign="top">
<p><strong>excludes</strong></p>
</td>
<td valign="top">
<p>排除指定的文件列表（用逗号隔开）</p>
</td>
</tr>
<tr>
<td valign="top">
<p><strong>excludesfile</strong></p>
</td>
<td valign="top">
<p>排除指定的文件</p>
</td>
</tr>
<tr>
<td valign="top">
<p><strong>includes</strong></p>
</td>
<td valign="top">
<p>需要包含的文件列表（用逗号隔开）</p>
</td>
</tr>
<tr>
<td valign="top">
<p><strong>includesfile</strong></p>
</td>
<td valign="top">
<p>包含指定的文件</p>
</td>
</tr>
</tbody>
</table>
<p>接下来来看几个demo，假设demo目录如图所示：<br />
<a href="http://www.36ria.com/4591/uploader-dir" rel="attachment wp-att-4629"><img src="http://www.36ria.com/wp-content/uploads/2011/11/uploader-dir.png" alt="" title="uploader-dir" width="204" height="418" class="alignnone size-full wp-image-4629" /></a></p>
<h5>任务1：合并uploader目录下的所有文件</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;">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;">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;">uploader</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-all</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;!--基目录--&gt;</span></li>
<li><span style="color: Gray;">&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;">current.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;">${ant.file.uploader}</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.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;">${current.dir}/uploader</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;">build-all</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;">echo</span><span style="color: Olive;">&gt;</span><span style="color: Gray;">dir:${current.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; </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;">uploader.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;">utf8</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;">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;">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.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: 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: Olive;">&lt;/</span><span style="color: Green;">project</span><span style="color: Olive;">&gt;</span></li></ol></div>
<p>concat（合并）这个任务标签，明河之前有讲过了，与之前写的demo不同的是，concat内增加了fileset。由于我们的需求是合并uploader目录下的所有js，所以uploader下文件不少，明显不可能单独一个个写path，这时候就需要用到fileset，获取文件列表集合。</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;">fileset</span><span style="color: Gray;"> </span><span style="color: #00008b;">dir</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">${uploader.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: Olive;">/&gt;</span></li></ol></div>
<p>fileset会获取${uploader.dir}（该属性引用指向uploader目录）下所有的js，通过<strong>includes=”**/*.js”</strong>包含所有js。<br />
也许你会对<strong>**/*</strong>感到疑惑，明河下面做个说明。</p>
<h5>包含和排除模式语法：</h5>
<ul>
<li><strong>*</strong>：匹配0或多个字符，比如*.js匹配minghe.js、taobao.js但不匹配minghe.css</li>
<li><strong>?</strong>：匹配1个字符，比如mingh?.js，匹配minghe.js、minghg.js，但不匹配minghe36.js</li>
<li><strong>**</strong>：匹配0或多个目录，比如/minghe/**，匹配/minghe/下的任意目录，**/*.js匹配任意目录下的所有js文件</li>
</ul>
<h5>使用patternset标签</h5>
<p>除了使用属性外，fileset还支持0到n个嵌套<strong>patternset</strong>元素，比如<code><exclude></code>、<code><include></code>等，关于patternset会在下面讲解到，这里先贴出修改后的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;">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-all2</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;">echo</span><span style="color: Olive;">&gt;</span><span style="color: Gray;">build-all2</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; </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;">uploader2.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;">utf8</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;">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;">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.dir}</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; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Olive;">&lt;</span><span style="color: Green;">include</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;">**/*.js</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; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Olive;">&lt;</span><span style="color: Green;">exclude</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;">demo/*.js</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; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Olive;">&lt;/</span><span style="color: Green;">fileset</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>这里的demo代码，与上一个demo相比，增加了一个排除文件模式，demo目录下的js文件，显然我们不需要，可以通过<code><exclude></code>标签予以排除</p>
<h4>filelist</h4>
<p>filelist通常与dependset任务一同使用，dependset任务用于将一个或多个源文件和1个或多个目标文件相比较，如果源文件存在更新或者删除，那么所有目标文件将将被删除。dependset用于确保文件的依赖性。</p>
<h5>filelist的属性</h5>
<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>dir</strong></p>
</td>
<td valign="top">
<p>fileset的基目录</p>
</td>
</tr>
<tr>
<td valign="top">
<p><strong>files</strong></p>
</td>
<td valign="top">
<p>用逗号隔开的文件列表</p>
</td>
</tr>
<tr>
<td valign="top">
<p><strong>refid</strong></p>
</td>
<td valign="top">
<p>对某处定义的一个<filelist>的引用，这对于希望多次复用一个定义的文件列表，非常有用。</p>
</td>
</tr>
</tbody>
</table>
<p>filelist的使用率不高，明河这里偷个懒，不再制作个独立的demo。 </p>
<h4>path</h4>
<p>path在java打包编译中常用到，可以以属性（多个路径用冒号或分号隔开）或嵌套元素的方式。<br />
path用于转换路径为当前用户操作系统可兼容的路径。（path dataType并不只有<code>
<path></code>元素，还有<code><classpath></code>等形式标签）。</p>
<h5>当path以标签的形式出现时，拥有以下属性：</h5>
<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>location</strong></p>
</td>
<td valign="top">
<p>表示一个文件或目录</p>
</td>
</tr>
<tr>
<td valign="top">
<p><strong>path</strong></p>
</td>
<td valign="top">
<p>一个文件和路径名列表，以冒号或分号隔开</p>
</td>
</tr>
<tr>
<td valign="top">
<p><strong>refid</strong></p>
</td>
<td valign="top">
<p>定义path的一个引用</p>
</td>
</tr>
</tbody>
</table>
<h4>patternset</h4>
<p>patternset与fileset是紧密结合的，常作为fileset的嵌套元素出现，比如<strong><include></strong>和<strong>exclude</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;">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-all3</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;">echo</span><span style="color: Olive;">&gt;</span><span style="color: Gray;">build-all2</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; </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;">uploader2.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;">utf8</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;">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;">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.dir}</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; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Olive;">&lt;</span><span style="color: Green;">include</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;">**/*.js</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;"> </span><span style="color: #00008b;">if</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">test</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; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Olive;">&lt;</span><span style="color: Green;">exclude</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;">demo/*.js</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;"> </span><span style="color: #00008b;">unless</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">demo</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; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Olive;">&lt;/</span><span style="color: Green;">fileset</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>留意代码中的if和unless属性，if=”test”可以理解为如果存在test属性，就读取文件，unless=”demo”可以理解为只有未设置demo属性时才读取文件。</p>
<h4>argument</h4>
<p>arg标签在apply、exec、java标签内嵌套，用于传递命名行参数。<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: Olive;">&lt;</span><span style="color: Green;">apply</span><span style="color: Gray;"> </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;">${combines.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;">${combines.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;">${current.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; &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 gbk</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;">^(.*)\.source\.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: Olive;">&lt;/</span><span style="color: Green;">apply</span><span style="color: Olive;">&gt;</span></li></ol></div>
<p>上述代码是调用google压缩器压缩js源文件，apply嵌套多个arg标签，比如下面的代码：</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;">arg</span><span style="color: Gray;"> </span><span style="color: #00008b;">path</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">${current.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; &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 gbk</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></ol></div>
<p>执行时会合并成一个命名行，类似&#8211;charset gbk &#8211;warning_level QUIET &#8211;js。</p>
<h4>明河结语</h4>
<p>理论部分讲解结束，接下来的教程将是ant的实战部分，比如ant结合yahoo和google的压缩器。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.36ria.com/4591/feed</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>property—ant入门指南（5）</title>
		<link>http://www.36ria.com/4584</link>
		<comments>http://www.36ria.com/4584#comments</comments>
		<pubDate>Thu, 03 Nov 2011 11:01:31 +0000</pubDate>
		<dc:creator>明河</dc:creator>
				<category><![CDATA[前端开发工具]]></category>
		<category><![CDATA[ant教程]]></category>

		<guid isPermaLink="false">http://www.36ria.com/?p=4584</guid>
		<description><![CDATA[property（属性）这个标签很常用，当你在build.xml中定义了property，任务可以随意的引用该property，比如以下代码： &#60;property name=&#34;author&#34; value=&#34;minghe&#34;/&#62; &#160; &#60;target&#160;name=&#34;test&#34;&#62; &#160; &#160; &#160; &#60;echo&#62;${author}&#60;/echo&#62; &#160; &#60;/target&#62; 当你要引入property，只要使用${property}语法即可。 properties文件的使用 考虑以下需求：build.xml需要提供给第三方使用......]]></description>
			<content:encoded><![CDATA[<p>property（属性）这个标签很常用，当你在build.xml中定义了property，任务可以随意的引用该property，比如以下代码：</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;">property</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;">author</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;">minghe</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;">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;">test</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: Olive;">&lt;</span><span style="color: Green;">echo</span><span style="color: Olive;">&gt;</span><span style="color: Gray;">${author}</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;</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>当你要引入property，只要使用<strong>${property}</strong>语法即可。</p>
<h4>properties文件的使用</h4>
<p>考虑以下需求：build.xml需要提供给第三方使用，第三方本机的代码路径一般都不一样，如果让第三方自己去修改build.xml的路径配置（假如在你的build.xml中有类似
<property name="assets.dir" location=""/>的定义），正好该用户不懂得ant，那么面对build.xml，他将无所适从。能不能将配置独立成一个文件，用户只要改那个配置文件即可呢？</p>
<p>ant的.properties文件恰恰解决这个需求。</p>
<p>在build.xml同级目录下建立个build.properties（文件名任意）；</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;">assets</span><span style="color: Gray;">.</span><span style="color: Blue;">dir</span><span style="color: Gray;"> = </span><span style="color: Blue;">d</span><span style="color: Gray;">:\</span><span style="color: Blue;">www</span><span style="color: Gray;">\</span><span style="color: Blue;">htdocs</span><span style="color: Gray;">\</span><span style="color: Blue;">ant</span><span style="color: Gray;">-</span><span style="color: Blue;">demo</span></li></ol></div>
<p>打开你的build.xml，插入如下代码：</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;">property</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;">build.properties</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">/&gt;</span></li></ol></div>
<p>property的<strong>file</strong>属性指向<strong>build.properties</strong>文件，那么ant在执行build.xml前会去找这个文件，build.properties内的属性会覆盖build.xml内的同名属性。</p>
<p>假设你的build.xml有如下property：</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;">property</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;">assets.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;">c:\demo</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">/&gt;</span></li></ol></div>
<p>你可以试下<echo>${assets.dir}</echo>，输出的将是build.properties文件内property值。</p>
<h4>value属性和location属性的区别</h4>
<p>这二个属性很容易混淆，不少朋友向明河询问，有了value，为什么还需要location呢？二者的作用不是一样的吗？</p>
<p>是的，value和location的功能是接近的，都是property的值，但有些小的区别，如果你的property存储的是路径，那么明河推荐使用location属性，location属性会对路径进行转换，永远返回绝对路径形式。来看实际代码：</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;">dirname</span><span style="color: Gray;"> </span><span style="color: #00008b;">property</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">current.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;">${ant.file}</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;">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;">assets.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;">${current.dir}/2.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;">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;">assets.dir2</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;">${current.dir}/2.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;">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;">location</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;">echo</span><span style="color: Olive;">&gt;</span><span style="color: Gray;">location:${assets.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; </span><span style="color: Olive;">&lt;</span><span style="color: Green;">echo</span><span style="color: Olive;">&gt;</span><span style="color: Gray;">value:${assets.dir2}</span><span style="color: Olive;">&lt;/</span><span style="color: Green;">echo</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>输出的结果如下：<br />
<a href="http://www.36ria.com/4584/2011-11-3-18-43-07" rel="attachment wp-att-4586"><img src="http://www.36ria.com/wp-content/uploads/2011/11/2011-11-3-18-43-07.png" alt="" title="2011-11-3 18-43-07" width="467" height="160" class="alignnone size-full wp-image-4586" /></a><br />
留意标黄部分的差异，当你使用location属性时，值内所有的“/”都会更换为“\”（即绝对路径的形式），而且还会去掉路径中多余的“/”。所以当你使用location属性存储路径信息时更为安全。</p>
<p>下一篇教程将向各位介绍dataType，之后就是ant的实战部分内容。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.36ria.com/4584/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>基于html5和jquery的文件上传组件</title>
		<link>http://www.36ria.com/4566</link>
		<comments>http://www.36ria.com/4566#comments</comments>
		<pubDate>Mon, 31 Oct 2011 14:58:16 +0000</pubDate>
		<dc:creator>飞绿</dc:creator>
				<category><![CDATA[javascript]]></category>
		<category><![CDATA[html5教程 异步文件上传]]></category>

		<guid isPermaLink="false">http://www.36ria.com/?p=4566</guid>
		<description><![CDATA[本文介绍一个采用HTML5 API的web应用—上传中心(Upload Center)，允许用户从本地计算机中拖拽图片到浏览器窗口上传图片。有图片预览和上传进度条，这些都可由客户端来控制。上传后，这些图片只是被存储到服务器上了，接下来就可以随意引用了。 点此查看demo 点此下载 什么是HTML5 文件上传 上传文件运用了HTML5的三个新特性：1、新的文件读取api(File Reader API) 2、新的拖拽api(Drag &......]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.36ria.com/4566/%e5%9f%ba%e4%ba%8ehtml5%e5%92%8cjquery%e7%9a%84%e6%96%87%e4%bb%b6%e4%b8%8a%e4%bc%a0%e7%bb%84%e4%bb%b6%e2%80%94%e9%a3%9e%e7%bb%bf" rel="attachment wp-att-4580"><img src="http://www.36ria.com/wp-content/uploads/2011/10/基于html5和jquery的文件上传组件—飞绿.png" alt="" title="基于html5和jquery的文件上传组件—飞绿" width="680" height="200" class="alignnone size-full wp-image-4580" /></a><br />
本文介绍一个采用HTML5 API的web应用—上传中心(<b>Upload Center</b>)，允许用户从本地计算机中拖拽图片到浏览器窗口上传图片。有图片预览和上传进度条，这些都可由客户端来控制。上传后，这些图片只是被存储到服务器上了，接下来就可以随意引用了。</p>
<ul class="tow-columns clearfix">
<li class="l"><a href="http://demo.tutorialzine.com/2011/09/html5-file-upload-jquery-php/" class="btn-view-demo" target="_blank">点此查看demo</a></li>
<li class="l"><a class="btn-download"  href="http://demo.tutorialzine.com/2011/09/html5-file-upload-jquery-php/html5-file-upload.zip">点此下载</a></li>
</ul>
<p>什么是HTML5 文件上传<br />
上传文件运用了HTML5的三个新特性：1、新的文件读取api(<a href="http://www.html5rocks.com/en/tutorials/file/dndfiles/" target="_blank">File Reader API</a>)  2、新的拖拽api(<a href="https://developer.mozilla.org/en/Using_files_from_web_applications" target="_blank">Drag &#038; Drop API</a>)  3、新的IO-ajax（增加了二进制数据传输）。下面是HTML5文件上传的步骤：</p>
<ol>
<li>1、用户从本地计选择一个或多个文件拖拽到浏览器窗口。支持拖拽的的浏览器会触发一个事件，事件包括一些有用的信息，其中包涵被选中的文件信息。</li>
<li>2、用HTML5的文件读取api，以二进制数据读取被选文件，并存储到内存中。</li>
<li>3、用XMLHttpRequest对象的新方法-<b>sendAsBinary</b>，将数据传到服务器。</li>
</ol>
<p>jQuery插件— <a href="https://github.com/weixiyen/jquery-filedrop" target="_blank">Filedrop</a>已经封装好这些功能，并且提供配置接口来限制上传文件的大小和指定回调函数。非常方便运用到自己的应用中。<br />
目前来看，文件上传只能在firefox和chrome浏览器中使用，但其他主流浏览器的下个版本已经计划支持该功能了。当然对于不支持的浏览器可以简单的放置input file控件来代替。但本文重点是应用HTML5上，这里就不做处理了。</p>
<h4>现在开始，首先是HTML结构</h4>
<p>上传中心的Html结构比较简单。先声明HTML5的doctype，然后引入样式文件和脚本文件-script.js、filedrop插件脚本和jquery库。<br />
html结构如下：<br />
<strong>index.html</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: 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: Gray;">&nbsp; &nbsp; </span><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; &nbsp; &nbsp; &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; &nbsp; &nbsp; &nbsp; &nbsp; </span><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: Gray;"> </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;">title</span><span style="color: Olive;">&gt;</span><span style="color: Gray;">HTML5 File Drag and Drop Upload with jQuery and PHP | Tutorialzine Demo</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; &nbsp;&nbsp; </span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: #ffa500;">&lt;!-- Our CSS stylesheet file --&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;">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;">assets/css/styles.css</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;&nbsp; </span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: #ffa500;">&lt;!--[if lt IE 9]&gt;</span></li>
<li><span style="color: #ffa500;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &lt;script src=&quot;http://html5shiv.googlecode.com/svn/trunk/html5.js&quot;&gt;&lt;/script&gt;</span></li>
<li><span style="color: #ffa500;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &lt;![endif]--&gt;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &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;&nbsp; </span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &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;&nbsp; </span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Olive;">&lt;</span><span style="color: Green;">header</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;">h1</span><span style="color: Olive;">&gt;</span><span style="color: Gray;">HTML5 File Upload with jQuery and PHP</span><span style="color: Olive;">&lt;/</span><span style="color: Green;">h1</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;">header</span><span style="color: Olive;">&gt;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp;&nbsp; </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: Gray;">&nbsp;</span><span style="color: #00008b;">id</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">dropbox</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;">span</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;">message</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">&gt;</span><span style="color: Gray;">Drop images here to upload. </span><span style="color: Olive;">&lt;</span><span style="color: Green;">br</span><span style="color: Gray;"> </span><span style="color: Olive;">/&gt;&lt;</span><span style="color: Green;">i</span><span style="color: Olive;">&gt;</span><span style="color: Gray;">(they will only be visible to you)</span><span style="color: Olive;">&lt;/</span><span style="color: Green;">i</span><span style="color: Olive;">&gt;&lt;/</span><span style="color: Green;">span</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; </span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: #ffa500;">&lt;!-- Including The jQuery Library --&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;">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;">http://code.jquery.com/jquery-1.6.3.min.js</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: Gray;">&nbsp; &nbsp;&nbsp; </span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: #ffa500;">&lt;!-- Including the HTML5 Uploader plugin --&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;">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;">assets/js/jquery.filedrop.js</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: Gray;">&nbsp; &nbsp;&nbsp; </span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: #ffa500;">&lt;!-- The main script file --&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;">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;">assets/js/script.js</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: Gray;">&nbsp; &nbsp;&nbsp; </span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &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;">html</span><span style="color: Olive;">&gt;</span></li></ol></div>
<p>这里<b>div#dropbox</b>会传递给filedrop插件，插件会监听是否有文件被拖拽到div#dropbox上。当上传出错时，展现信息的span会提示错误信息。（如，浏览器不支持HTML5的api时就会显示相应的提示信息）</p>
<p>然后，文件选择后，通过基于jquery的js编码实现图片预览效果。预览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;">class</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">preview done</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">&gt;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp;&nbsp; </span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Olive;">&lt;</span><span style="color: Green;">span</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;">imageHolder</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;">img</span><span style="color: Gray;">&nbsp;</span><span style="color: #00008b;">src</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;&quot;</span><span style="color: Gray;"> </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;">span</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;">uploaded</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">&gt;&lt;/</span><span style="color: Green;">span</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;">span</span><span style="color: Olive;">&gt;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp;&nbsp; </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;">progressHolder</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;">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;">progress</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>
<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; </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>本段包括图片预览（img 的src属性会用图片的<a href="http://en.wikipedia.org/wiki/Data_URI_scheme" target="_blank">DataURL</a>填充）和上传进度条的html结构。预览容器的一个class值done，可以使span.uploaded显示（默认情况下该span是隐藏的）。该span用绿色背景标记，表示上传已完成。</p>
<p>html结构完成了，接下来开始脚本编码。<br />
事实上文件上传相关的功能Filedrop插件都封装好了，这里的上传中心只需要运用它，并且将回调的方法传递给它。需要在服务器端写一段php脚本来处理上传的文件，下面一节会讲到。<br />
第一步，写一个辅助的方法来读取文件对象（该对象是文件被选择后由浏览器端创建的，包括如文件名称、文件路劲和文件大小等的属性），然后生成预览的html结构。<br />
<strong>assets/js/script.js</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: Green;">var</span><span style="color: Gray;"> </span><span style="color: Blue;">template</span><span style="color: Gray;"> = </span><span style="color: #8b0000;">'</span><span style="color: Red;">&lt;div class=&quot;preview&quot;&gt;</span><span style="color: #8b0000;">'</span><span style="color: Gray;">+</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: #8b0000;">'</span><span style="color: Red;">&lt;span class=&quot;imageHolder&quot;&gt;</span><span style="color: #8b0000;">'</span><span style="color: Gray;">+</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: #8b0000;">'</span><span style="color: Red;">&lt;img /&gt;</span><span style="color: #8b0000;">'</span><span style="color: Gray;">+</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: #8b0000;">'</span><span style="color: Red;">&lt;span class=&quot;uploaded&quot;&gt;&lt;/span&gt;</span><span style="color: #8b0000;">'</span><span style="color: Gray;">+</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: #8b0000;">'</span><span style="color: Red;">&lt;/span&gt;</span><span style="color: #8b0000;">'</span><span style="color: Gray;">+</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: #8b0000;">'</span><span style="color: Red;">&lt;div class=&quot;progressHolder&quot;&gt;</span><span style="color: #8b0000;">'</span><span style="color: Gray;">+</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: #8b0000;">'</span><span style="color: Red;">&lt;div class=&quot;progress&quot;&gt;&lt;/div&gt;</span><span style="color: #8b0000;">'</span><span style="color: Gray;">+</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: #8b0000;">'</span><span style="color: Red;">&lt;/div&gt;</span><span style="color: #8b0000;">'</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: #8b0000;">'</span><span style="color: Red;">&lt;/div&gt;</span><span style="color: #8b0000;">'</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp;&nbsp; </span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Green;">function</span><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">createImage</span><span style="color: Olive;">(</span><span style="color: Blue;">file</span><span style="color: Olive;">){</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp;&nbsp; </span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Green;">var</span><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">preview</span><span style="color: Gray;"> = $</span><span style="color: Olive;">(</span><span style="color: Blue;">template</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; </span><span style="color: Blue;">image</span><span style="color: Gray;"> = $</span><span style="color: Olive;">(</span><span style="color: #8b0000;">'</span><span style="color: Red;">img</span><span style="color: #8b0000;">'</span><span style="color: Gray;">, </span><span style="color: Blue;">preview</span><span style="color: Olive;">)</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp;&nbsp; </span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Green;">var</span><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">reader</span><span style="color: Gray;"> = </span><span style="color: Green;">new</span><span style="color: Gray;"> </span><span style="color: Blue;">FileReader</span><span style="color: Olive;">()</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp;&nbsp; </span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Blue;">image</span><span style="color: Gray;">.</span><span style="color: Blue;">width</span><span style="color: Gray;"> = </span><span style="color: Maroon;">100</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Blue;">image</span><span style="color: Gray;">.</span><span style="color: Blue;">height</span><span style="color: Gray;"> = </span><span style="color: Maroon;">100</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp;&nbsp; </span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Blue;">reader</span><span style="color: Gray;">.</span><span style="color: Blue;">onload</span><span style="color: Gray;"> = </span><span style="color: Green;">function</span><span style="color: Olive;">(</span><span style="color: Blue;">e</span><span style="color: Olive;">){</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp;&nbsp; </span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: #ffa500;">// e.target.result holds the DataURL which</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: #ffa500;">// can be used as a source of the image:</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp;&nbsp; </span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Blue;">image</span><span style="color: Gray;">.</span><span style="color: Blue;">attr</span><span style="color: Olive;">(</span><span style="color: #8b0000;">'</span><span style="color: Red;">src</span><span style="color: #8b0000;">'</span><span style="color: Gray;">,</span><span style="color: Blue;">e</span><span style="color: Gray;">.</span><span style="color: Blue;">target</span><span style="color: Gray;">.</span><span style="color: Blue;">result</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: Olive;">}</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp;&nbsp; </span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: #ffa500;">// Reading the file as a DataURL. When finished,</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: #ffa500;">// this will trigger the onload function above:</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Blue;">reader</span><span style="color: Gray;">.</span><span style="color: Blue;">readAsDataURL</span><span style="color: Olive;">(</span><span style="color: Blue;">file</span><span style="color: Olive;">)</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp;&nbsp; </span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Blue;">message</span><span style="color: Gray;">.</span><span style="color: Blue;">hide</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;">preview</span><span style="color: Gray;">.</span><span style="color: Blue;">appendTo</span><span style="color: Olive;">(</span><span style="color: Blue;">dropbox</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: #ffa500;">// Associating a preview container</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: #ffa500;">// with the file, using jQuery's $.data():</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp;&nbsp; </span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $.</span><span style="color: Blue;">data</span><span style="color: Olive;">(</span><span style="color: Blue;">file</span><span style="color: Gray;">,</span><span style="color: Blue;">preview</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></ol></div>
<p><b>Template</b>用于创建图片预览的HTML结构。获取图片的DataURL（64位编码的图片数据），然后赋值给图片的src。然后创建好的预览会被添加到div#dropbox中。现在还剩下filedrop的回调处理了。<br />
<strong>assets/js/script.js</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: Green;">function</span><span style="color: Olive;">(){</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp;&nbsp; </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;">dropbox</span><span style="color: Gray;"> = $</span><span style="color: Olive;">(</span><span style="color: #8b0000;">'</span><span style="color: Red;">#dropbox</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; &nbsp; &nbsp; </span><span style="color: Blue;">message</span><span style="color: Gray;"> = $</span><span style="color: Olive;">(</span><span style="color: #8b0000;">'</span><span style="color: Red;">.message</span><span style="color: #8b0000;">'</span><span style="color: Gray;">, </span><span style="color: Blue;">dropbox</span><span style="color: Olive;">)</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp;&nbsp; </span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Blue;">dropbox</span><span style="color: Gray;">.</span><span style="color: Blue;">filedrop</span><span style="color: Olive;">({</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: #ffa500;">// The name of the $_FILES entry:</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Blue;">paramname</span><span style="color: Gray;">:</span><span style="color: #8b0000;">'</span><span style="color: Red;">pic</span><span style="color: #8b0000;">'</span><span style="color: Gray;">,</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp;&nbsp; </span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Blue;">maxfiles</span><span style="color: Gray;">: </span><span style="color: Maroon;">5</span><span style="color: Gray;">,</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Blue;">maxfilesize</span><span style="color: Gray;">: </span><span style="color: Maroon;">2</span><span style="color: Gray;">, </span><span style="color: #ffa500;">// in mb</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Blue;">url</span><span style="color: Gray;">: </span><span style="color: #8b0000;">'</span><span style="color: Red;">post_file.php</span><span style="color: #8b0000;">'</span><span style="color: Gray;">,</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp;&nbsp; </span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Blue;">uploadFinished</span><span style="color: Gray;">:</span><span style="color: Green;">function</span><span style="color: Olive;">(</span><span style="color: Blue;">i</span><span style="color: Gray;">,</span><span style="color: Blue;">file</span><span style="color: Gray;">,</span><span style="color: Blue;">response</span><span style="color: Olive;">){</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $.</span><span style="color: Blue;">data</span><span style="color: Olive;">(</span><span style="color: Blue;">file</span><span style="color: Olive;">)</span><span style="color: Gray;">.</span><span style="color: Blue;">addClass</span><span style="color: Olive;">(</span><span style="color: #8b0000;">'</span><span style="color: Red;">done</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; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: #ffa500;">// response is the JSON object that post_file.php returns</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Olive;">}</span><span style="color: Gray;">,</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp;&nbsp; </span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Blue;">error</span><span style="color: Gray;">: </span><span style="color: Green;">function</span><span style="color: Olive;">(</span><span style="color: Blue;">err</span><span style="color: Gray;">, </span><span style="color: Blue;">file</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;">switch</span><span style="color: Olive;">(</span><span style="color: Blue;">err</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; </span><span style="color: Green;">case</span><span style="color: Gray;">&nbsp;</span><span style="color: #8b0000;">'</span><span style="color: Red;">BrowserNotSupported</span><span style="color: #8b0000;">'</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: Blue;">showMessage</span><span style="color: Olive;">(</span><span style="color: #8b0000;">'</span><span style="color: Red;">Your browser does not support HTML5 file uploads!</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; &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: Green;">case</span><span style="color: Gray;">&nbsp;</span><span style="color: #8b0000;">'</span><span style="color: Red;">TooManyFiles</span><span style="color: #8b0000;">'</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: Blue;">alert</span><span style="color: Olive;">(</span><span style="color: #8b0000;">'</span><span style="color: Red;">Too many files! Please select 5 at most!</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; &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: Green;">case</span><span style="color: Gray;">&nbsp;</span><span style="color: #8b0000;">'</span><span style="color: Red;">FileTooLarge</span><span style="color: #8b0000;">'</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: Blue;">alert</span><span style="color: Olive;">(</span><span style="color: Blue;">file</span><span style="color: Gray;">.</span><span style="color: Blue;">name</span><span style="color: Gray;">+</span><span style="color: #8b0000;">'</span><span style="color: Red;"> is too large! Please upload files up to 2mb.</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; &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: Green;">default</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; </span><span style="color: Olive;">}</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Olive;">}</span><span style="color: Gray;">,</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp;&nbsp; </span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: #ffa500;">// Called before each upload is started</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Blue;">beforeEach</span><span style="color: Gray;">: </span><span style="color: Green;">function</span><span style="color: Olive;">(</span><span style="color: Blue;">file</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;">if</span><span style="color: Olive;">(</span><span style="color: Gray;">!</span><span style="color: Blue;">file</span><span style="color: Gray;">.</span><span style="color: Blue;">type</span><span style="color: Gray;">.</span><span style="color: Blue;">match</span><span style="color: Olive;">(</span><span style="color: #8b0000;">/</span><span style="color: Red;">^image</span><span style="color: Navy;">\/</span><span style="color: #8b0000;">/</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;">alert</span><span style="color: Olive;">(</span><span style="color: #8b0000;">'</span><span style="color: Red;">Only images are allowed!</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; </span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: #ffa500;">// Returning false will cause the</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: #ffa500;">// file to be rejected</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Green;">return</span><span style="color: Gray;">&nbsp;</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; </span><span style="color: Olive;">}</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Olive;">}</span><span style="color: Gray;">,</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp;&nbsp; </span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Blue;">uploadStarted</span><span style="color: Gray;">:</span><span style="color: Green;">function</span><span style="color: Olive;">(</span><span style="color: Blue;">i</span><span style="color: Gray;">, </span><span style="color: Blue;">file</span><span style="color: Gray;">, </span><span style="color: Blue;">len</span><span style="color: Olive;">){</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Blue;">createImage</span><span style="color: Olive;">(</span><span style="color: Blue;">file</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: Olive;">}</span><span style="color: Gray;">,</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp;&nbsp; </span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Blue;">progressUpdated</span><span style="color: Gray;">: </span><span style="color: Green;">function</span><span style="color: Olive;">(</span><span style="color: Blue;">i</span><span style="color: Gray;">, </span><span style="color: Blue;">file</span><span style="color: Gray;">, </span><span style="color: Blue;">progress</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: Blue;">data</span><span style="color: Olive;">(</span><span style="color: Blue;">file</span><span style="color: Olive;">)</span><span style="color: Gray;">.</span><span style="color: Blue;">find</span><span style="color: Olive;">(</span><span style="color: #8b0000;">'</span><span style="color: Red;">.progress</span><span style="color: #8b0000;">'</span><span style="color: Olive;">)</span><span style="color: Gray;">.</span><span style="color: Blue;">width</span><span style="color: Olive;">(</span><span style="color: Blue;">progress</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: Olive;">}</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp;&nbsp; </span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Olive;">})</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp;&nbsp; </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;">template</span><span style="color: Gray;"> = </span><span style="color: #8b0000;">'</span><span style="color: Red;">...</span><span style="color: #8b0000;">'</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp;&nbsp; </span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Green;">function</span><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">createImage</span><span style="color: Olive;">(</span><span style="color: Blue;">file</span><span style="color: Olive;">){</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: #ffa500;">// ... see above ...</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;&nbsp; </span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Green;">function</span><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">showMessage</span><span style="color: Olive;">(</span><span style="color: Blue;">msg</span><span style="color: Olive;">){</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Blue;">message</span><span style="color: Gray;">.</span><span style="color: Blue;">html</span><span style="color: Olive;">(</span><span style="color: Blue;">msg</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;&nbsp; </span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Olive;">})</span><span style="color: Gray;">;</span></li></ol></div>
<p>然后，被拖拽到<b>div#dropbox</b>的有效的图片文件通过<b>post_file.php</b>上传到服务器上。</p>
<h4>PHP 处理：</h4>
<p>在php服务器端，正常上传的图片和被拖拽上传的图片不会有区别。这意味着在服务器端只需要提供一个回调来处理上传的文件。<br />
<strong>post_file.php</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: #ffa500;">// If you want to ignore the uploaded files,</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: #ffa500;">// set $demo_mode to true;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp;&nbsp; </span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: #00008b;">$demo_mode</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; </span><span style="color: #00008b;">$upload_dir</span><span style="color: Gray;"> = </span><span style="color: #8b0000;">'</span><span style="color: Red;">uploads/</span><span style="color: #8b0000;">'</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: #00008b;">$allowed_ext</span><span style="color: Gray;"> = </span><span style="color: Green;">array</span><span style="color: Olive;">(</span><span style="color: #8b0000;">'</span><span style="color: Red;">jpg</span><span style="color: #8b0000;">'</span><span style="color: Gray;">,</span><span style="color: #8b0000;">'</span><span style="color: Red;">jpeg</span><span style="color: #8b0000;">'</span><span style="color: Gray;">,</span><span style="color: #8b0000;">'</span><span style="color: Red;">png</span><span style="color: #8b0000;">'</span><span style="color: Gray;">,</span><span style="color: #8b0000;">'</span><span style="color: Red;">gif</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; </span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Green;">if</span><span style="color: Olive;">(</span><span style="color: Blue;">strtolower</span><span style="color: Olive;">(</span><span style="color: #00008b;">$_SERVER</span><span style="color: Olive;">[</span><span style="color: #8b0000;">'</span><span style="color: Red;">REQUEST_METHOD</span><span style="color: #8b0000;">'</span><span style="color: Olive;">])</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: Olive;">){</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Blue;">exit_status</span><span style="color: Olive;">(</span><span style="color: #8b0000;">'</span><span style="color: Red;">Error! Wrong HTTP method!</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: Gray;">&nbsp; &nbsp;&nbsp; </span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Green;">if</span><span style="color: Olive;">(</span><span style="color: Blue;">array_key_exists</span><span style="color: Olive;">(</span><span style="color: #8b0000;">'</span><span style="color: Red;">pic</span><span style="color: #8b0000;">'</span><span style="color: Gray;">,</span><span style="color: #00008b;">$_FILES</span><span style="color: Olive;">)</span><span style="color: Gray;"> &amp;&amp; </span><span style="color: #00008b;">$_FILES</span><span style="color: Olive;">[</span><span style="color: #8b0000;">'</span><span style="color: Red;">pic</span><span style="color: #8b0000;">'</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><span style="color: Maroon;">0</span><span style="color: Gray;">&nbsp;</span><span style="color: Olive;">){</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp;&nbsp; </span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: #00008b;">$pic</span><span style="color: Gray;"> = </span><span style="color: #00008b;">$_FILES</span><span style="color: Olive;">[</span><span style="color: #8b0000;">'</span><span style="color: Red;">pic</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; </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: Gray;">!</span><span style="color: Blue;">in_array</span><span style="color: Olive;">(</span><span style="color: Blue;">get_extension</span><span style="color: Olive;">(</span><span style="color: #00008b;">$pic</span><span style="color: Olive;">[</span><span style="color: #8b0000;">'</span><span style="color: Red;">name</span><span style="color: #8b0000;">'</span><span style="color: Olive;">])</span><span style="color: Gray;">,</span><span style="color: #00008b;">$allowed_ext</span><span style="color: Olive;">)){</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Blue;">exit_status</span><span style="color: Olive;">(</span><span style="color: #8b0000;">'</span><span style="color: Red;">Only </span><span style="color: #8b0000;">'</span><span style="color: Gray;">.</span><span style="color: Blue;">implode</span><span style="color: Olive;">(</span><span style="color: #8b0000;">'</span><span style="color: Red;">,</span><span style="color: #8b0000;">'</span><span style="color: Gray;">,</span><span style="color: #00008b;">$allowed_ext</span><span style="color: Olive;">)</span><span style="color: Gray;">.</span><span style="color: #8b0000;">'</span><span style="color: Red;"> files are allowed!</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: Olive;">}</span><span style="color: Gray;">&nbsp; </span></li>
<li><span style="color: Gray;">&nbsp; &nbsp;&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: #00008b;">$demo_mode</span><span style="color: Olive;">){</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp;&nbsp; </span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: #ffa500;">// File uploads are ignored. We only log them.</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp;&nbsp; </span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: #00008b;">$line</span><span style="color: Gray;"> = </span><span style="color: Blue;">implode</span><span style="color: Olive;">(</span><span style="color: #8b0000;">'</span><span style="color: Red;">&nbsp; &nbsp; &nbsp;&nbsp; </span><span style="color: #8b0000;">'</span><span style="color: Gray;">, </span><span style="color: Green;">array</span><span style="color: Olive;">(</span><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">date</span><span style="color: Olive;">(</span><span style="color: #8b0000;">'</span><span style="color: Red;">r</span><span style="color: #8b0000;">'</span><span style="color: Olive;">)</span><span style="color: Gray;">, </span><span style="color: #00008b;">$_SERVER</span><span style="color: Olive;">[</span><span style="color: #8b0000;">'</span><span style="color: Red;">REMOTE_ADDR</span><span style="color: #8b0000;">'</span><span style="color: Olive;">]</span><span style="color: Gray;">,</span><span style="color: #00008b;">$pic</span><span style="color: Olive;">[</span><span style="color: #8b0000;">'</span><span style="color: Red;">size</span><span style="color: #8b0000;">'</span><span style="color: Olive;">]</span><span style="color: Gray;">, </span><span style="color: #00008b;">$pic</span><span style="color: Olive;">[</span><span style="color: #8b0000;">'</span><span style="color: Red;">name</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; &nbsp; &nbsp; </span><span style="color: Blue;">file_put_contents</span><span style="color: Olive;">(</span><span style="color: #8b0000;">'</span><span style="color: Red;">log.txt</span><span style="color: #8b0000;">'</span><span style="color: Gray;">, </span><span style="color: #00008b;">$line</span><span style="color: Gray;">.</span><span style="color: Blue;">PHP_EOL</span><span style="color: Gray;">, </span><span style="color: Blue;">FILE_APPEND</span><span style="color: Olive;">)</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp;&nbsp; </span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Blue;">exit_status</span><span style="color: Olive;">(</span><span style="color: #8b0000;">'</span><span style="color: Red;">Uploads are ignored in demo mode.</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: Olive;">}</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp;&nbsp; </span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: #ffa500;">// Move the uploaded file from the temporary</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: #ffa500;">// directory to the uploads folder:</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp;&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;">move_uploaded_file</span><span style="color: Olive;">(</span><span style="color: #00008b;">$pic</span><span style="color: Olive;">[</span><span style="color: #8b0000;">'</span><span style="color: Red;">tmp_name</span><span style="color: #8b0000;">'</span><span style="color: Olive;">]</span><span style="color: Gray;">, </span><span style="color: #00008b;">$upload_dir</span><span style="color: Gray;">.</span><span style="color: #00008b;">$pic</span><span style="color: Olive;">[</span><span style="color: #8b0000;">'</span><span style="color: Red;">name</span><span style="color: #8b0000;">'</span><span style="color: Olive;">])){</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Blue;">exit_status</span><span style="color: Olive;">(</span><span style="color: #8b0000;">'</span><span style="color: Red;">File was uploaded successfuly!</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: Olive;">}</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp;&nbsp; </span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Olive;">}</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp;&nbsp; </span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Blue;">exit_status</span><span style="color: Olive;">(</span><span style="color: #8b0000;">'</span><span style="color: Red;">Something went wrong with your upload!</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; </span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: #ffa500;">// Helper functions</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp;&nbsp; </span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Green;">function</span><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">exit_status</span><span style="color: Olive;">(</span><span style="color: #00008b;">$str</span><span style="color: Olive;">){</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Green;">echo</span><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">json_encode</span><span style="color: Olive;">(</span><span style="color: Green;">array</span><span style="color: Olive;">(</span><span style="color: #8b0000;">'</span><span style="color: Red;">status</span><span style="color: #8b0000;">'</span><span style="color: Gray;">=&gt;</span><span style="color: #00008b;">$str</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: Green;">exit</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: Gray;">&nbsp; &nbsp;&nbsp; </span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Green;">function</span><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">get_extension</span><span style="color: Olive;">(</span><span style="color: #00008b;">$file_name</span><span style="color: Olive;">){</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: #00008b;">$ext</span><span style="color: Gray;"> = </span><span style="color: Blue;">explode</span><span style="color: Olive;">(</span><span style="color: #8b0000;">'</span><span style="color: Red;">.</span><span style="color: #8b0000;">'</span><span style="color: Gray;">, </span><span style="color: #00008b;">$file_name</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: #00008b;">$ext</span><span style="color: Gray;"> = </span><span style="color: Blue;">array_pop</span><span style="color: Olive;">(</span><span style="color: #00008b;">$ext</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: Green;">return</span><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">strtolower</span><span style="color: Olive;">(</span><span style="color: #00008b;">$ext</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>
</ol></div>
<p>该段脚本执行监听http请求和验证上传的文件。（如果php脚本中不使用move_upload_file()方法上传文件，那么文件将自动在请求结束后予以删除。）</p>
<h4>最后，给上传中心添加样式。</h4>
<p>下面列出部分样式，一些与上传不相关的没有这里没有列出来。如果想看完整的样式，可以查看style.css<br />
<strong>assets/css/styles.css</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: Blue;">*</span><span style="color: Gray;">-------------------------</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Blue;">Dropbox</span><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">Element</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; --------------------------</span><span style="color: Blue;">*</span><span style="color: Gray;">/</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp;&nbsp; </span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Blue;">#dropbox</span><span style="color: Olive;">{</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Green;">background:</span><span style="color: Gray;">url('../img/</span><span style="color: #00008b;">background</span><span style="color: Gray;">_tile_</span><span style="color: Maroon;">3</span><span style="color: Gray;">.jpg')</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp;&nbsp; </span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Green;">border-radius:</span><span style="color: Maroon;">3</span><span style="color: Red;">px</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Green;">position:</span><span style="color: Gray;">&nbsp;</span><span style="color: Red;">relative</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Green;">margin:</span><span style="color: Maroon;">80</span><span style="color: Red;">px</span><span style="color: Gray;">&nbsp;</span><span style="color: Red;">auto</span><span style="color: Gray;"> </span><span style="color: Maroon;">90</span><span style="color: Red;">px</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Green;">min-height:</span><span style="color: Gray;">&nbsp;</span><span style="color: Maroon;">290</span><span style="color: Red;">px</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &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; &nbsp; &nbsp; </span><span style="color: Green;">padding-bottom:</span><span style="color: Gray;">&nbsp;</span><span style="color: Maroon;">40</span><span style="color: Red;">px</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;">&nbsp;</span><span style="color: Maroon;">990</span><span style="color: Red;">px</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp;&nbsp; </span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Green;">box-shadow:</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;">4</span><span style="color: Red;">px</span><span style="color: Gray;"> rgba(</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;">0</span><span style="color: Gray;">,</span><span style="color: Maroon;">0.3</span><span style="color: Gray;">) </span><span style="color: Red;">inset</span><span style="color: Gray;">,</span><span style="color: Maroon;">0</span><span style="color: Gray;"> -</span><span style="color: Maroon;">3</span><span style="color: Red;">px</span><span style="color: Gray;"> </span><span style="color: Maroon;">2</span><span style="color: Red;">px</span><span style="color: Gray;"> rgba(</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;">0</span><span style="color: Gray;">,</span><span style="color: Maroon;">0.1</span><span style="color: Gray;">)</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: Gray;">&nbsp; &nbsp;&nbsp; </span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Blue;">#dropbox</span><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">.message</span><span style="color: Olive;">{</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Green;">font-size:</span><span style="color: Gray;">&nbsp;</span><span style="color: Maroon;">11</span><span style="color: Red;">px</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: Green;">padding-top:</span><span style="color: Maroon;">160</span><span style="color: Red;">px</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; </span><span style="color: Olive;">}</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp;&nbsp; </span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Blue;">#dropbox</span><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">.message</span><span style="color: Gray;"> </span><span style="color: Blue;">i</span><span style="color: Olive;">{</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Green;">color:</span><span style="color: #00008b;">#ccc</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Green;">font-size:</span><span style="color: Maroon;">10</span><span style="color: Red;">px</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: Gray;">&nbsp; &nbsp;&nbsp; </span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Blue;">#dropbox</span><span style="color: Navy;">:before</span><span style="color: Olive;">{</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Green;">border-radius:</span><span style="color: Maroon;">3</span><span style="color: Red;">px</span><span style="color: Gray;">&nbsp;</span><span style="color: Maroon;">3</span><span style="color: Red;">px</span><span style="color: Gray;"> </span><span style="color: Maroon;">0</span><span style="color: Gray;"> </span><span style="color: Maroon;">0</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: Gray;">&nbsp; &nbsp;&nbsp; </span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; /</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;">Image</span><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">Previews</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; --------------------------</span><span style="color: Blue;">*</span><span style="color: Gray;">/</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp;&nbsp; </span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Blue;">#dropbox</span><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">.preview</span><span style="color: Olive;">{</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Green;">width:</span><span style="color: Maroon;">245</span><span style="color: Red;">px</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Green;">height:</span><span style="color: Gray;">&nbsp;</span><span style="color: Maroon;">215</span><span style="color: Red;">px</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &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; &nbsp; &nbsp; </span><span style="color: Green;">margin:</span><span style="color: Gray;">&nbsp;</span><span style="color: Maroon;">55</span><span style="color: Red;">px</span><span style="color: Gray;"> </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;">60</span><span style="color: Red;">px</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Green;">position:</span><span style="color: Gray;">&nbsp;</span><span style="color: Red;">relative</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; </span><span style="color: Olive;">}</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp;&nbsp; </span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Blue;">#dropbox</span><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">.preview</span><span style="color: Gray;"> </span><span style="color: Blue;">img</span><span style="color: Olive;">{</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Green;">max-width:</span><span style="color: Gray;">&nbsp;</span><span style="color: Maroon;">240</span><span style="color: Red;">px</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Green;">max-height:</span><span style="color: Maroon;">180</span><span style="color: Red;">px</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Green;">border:</span><span style="color: Maroon;">3</span><span style="color: Red;">px</span><span style="color: Gray;">&nbsp;</span><span style="color: Red;">solid</span><span style="color: Gray;"> </span><span style="color: #00008b;">#fff</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; </span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Green;">box-shadow:</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;">2</span><span style="color: Red;">px</span><span style="color: Gray;"> </span><span style="color: #00008b;">#000</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: Gray;">&nbsp; &nbsp;&nbsp; </span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Blue;">#dropbox</span><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">.imageHolder</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;">inline-block</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Green;">position:</span><span style="color: Red;">relative</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: Gray;">&nbsp; &nbsp;&nbsp; </span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Blue;">#dropbox</span><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">.uploaded</span><span style="color: Olive;">{</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Green;">position:</span><span style="color: Gray;">&nbsp;</span><span style="color: Red;">absolute</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Green;">top:</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;">left:</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;">height:</span><span style="color: Maroon;">100</span><span style="color: Red;">%</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: Maroon;">100</span><span style="color: Red;">%</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Green;">background:</span><span style="color: Gray;"> url('../img/done.png') </span><span style="color: Red;">no-repeat</span><span style="color: Gray;">&nbsp;</span><span style="color: Red;">center</span><span style="color: Gray;"> centerrgba(</span><span style="color: Maroon;">255</span><span style="color: Gray;">,</span><span style="color: Maroon;">255</span><span style="color: Gray;">,</span><span style="color: Maroon;">255</span><span style="color: Gray;">,</span><span style="color: Maroon;">0.5</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;">none</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: Gray;">&nbsp; &nbsp;&nbsp; </span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Blue;">#dropbox</span><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">.preview.done</span><span style="color: Gray;"> </span><span style="color: Blue;">.uploaded</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;">block</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: Gray;">&nbsp; &nbsp;&nbsp; </span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; /</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;">Progress</span><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">Bars</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; --------------------------</span><span style="color: Blue;">*</span><span style="color: Gray;">/</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp;&nbsp; </span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Blue;">#dropbox</span><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">.progressHolder</span><span style="color: Olive;">{</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Green;">position:</span><span style="color: Gray;">&nbsp;</span><span style="color: Red;">absolute</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Green;">background-color:</span><span style="color: #00008b;">#252f38</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: Maroon;">12</span><span style="color: Red;">px</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: Maroon;">100</span><span style="color: Red;">%</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Green;">left:</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;">bottom:</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; </span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Green;">box-shadow:</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;">2</span><span style="color: Red;">px</span><span style="color: Gray;"> </span><span style="color: #00008b;">#000</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: Gray;">&nbsp; &nbsp;&nbsp; </span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Blue;">#dropbox</span><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">.progress</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: #00008b;">#2586d0</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Green;">position:</span><span style="color: Gray;">&nbsp;</span><span style="color: Red;">absolute</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: Maroon;">100</span><span style="color: Red;">%</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Green;">left:</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: Maroon;">0</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp;&nbsp; </span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Green;">box-shadow:</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;">1</span><span style="color: Red;">px</span><span style="color: Gray;"> rgba(</span><span style="color: Maroon;">255</span><span style="color: Gray;">, </span><span style="color: Maroon;">255</span><span style="color: Gray;">, </span><span style="color: Maroon;">255</span><span style="color: Gray;">, </span><span style="color: Maroon;">0.4</span><span style="color: Gray;">) </span><span style="color: Red;">inset</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp;&nbsp; </span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; -</span><span style="color: Green;">moz-transition:</span><span style="color: Maroon;">0.25</span><span style="color: Gray;">s</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; -</span><span style="color: Green;">webkit-transition:</span><span style="color: Maroon;">0.25</span><span style="color: Gray;">s</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; -</span><span style="color: Green;">o-transition:</span><span style="color: Maroon;">0.25</span><span style="color: Gray;">s</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Green;">transition:</span><span style="color: Maroon;">0.25</span><span style="color: Gray;">s</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: Gray;">&nbsp; &nbsp;&nbsp; </span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Blue;">#dropbox</span><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">.preview.done</span><span style="color: Gray;"> </span><span style="color: Blue;">.progress</span><span style="color: Olive;">{</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Green;">width:</span><span style="color: Maroon;">100</span><span style="color: Red;">%</span><span style="color: Gray;"> !important</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Olive;">}</span></li></ol></div>
<p>Div.progress绝对定位。改变它的width（百分数值）来做进度条的显示。这里可以应用jquery实现动画效果。<br />
到这里，HTML5的上传中心完成了。可以将它运用到文件上传服务、html5画廊、文件管理或别的新应用中。记得留下你的建议和意见！</p>
<p>本文翻译自<a href="http://tutorialzine.com/2011/09/html5-file-upload-jquery-php/">《HTML5 File Uploads with jQuery》</a>&#8211; <a href="http://demo.tutorialzine.com/2011/09/html5-file-upload-jquery-php/" target="_blank">Demo演示</a> </p>
]]></content:encoded>
			<wfw:commentRss>http://www.36ria.com/4566/feed</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>git处理文件忽略—git学习笔记</title>
		<link>http://www.36ria.com/4559</link>
		<comments>http://www.36ria.com/4559#comments</comments>
		<pubDate>Mon, 31 Oct 2011 13:38:14 +0000</pubDate>
		<dc:creator>明河</dc:creator>
				<category><![CDATA[前端开发工具]]></category>
		<category><![CDATA[git学习笔记]]></category>
		<category><![CDATA[git教程]]></category>

		<guid isPermaLink="false">http://www.36ria.com/?p=4559</guid>
		<description><![CDATA[使用IDE或编辑器编辑项目代码，往往会向项目目录加入编辑器的特殊文件，比如idea在项目工程内会引入.idea目录和form.iml文件，这些目录或文件，我们不希望加入到git的版本库，但每次使用git status时都会看到该目录或文件，一不小心就上传上去了，特别是希望使用git add -u的朋友。 通过在项目目录下增加.gitignore文件理文件忽略 比如明河在项目根目录内加个.gitignore文件内容如......]]></description>
			<content:encoded><![CDATA[<p>使用IDE或编辑器编辑项目代码，往往会向项目目录加入编辑器的特殊文件，比如idea在项目工程内会引入.idea目录和form.iml文件，这些目录或文件，我们不希望加入到git的版本库，但每次使用git status时都会看到该目录或文件，一不小心就上传上去了，特别是希望使用git add -u的朋友。<br />
<a href="http://www.36ria.com/4559/2011-10-31-21-17-31" rel="attachment wp-att-4561"><img src="http://www.36ria.com/wp-content/uploads/2011/10/2011-10-31-21-17-31.png" alt="" title="2011-10-31 21-17-31" width="505" height="75" class="alignnone size-full wp-image-4561" /></a></p>
<h4>通过在项目目录下增加.gitignore文件理文件忽略</h4>
<p>比如明河在项目根目录内加个.gitignore文件内容如下：<br />
*.iml<br />
.idea/<br />
再使用git status查看，.idea目录和form.iml文件已经被git忽略掉了。<br />
<a href="http://www.36ria.com/4559/2011-10-31-21-26-19" rel="attachment wp-att-4562"><img src="http://www.36ria.com/wp-content/uploads/2011/10/2011-10-31-21-26-19.png" alt="" title="2011-10-31 21-26-19" width="374" height="88" class="alignnone size-full wp-image-4562" /></a><br />
（PS：.gitignore文件对所处的目录及其子目录生效。）</p>
<h5>如果想要连.gitignore文件自己也忽略呢？</h5>
<p>一样的道理，只要在文件内加上.gitignore即可。</p>
<h5>如何将忽略的文件添加到暂存区呢？</h5>
<p>我只能说这个需求有点蛋疼&#8230;git实在太强大了，实现这种蛋疼的需求也不在话下。<br />
使用命令<strong>git add -f 文件路径</strong>即可。</p>
<h5>git忽略语法说明：</h5>
<ul>
<li>空行或者#号开始的行会被忽略；</li>
<li>可以使用通配符，比如*，？（一个字符），[]（可选范围）；</li>
<li>路径分隔符（/）在最前面，表示要忽略此目录下的文件；</li>
<li>！号表示不忽略。</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.36ria.com/4559/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>msysGit的中文支持—git学习笔记</title>
		<link>http://www.36ria.com/4544</link>
		<comments>http://www.36ria.com/4544#comments</comments>
		<pubDate>Thu, 20 Oct 2011 13:43:33 +0000</pubDate>
		<dc:creator>明河</dc:creator>
				<category><![CDATA[前端开发工具]]></category>
		<category><![CDATA[git教程]]></category>

		<guid isPermaLink="false">http://www.36ria.com/?p=4544</guid>
		<description><![CDATA[之前有发了篇引子文章《git学习笔记—web前端开发七武器》，简单的介绍了下git，本来想按传统的方式一步步介绍git，转念一下，其实意义不大，网上已经有完整的git的教程，比如《Git Community Book 中文版》，明河再重复写就显得多余。所以打算以更为松散的笔记形式，给大家介绍一些git技巧，今天要介绍的是msysGit的中文支持问题。 msysGit应该是大家在window下主要使用的git客户......]]></description>
			<content:encoded><![CDATA[<p>之前有发了篇引子文章<a href="http://www.36ria.com/4142">《git学习笔记—web前端开发七武器》</a>，简单的介绍了下git，本来想按传统的方式一步步介绍git，转念一下，其实意义不大，网上已经有完整的git的教程，比如<a href="http://gitbook.liuhui998.com/">《Git Community Book 中文版》</a>，明河再重复写就显得多余。所以打算以更为松散的笔记形式，给大家介绍一些git技巧，今天要介绍的是msysGit的中文支持问题。<br />
<a href="http://code.google.com/p/msysgit/">msysGit</a>应该是大家在window下主要使用的git客户端，而msysGit对于中文的支持非常不友好，实际上可以通过一些配置来改善msysGit的中文支持。</p>
<h4>解决msysGit的中文录入问题</h4>
<p>msysGit的shell环境中无法输入中文的，想要输入中文，我们需要修改下配置文件/etc/inputrc。<br />
步骤1：进入git安装目录，找到/etc/inputrc；<br />
步骤2：修改配置项<br />
找到如下配置代码<br />
set output-meta off<br />
set convert-meta on<br />
修改成<br />
set output-meta on<br />
set convert-meta off<br />
步骤3：关闭git bash然后再重启<br />
就可以在shell环境中输入中文了，如下图：<br />
<a href="http://www.36ria.com/4544/2011-10-20-20-35-05" rel="attachment wp-att-4545"><img src="http://www.36ria.com/wp-content/uploads/2011/10/2011-10-20-20-35-05.png" alt="" title="2011-10-20 20-35-05" width="302" height="178" class="alignnone size-full wp-image-4545" /></a><br />
虽然可以输入中文，但msysGit在中文的显示上依旧有问题，接下来我们来看下如果解决中文显示问题。</p>
<h4>解决msysGit的提交说明乱码问题</h4>
<p>我们先来看个提交中文说明的情况：<br />
<a href="http://www.36ria.com/4544/2011-10-20-20-43-54" rel="attachment wp-att-4546"><img src="http://www.36ria.com/wp-content/uploads/2011/10/2011-10-20-20-43-54.png" alt="" title="2011-10-20 20-43-54" width="504" height="310" class="alignnone size-full wp-image-4546" /></a><br />
git log显示日志时，出现的是看不懂的乱码，而且git commit -m提交时会出现一堆的警告。接下来我们设置几项配置<br />
<a href="http://www.36ria.com/4544/2011-10-20-21-34-06" rel="attachment wp-att-4547"><img src="http://www.36ria.com/wp-content/uploads/2011/10/2011-10-20-21-34-06.png" alt="" title="2011-10-20 21-34-06" width="418" height="128" class="alignnone size-full wp-image-4547" /></a><br />
git config &#8211;system i18n.logOutputEncoding gbk 用于将提交说明的输出编码设置为gbk<br />
git config &#8211;system i18n.commitEncoding gbk 标注提交说明所使用的字符集。<br />
export LESSCHARSET=utf-8 设置分页器的编码，这与git log 能否正常打印中文日志息息相关，因为git log的显示采用的就是less分页器，LESSCHARSET是分页器的环境变量，只要设置为utf-8，即可正常显示中文<br />
<a href="http://www.36ria.com/4544/2011-10-20-21-39-09" rel="attachment wp-att-4548"><img src="http://www.36ria.com/wp-content/uploads/2011/10/2011-10-20-21-39-09.png" alt="" title="2011-10-20 21-39-09" width="320" height="67" class="alignnone size-full wp-image-4548" /></a><br />
（ps：请避免使用中文名称的文件，虽然通过msysGit的设置可以正常显示中文名文件。）</p>
]]></content:encoded>
			<wfw:commentRss>http://www.36ria.com/4544/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>认识基础任务标签（下）—ant入门指南（4）</title>
		<link>http://www.36ria.com/4534</link>
		<comments>http://www.36ria.com/4534#comments</comments>
		<pubDate>Tue, 18 Oct 2011 04:06:29 +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=4534</guid>
		<description><![CDATA[5.echo：向ant控制台打印消息 echo在调试ant任务时非常有用，也可以在任务执行后打印一些任务完成提示消息等。 实际上echo也可以把消息打印到指定文件，形成build日志，只需要指定file参数即可。 属性 说明 message 想要打印的消息 file 消息打印到指定文件 append 将消息追加到已经存在的文件 level 指定消息的类型，有”error”, “warning”, “info”, “verbose”, “debug” 来看典型的ech......]]></description>
			<content:encoded><![CDATA[<h4>5.echo：向ant控制台打印消息</h4>
<p>echo在调试ant任务时非常有用，也可以在任务执行后打印一些任务完成提示消息等。<br />
实际上echo也可以把消息打印到指定文件，形成build日志，只需要指定file参数即可。</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>message</strong></p>
</td>
<td valign="top">
<p>想要打印的消息</p>
</td>
</tr>
<tr>
<td valign="top">
<p><strong>file</strong></p>
</td>
<td valign="top">
<p>消息打印到指定文件</p>
</td>
</tr>
<tr>
<td valign="top">
<p><strong>append</strong></p>
</td>
<td valign="top">
<p>将消息追加到已经存在的文件</p>
</td>
</tr>
<tr>
<td valign="top">
<p><strong>level</strong></p>
</td>
<td valign="top">
<p>指定消息的类型，有”error”, “warning”, “info”, “verbose”, “debug” </p>
</td>
</tr>
</tbody>
</table>
<p>来看典型的echo任务代码:</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;">echo</span><span style="color: Gray;"> </span><span style="color: #00008b;">message</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">Hello, world</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;">echo</span><span style="color: Olive;">&gt;</span><span style="color: Gray;">Hello, world</span><span style="color: Olive;">&lt;/</span><span style="color: Green;">echo</span><span style="color: Olive;">&gt;</span></li>
<li><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;">current.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;">./</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;">echo</span><span style="color: Olive;">&gt;</span><span style="color: Gray;">${current.dir}</span><span style="color: Olive;">&lt;/</span><span style="color: Green;">echo</span><span style="color: Olive;">&gt;</span></li></ol></div>
<p>echo打印property属性值，是个非常常用的调试技巧。<br />
上述代码中有个dirname，这个任务是用来做啥的呢？接下去看。</p>
<h4>6.dirname：获取文件的目录路径</h4>
<p>dirname只有二个参数：</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>file</strong></p>
</td>
<td valign="top">
<p>文件路径</p>
</td>
</tr>
<tr>
<td valign="top">
<p><strong>property</strong></p>
</td>
<td valign="top">
<p>指定属性名称</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: 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;">test</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: 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: Olive;">&gt;</span></li>
<li><span style="color: Gray;">&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;">antfile.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;">${ant.file}</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;">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;">antfile2.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;">${ant.file}</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;">echo</span><span style="color: Gray;">&nbsp;</span><span style="color: #00008b;">message</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">${antfile.dir}</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;">echo</span><span style="color: Olive;">&gt;</span><span style="color: Gray;">${antfile2.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; </span><span style="color: Olive;">&lt;/</span><span style="color: Green;">target</span><span style="color: Olive;">&gt;</span><span style="color: Gray;">&nbsp; &nbsp; </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>ant.file这个属性是系统自带的，为当前运行的构建文件路径。<br />
明河这里将dirname和property进行比较，二者的输出有明显的区别，dirname只输出目录，property输出完成文件路径，如下图<br />
<a href="http://www.36ria.com/4534/2011-10-17-20-36-22" rel="attachment wp-att-4535"><img src="http://www.36ria.com/wp-content/uploads/2011/10/2011-10-17-20-36-22.png" alt="" title="2011-10-17 20-36-22" width="358" height="149" class="alignnone size-full wp-image-4535" /></a></p>
<h4>7.available：验证文件、目录、类的存在性</h4>
<p>available任务在防止ant构建时因为文件或目录不存在导致的错误时非常有用。</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>property</strong></p>
</td>
<td valign="top">
<p>属性名</p>
</td>
</tr>
<tr>
<td valign="top">
<p><strong>value</strong></p>
</td>
<td valign="top">
<p>属性值，默认为true</p>
</td>
</tr>
<tr>
<td valign="top">
<p><strong>file</strong></p>
</td>
<td valign="top">
<p>需要验证的文件</p>
</td>
</tr>
<tr>
<td valign="top">
<p><strong>type</strong></p>
</td>
<td valign="top">
<p>file的类型，验证目录(type=”dir”) or 验证文件 (type=”file”)</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: 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;">test</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: 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: Olive;">&gt;</span></li>
<li><span style="color: Gray;">&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;">antfile.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;">${ant.file}</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;">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;">ui</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;">${antfile.dir}/ui.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;">available</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;">${ui}</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;">file</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;"> </span><span style="color: #00008b;">property</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">is</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;">echo</span><span style="color: Olive;">&gt;</span><span style="color: Gray;">${is}</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; </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; </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>available的value值永远为一个布尔值。</p>
<h4>8.get：从url中获取文件</h4>
<p>get用于快速将远程文件保存到指定位置，不止支持http:协议，ftp:，jar:也都是可以的。</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>src</strong></p>
</td>
<td valign="top">
<p>源url</p>
</td>
</tr>
<tr>
<td valign="top">
<p><strong>dest</strong></p>
</td>
<td valign="top">
<p>目标路径</p>
</td>
</tr>
<tr>
<td valign="top">
<p><strong>verbose</strong></p>
</td>
<td valign="top">
<p>是否显示下载进度（100 Kb显示一个“.”）</p>
</td>
</tr>
<tr>
<td valign="top">
<p><strong>usetimestamp</strong></p>
</td>
<td valign="top">
<p>显示最后修改时间</p>
</td>
</tr>
<tr>
<td valign="top">
<p><strong>username</strong></p>
</td>
<td valign="top">
<p>&#8216;BASIC&#8217;验证页面的用户名</p>
</td>
</tr>
<tr>
<td valign="top">
<p><strong>password</strong></p>
</td>
<td valign="top">
<p>&#8216;BASIC&#8217;验证页面的密码</p>
</td>
</tr>
</tbody>
</table>
<p>来看个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;">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;">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;">test</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: 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: Olive;">&gt;</span></li>
<li><span style="color: Gray;">&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;">antfile.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;">${ant.file}</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;">get</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;">http://www.36ria.com/</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;">${antfile.dir}/36ria-index.html</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;">usetimestamp</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; </span><span style="color: Olive;">&lt;/</span><span style="color: Green;">target</span><span style="color: Olive;">&gt;</span><span style="color: Gray;">&nbsp; &nbsp; </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/4534/2011-10-18-11-41-55" rel="attachment wp-att-4541"><img src="http://www.36ria.com/wp-content/uploads/2011/10/2011-10-18-11-41-55.png" alt="" title="2011-10-18 11-41-55" width="454" height="133" class="alignnone size-full wp-image-4541" /></a><br />
如果要把一批url保存下来该如何处理呢？</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;">get</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;">downloads</span><span style="color: #8b0000;">&quot;</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;">url</span><span style="color: Gray;">&nbsp;</span><span style="color: #00008b;">url</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">http://ant.apache.org/index.html</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">/&gt;</span><span style="color: Gray;">&nbsp;</span></li>
<li><span style="color: Gray;">&nbsp; </span><span style="color: Olive;">&lt;</span><span style="color: Green;">url</span><span style="color: Gray;">&nbsp;</span><span style="color: #00008b;">url</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">http://ant.apache.org/faq.html</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;">get</span><span style="color: Olive;">&gt;</span></li></ol></div>
<h4>9.local：增加个局部属性</h4>
<p>为了更好说明local用法，明河先贴出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;">property</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;">foo</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;">foo</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: Gray;">&nbsp;</span><span style="color: #00008b;">name</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">step1</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;">echo</span><span style="color: Olive;">&gt;</span><span style="color: Gray;">Before local: foo is ${foo}</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; </span><span style="color: Olive;">&lt;</span><span style="color: Green;">local</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;">foo</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;">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;">foo</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;">bar</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;">echo</span><span style="color: Olive;">&gt;</span><span style="color: Gray;">After local: foo is ${foo}</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; </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;</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;">step2</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;">step1</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;">echo</span><span style="color: Olive;">&gt;</span><span style="color: Gray;">In step2: foo is ${foo}</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; </span><span style="color: Olive;">&lt;/</span><span style="color: Green;">target</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: Gray;">step1:</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp;&nbsp; [echo] Before local: foo is foo</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp;&nbsp; [echo] After local: foo is bar</span></li>
<li><span style="color: Gray;">&nbsp;</span></li>
<li><span style="color: Gray;">step2:</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp;&nbsp; [echo] In step2: foo is foo</span></li></ol></div>
<p>在step1目标中我们定义了<local name="foo"/>，类似编程语言中的局部变量，改变后foo的输出值为bar，不再是原来定义的foo，有意思的是原来的
<property name="foo" value="foo"/>值不会发生改变，step2目标验证了这一点。也就是说在step1内部定义了local 后，foo这个property的修改不会影响外部property的值。<br />
local这个任务在sequential（循环）中非常常用，讲到sequential时再演示其用法。</p>
<h4>10.touch：创建文件，并可以修改文件修改时间</h4>
<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>file</strong></p>
</td>
<td valign="top">
<p>文件名称</p>
</td>
</tr>
<tr>
<td valign="top">
<p><strong>datetime</strong></p>
</td>
<td valign="top">
<p>指定文件修改时间</p>
</td>
</tr>
</tbody>
</table>
<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;">touch</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;">myfile</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">/&gt;</span></li></ol></div>
<p>创建一个myfile文件，最后修改时间为当前时间。</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;">touch</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;">myfile</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;"> </span><span style="color: #00008b;">datetime</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">18/10/2010 2:02 pm</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">/&gt;</span></li></ol></div>
<p>创建一个myfile文件，最后修改时间为18/10/2010 2:02 pm。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.36ria.com/4534/feed</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>未来的web基础——SPDY </title>
		<link>http://www.36ria.com/4526</link>
		<comments>http://www.36ria.com/4526#comments</comments>
		<pubDate>Fri, 30 Sep 2011 15:34:21 +0000</pubDate>
		<dc:creator>天河</dc:creator>
				<category><![CDATA[javascript]]></category>
		<category><![CDATA[前端]]></category>

		<guid isPermaLink="false">http://www.36ria.com/?p=4526</guid>
		<description><![CDATA[前端应用的许多优化都是围绕网络开展的。Yahoo的35条网站优化实践中第一条便是Minimize HTTP Requests。前端工程师们为这些优化做了许多努力与探索，比如CSS sprits，比如CDN combo。天河就经常做CSS sprits，这个虽然有自动化工具。不过尴尬的是，主要是半自动化工具，还是要做部分工作来保证的。于是搞个CSS sprits常常花上小半天时间（苦逼的活呀）。 最近看了些关于SPDY的文章，忽......]]></description>
			<content:encoded><![CDATA[<p>前端应用的许多优化都是围绕网络开展的。Yahoo的35条网站优化实践中第一条便是Minimize HTTP Requests。前端工程师们为这些优化做了许多努力与探索，比如CSS sprits，比如CDN combo。天河就经常做CSS sprits，这个虽然有自动化工具。不过尴尬的是，主要是半自动化工具，还是要做部分工作来保证的。于是搞个CSS sprits常常花上小半天时间（苦逼的活呀）。</p>
<p>最近看了些关于SPDY的文章，忽然觉得，如果类似SPDY这样的中间协议（TCP之上，HTTP的补充）被大量应用了，其实我们就不需要太刻意关注最小化HTTP请求数了（YY中…）。支持一个TCP连接中无限的并发HTTP请求，是最吸引我的一个SPDY特性了。</p>
<p>如今，大家写的web应用都是通过HTTP与TCP协议传输的。TCP协议工作在传输层，HTTP协议则工作在应用层。不幸的是，今天在web上传播的内容与10年前有着显著的区别，HTTP传输已经渐渐无法满足人们的需要了。</p>
<ul>
<li> 每个HTTP连接只请求一个资源（HTTP pipelining做了改善，不过大大增加了复杂度，并不流行）。浏览器只好通过建立多个连接来解决此问题（你应该刻意了解过各主流浏览器支持的并发连接数吧）。</li>
<li>HTTP只允许由客户端发起请求。纵使服务端知道客户端需要一个资源，它也没有相关机制来通知客户端。服务端只能等待客户端发送一个请求。</li>
<li>未压缩的请求及响应头。现在的应用普遍使用更多的cookie、客户端自定义扩展等，一个典型的请求头还是不小的。对于猫或者ADSL这种上行带宽非常低的连接来说，还是很有影响的。</li>
<li>冗余的头。HTTP头在同一个会话里是反复发送的。但是，头信息中的User-Agent，Host以及Accept*等固定信息是不需要重复发送的。</li>
<li>非强制的数据压缩。</li>
</ul>
<p>这么多的HTTP缺点都是Google罗列的，是SPDY协议努力的方向。SPDY希望实现降低一半的页面加载时间（据实验结果看，已经接近这个目标了），同时避免增加部署的复杂度。SPDY的具体目标有：</p>
<ul>
<li>允许多个并发HTTP请求共用一个TCP会话。</li>
<li>压缩HTTP头，舍弃不必要的头信息。</li>
<li>协议要易于实现并且高效。</li>
<li>强制使用SSL传输协议，以换取更好的安全性和对现有网络系统的兼容。虽然SSL也会带来一些延迟，但Google相信长远地看，未来的web离不开安全的网络连接。</li>
<li>允许服务端向客户端发起一个会话，以及向客户端推送数据。</li>
</ul>
<p>简单说下SPDY的设计及特性。</p>
<p><img class="alignnone" title="SPDY" src="http://dev.chromium.org/_/rsrc/1258490355439/spdy/spdy-whitepaper/soarjOjSeS5hoFYvjtAnxCg.png" alt="" width="267" height="132" /></p>
<p>如上图，SPDY在SSL之上增加了一个session层，用来支持在一个TCP连接里实现多路复用的交叉流。原有的HTTP GET及POST消息格式保持不变；不过，SPDY制定了一个新的用于编码及传输的帧格式。流是双向的，可以由客户端或服务端发起。</p>
<p>SPDY特性分为基本特性（默认开启）与高级特性（可选启用）两部分。都为降低网络延迟努力。<br />
基本特性有：</p>
<ul>
<li>多路复用流。SPDY实现了单TCP连接中无限制的并发流。由于请求在单个信道内是交叉的，TCP的效率会更高。</li>
<li>请求优先级。虽然可以并发请求，但网络总有可能堵塞，所以还是要给请求分下优先级。</li>
<li>压缩HTTP头，舍弃不必要的头信息。</li>
</ul>
<p>高级特性有：</p>
<ul>
<li>Server push。就是允许服务端发起通信。</li>
<li>Server hint。服务端可以提示客户端可以获取某某资源了。</li>
</ul>
<p>好了，先介绍这么多。如果你和我一样，好奇SPDY怎么应用，可以在Chrome里打开个gmail啥的，然后打开这个链接满足下好奇心。<br />
chrome://net-internals/#events&amp;q=type:SPDY_SESSION%20is:active</p>
<p>其实发现想细致了解里面各种名词，真不是一篇文章能介绍清楚的。天河也查了好久，稍详细的介绍跟实践待续哈。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.36ria.com/4526/feed</wfw:commentRss>
		<slash:comments>10</slash:comments>
		</item>
		<item>
		<title>RIA之家wordpress模板开放下载了！</title>
		<link>http://www.36ria.com/4520</link>
		<comments>http://www.36ria.com/4520#comments</comments>
		<pubDate>Mon, 26 Sep 2011 08:39:19 +0000</pubDate>
		<dc:creator>明河</dc:creator>
				<category><![CDATA[wordpress主题]]></category>
		<category><![CDATA[wordpress模板]]></category>

		<guid isPermaLink="false">http://www.36ria.com/?p=4520</guid>
		<description><![CDATA[有不少朋友向明河索要RIA之家的模板，团队成员商量后，决定将该模板开放出去，欢迎下载试用，同时欢迎大家的反馈！ 为了便于日后更新维护，明河将模板托管到github，传送门在此：https://github.com/minghe/36ria-theme。 说说该模板的特点： 中文原创模板，由明河设计，苏河、天河、飞绿制作； 中国为数不多的采用html5的wordpress模板； 适合团队博客； 整体设计还行（明河自吹自......]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.36ria.com/4520/36ria-theme" rel="attachment wp-att-4521"><img src="http://www.36ria.com/wp-content/uploads/2011/09/36ria-theme.png" alt="" title="36ria-theme" width="680" height="400" class="alignnone size-full wp-image-4521" /></a><br />
 <img src='http://www.36ria.com/wp-includes/images/smilies/icon_lol.gif' alt=':lol:' class='wp-smiley' />   <img src='http://www.36ria.com/wp-includes/images/smilies/icon_lol.gif' alt=':lol:' class='wp-smiley' />  有不少朋友向明河索要RIA之家的模板，团队成员商量后，决定将该模板开放出去，欢迎下载试用，同时欢迎大家的反馈！<br />
为了便于日后更新维护，明河将模板托管到github，传送门在此：<a href="https://github.com/minghe/36ria-theme">https://github.com/minghe/36ria-theme</a>。</p>
<h4>说说该模板的特点：</h4>
<ul>
<li>中文原创模板，由明河设计，苏河、天河、飞绿制作；</li>
<li>中国为数不多的采用html5的wordpress模板；</li>
<li>适合团队博客；</li>
<li>整体设计还行（明河自吹自擂下&#8230;）</li>
</ul>
<p>(PS:目前没做IE兼容性处理哦)</p>
]]></content:encoded>
			<wfw:commentRss>http://www.36ria.com/4520/feed</wfw:commentRss>
		<slash:comments>10</slash:comments>
		</item>
		<item>
		<title>javascript编程容易出现的11个错误</title>
		<link>http://www.36ria.com/4479</link>
		<comments>http://www.36ria.com/4479#comments</comments>
		<pubDate>Wed, 21 Sep 2011 06:13:23 +0000</pubDate>
		<dc:creator>飞绿</dc:creator>
				<category><![CDATA[javascript]]></category>
		<category><![CDATA[前端]]></category>

		<guid isPermaLink="false">http://www.36ria.com/?p=4479</guid>
		<description><![CDATA[javascript是比较容易学的。但是，对于这门语言需要有一些值得注意的地方。本文将指出javascript编程中可能犯过的10个错误 错误1-使用全局变量 如果你刚开始javascript编程，可能会觉得全局变量很好用。事实上，刚开始javascript编程，你可能不知道使用全局变量会带来什么麻烦。在同一个页面中，全局变量可以在任何内嵌的javascript代码段中或是该页面加载的不同的js文件中，都能......]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.36ria.com/4479/javascript-11-mistake20110921" rel="attachment wp-att-4505"><img src="http://www.36ria.com/wp-content/uploads/2011/09/javascript-11-mistake20110921.png" alt="javascript-11-mistake" title="javascript-11-mistake20110921" width="680" height="200" class="alignnone size-full wp-image-4505" /></a><br />
javascript是比较容易学的。但是，对于这门语言需要有一些值得注意的地方。本文将指出javascript编程中可能犯过的10个错误</p>
<h4>错误1-使用全局变量</h4>
<p>如果你刚开始javascript编程，可能会觉得全局变量很好用。事实上，刚开始javascript编程，你可能不知道使用全局变量会带来什么麻烦。在同一个页面中，全局变量可以在任何内嵌的javascript代码段中或是该页面加载的不同的js文件中，都能访问到。这听起来很强大，是吗？这就使得全局变量可以随时随地的被修改赋值。<br />
事实上这样很糟！<br />
这样做会导致变量在意料之外被修改重写。假设有一个网店，需要用javascript计算并显示购物车所有商品的价格总和（当然，服务器端还会进行重新计算，这里只是为了增强用户的体验）。可能会编写代码如下：</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;">total</span><span style="color: Gray;"> = </span><span style="color: Maroon;">0</span><span style="color: Gray;">, </span><span style="color: #ffa500;">// total price</span></li>
<li><span style="color: Blue;">tax</span><span style="color: Gray;"> = </span><span style="color: Maroon;">0.05</span><span style="color: Gray;">; </span><span style="color: #ffa500;">// 5%</span></li></ol></div>
<p>现在，还需要用javascript代码在网站上展示一些信息，或则是做一个商品仓库。代码如下：</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;">total</span><span style="color: Gray;"> = </span><span style="color: Maroon;">15</span><span style="color: Gray;">; </span><span style="color: #ffa500;">// number of tweets pulled from twitter</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: Green;">var</span><span style="color: Gray;"> </span><span style="color: Blue;">tax</span><span style="color: Gray;"> = </span><span style="color: Green;">function</span><span style="color: Gray;"> </span><span style="color: Olive;">()</span><span style="color: Gray;"> </span><span style="color: Olive;">{</span><span style="color: Gray;"> </span><span style="color: #ffa500;">/* ... */</span><span style="color: Gray;"> </span><span style="color: Olive;">}</span><span style="color: Gray;">; </span><span style="color: #ffa500;">// Trigger Animation eXperience function</span></li></ol></div>
<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;">(</span><span style="color: Green;">function</span><span style="color: Gray;"> </span><span style="color: Olive;">()</span><span style="color: Gray;"> </span><span style="color: Olive;">{</span></li>
<li><span style="color: Gray;">&nbsp;</span><span style="color: Green;">var</span><span style="color: Gray;"> </span><span style="color: Blue;">total</span><span style="color: Gray;"> = </span><span style="color: Maroon;">0</span><span style="color: Gray;">, </span><span style="color: Blue;">tax</span><span style="color: Gray;"> = </span><span style="color: Maroon;">0.05</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp;</span></li>
<li><span style="color: Gray;">&nbsp;</span><span style="color: #ffa500;">// other code</span></li>
<li><span style="color: Gray;">&nbsp;</span><span style="color: Olive;">}())</span><span style="color: Gray;">;</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: Green;">var</span><span style="color: Gray;"> </span><span style="color: Blue;">cartTotaler</span><span style="color: Gray;"> = </span><span style="color: Olive;">(</span><span style="color: Green;">function</span><span style="color: Gray;"> </span><span style="color: Olive;">()</span><span style="color: Gray;"> </span><span style="color: Olive;">{</span></li>
<li><span style="color: Gray;">&nbsp;</span><span style="color: Green;">var</span><span style="color: Gray;"> </span><span style="color: Blue;">total</span><span style="color: Gray;"> = </span><span style="color: Maroon;">0</span><span style="color: Gray;">; </span><span style="color: Blue;">tax</span><span style="color: Gray;"> = </span><span style="color: Maroon;">0.05</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp;</span></li>
<li><span style="color: Gray;">&nbsp;</span><span style="color: #ffa500;">// other code</span></li>
<li><span style="color: Gray;">&nbsp;</span></li>
<li><span style="color: Gray;">&nbsp;</span><span style="color: Green;">return</span><span style="color: Gray;"> </span><span style="color: Olive;">{</span></li>
<li><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">addItem</span><span style="color: Gray;"> : </span><span style="color: Green;">function</span><span style="color: Gray;"> </span><span style="color: Olive;">(</span><span style="color: Blue;">item</span><span style="color: Olive;">)</span><span style="color: Gray;"> </span><span style="color: Olive;">{</span><span style="color: Gray;"> </span><span style="color: Olive;">}</span><span style="color: Gray;">,</span></li>
<li><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">removeItem</span><span style="color: Gray;"> : </span><span style="color: Green;">function</span><span style="color: Gray;"> </span><span style="color: Olive;">(</span><span style="color: Blue;">item</span><span style="color: Olive;">)</span><span style="color: Gray;"> </span><span style="color: Olive;">{</span><span style="color: Gray;"> </span><span style="color: Olive;">}</span><span style="color: Gray;">,</span></li>
<li><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">calculateTitle</span><span style="color: Gray;"> : </span><span style="color: Green;">function</span><span style="color: Gray;"> </span><span style="color: Olive;">()</span><span style="color: Gray;"> </span><span style="color: Olive;">{</span><span style="color: Gray;"> </span><span style="color: Olive;">}</span></li>
<li><span style="color: Gray;">&nbsp;</span><span style="color: Olive;">}</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp;</span><span style="color: Olive;">}())</span><span style="color: Gray;">;</span></li></ol></div>
<p><strong>关于全局变量有一点值得注意，如果不用关键词var来声明创建变量，那么javascript引擎会默认将该变量定义为全局变量。</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;">(</span><span style="color: Green;">function</span><span style="color: Gray;"> </span><span style="color: Olive;">()</span><span style="color: Gray;"> </span><span style="color: Olive;">{</span></li>
<li><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">tax</span><span style="color: Gray;"> = </span><span style="color: Maroon;">0.05</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp;</span><span style="color: Olive;">}())</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp;</span></li>
<li><span style="color: Gray;">&nbsp;</span><span style="color: Green;">var</span><span style="color: Gray;"> </span><span style="color: Blue;">totalPrice</span><span style="color: Gray;"> = </span><span style="color: Maroon;">100</span><span style="color: Gray;"> + </span><span style="color: Olive;">(</span><span style="color: Maroon;">100</span><span style="color: Gray;"> * </span><span style="color: Blue;">tax</span><span style="color: Olive;">)</span><span style="color: Gray;">; </span><span style="color: #ffa500;">// 105</span></li></ol></div>
<p>这里的变量tax在函数外部也是可以被访问的，因为在定义tax的时候没有使用var关键词。</p>
<h4>错误2-不加分号</h4>
<p>每句javascript语句必须以分号结尾。在编程时如果忘了加分号，这时javascript编解析器会自动加上。那我们在编程的时候是不是就可以完全不用浪费时间去加分号呢？<br />
但是在一些语句中，分号是必不可少的。如for循环语句中的分号是必不可少的，否则会报语法错误。那么语句末尾的分号呢？<br />
Javascript社区已经讨论过该问题。下面是本文的看法：你的代码，只要是被javascript解析器修改过（即便是很小的修改，如添加分号），就可能会出现一些你意料之外的结果。看看下面这段javascript代码：</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;">function</span><span style="color: Gray;"> </span><span style="color: Blue;">returnPerson</span><span style="color: Gray;"> </span><span style="color: Olive;">(</span><span style="color: Blue;">name</span><span style="color: Olive;">)</span><span style="color: Gray;"> </span><span style="color: Olive;">{</span></li>
<li><span style="color: Gray;">&nbsp;</span><span style="color: Green;">return</span></li>
<li><span style="color: Gray;">&nbsp;</span><span style="color: Olive;">{</span></li>
<li><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">name</span><span style="color: Gray;"> : </span><span style="color: Blue;">name</span></li>
<li><span style="color: Gray;">&nbsp;</span><span style="color: Olive;">}</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp;</span><span style="color: Olive;">}</span></li></ol></div>
<p>该方法看起来会返回一个对象，但事实上，javascript解析器会在return后面紧接着添加一个分号，这就导致该函数返回undefined。Return后的对象会被忽略。解决方法很简单，代码如下：</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;">return</span><span style="color: Gray;"> </span><span style="color: Olive;">{</span></li>
<li><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">name</span><span style="color: Gray;"> : </span><span style="color: Blue;">name</span></li>
<li><span style="color: Gray;">&nbsp;</span><span style="color: Olive;">}</span><span style="color: Gray;">;</span></li></ol></div>
<p>在javascript编程中应严格要求自己添加分号，这个习惯并不难。当然，作为一名web开发人员，你可能也会用到其他的语言（如php），这些语言都是严格要求以分号结尾的。你可以把这些编程语言的习惯带到javascript编程中来。<br />
作者注解：除了你完全肯定可以被忽略的地方，你都不可以忽略添加分号。</p>
<h4>错误3-使用==</h4>
<p>如果你问一个javascript编程者，在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: Green;">if</span><span style="color: Gray;"> </span><span style="color: Olive;">(</span><span style="color: Maroon;">1</span><span style="color: Gray;"> == </span><span style="color: Maroon;">1</span><span style="color: Olive;">)</span><span style="color: Gray;"> </span><span style="color: Olive;">{</span></li>
<li><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">console</span><span style="color: Gray;">.</span><span style="color: Blue;">log</span><span style="color: Olive;">(</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">it's true!</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">)</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp;</span><span style="color: Olive;">}</span></li></ol></div>
<p>代码如你所愿的输出了“it’s true！”那再试试下面的代码：</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;">if</span><span style="color: Gray;"> </span><span style="color: Olive;">(</span><span style="color: Maroon;">1</span><span style="color: Gray;"> == </span><span style="color: #8b0000;">'</span><span style="color: Red;">1</span><span style="color: #8b0000;">'</span><span style="color: Olive;">)</span><span style="color: Gray;"> </span><span style="color: Olive;">{</span></li>
<li><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">console</span><span style="color: Gray;">.</span><span style="color: Blue;">log</span><span style="color: Olive;">(</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">it's true!</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">)</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp;</span><span style="color: Olive;">}</span></li></ol></div>
<p>这段代码在控制台中尽然也输出了“it’s true!”，但其实这并不是你所期望的输出。这里的==运算符转换了运算数的类型，从而使得两个运算数相等了。这里if语句中的==运算符使得右边string类型的“1”变成了number型的1。<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: #8b0000;">''</span><span style="color: Gray;"> == </span><span style="color: #8b0000;">'</span><span style="color: Red;">0</span><span style="color: #8b0000;">'</span><span style="color: Gray;"> </span><span style="color: #ffa500;">// false</span></li>
<li><span style="color: Gray;">&nbsp;</span><span style="color: #8b0000;">'</span><span style="color: Red;">0</span><span style="color: #8b0000;">'</span><span style="color: Gray;"> == </span><span style="color: #8b0000;">''</span><span style="color: Gray;"> </span><span style="color: #ffa500;">// true</span></li>
<li><span style="color: Gray;">&nbsp;</span><span style="color: Green;">false</span><span style="color: Gray;"> == </span><span style="color: #8b0000;">'</span><span style="color: Red;">0</span><span style="color: #8b0000;">'</span><span style="color: Gray;"> </span><span style="color: #ffa500;">// true</span></li>
<li><span style="color: Gray;">&nbsp;</span><span style="color: #8b0000;">'</span><span style="color: Red;"> \t\r\n </span><span style="color: #8b0000;">'</span><span style="color: Gray;"> == </span><span style="color: Maroon;">0</span><span style="color: Gray;"> </span><span style="color: #ffa500;">// true</span></li></ol></div>
<h4>错误4-使用数据类型的包装对象</h4>
<p>Javascript提供了各个数据类型的包装对象。</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;">new</span><span style="color: Gray;"> </span><span style="color: Teal;">Number</span><span style="color: Olive;">(</span><span style="color: Maroon;">10</span><span style="color: Olive;">)</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp;</span><span style="color: Green;">new</span><span style="color: Gray;"> </span><span style="color: Teal;">String</span><span style="color: Olive;">(</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">hello</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">)</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp;</span><span style="color: Green;">new</span><span style="color: Gray;"> </span><span style="color: Blue;">Boolean</span><span style="color: Olive;">(</span><span style="color: Green;">true</span><span style="color: Olive;">)</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp;</span><span style="color: Green;">new</span><span style="color: Gray;"> </span><span style="color: Blue;">Object</span><span style="color: Olive;">()</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp;</span><span style="color: Green;">new</span><span style="color: Gray;"> </span><span style="color: Teal;">Array</span><span style="color: Olive;">(</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">one</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;">, </span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">two</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;">, </span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">three</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">)</span><span style="color: Gray;">;</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: Maroon;">10</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp;</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">hello</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp;</span><span style="color: Green;">true</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp;</span><span style="color: Olive;">{}</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp;</span><span style="color: Olive;">[</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">one</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;">, </span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">two</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;">, </span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">three</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">]</span><span style="color: Gray;">;</span></li></ol></div>
<p>但是这两种方式还是有所不同的。下面是douglas crockford的观点：<br />
例如用new Boolean(false)创建一个对象，该对象有一个方法valueOf，调用该方法会返回构造器的值。<br />
这意味着，如果运行typeof new Number(10)或者是typeof new String(‘hello’),将返回‘object’，而不是’number’或’string’.另外，用数据类型的包装还会引发一些意料之外的结果。<br />
那么为什么javascript要提供数据类型的包装对象呢？这是因为javascript解析器内部会调用。简单的数据类型是没有方法的（因为它们不是对象），所以当调用简单类型的数据的方法时（如’hello’.replace(‘ello’, ‘i’)）,javascript会调用String包装对象来创建一个临时的string对象，然后调用该对象的方法，完成调用后会删除这个临时对象。<br />
所以不要用数据类型的包装对象来创建简单类型的数据。<br />
注意：本来不用这么说明的，但本文还是想明确的告诉初学者：不是说不使用它们和new（尽管有些是推荐使用的），这里需要特别指出的是，这个建议特别针对这些数据类型，如：number、string、Boolean、array和空对象。</p>
<h4>错误5-在使用for-in时不对属性检查</h4>
<p>我们都很熟悉遍历数组，但是你可能还希望能遍历对象的属性。（题外话：array事实上是属性名为数字的对象）。这是可以用for-in循环语句，代码如下：</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;">prop</span><span style="color: Gray;">, </span><span style="color: Blue;">obj</span><span style="color: Gray;"> = </span><span style="color: Olive;">{</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;">Joe</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;">, </span><span style="color: Blue;">job</span><span style="color: Gray;">: </span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">Coder</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;">, </span><span style="color: Blue;">age</span><span style="color: Gray;">: </span><span style="color: Maroon;">25</span><span style="color: Gray;"> </span><span style="color: Olive;">}</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp;</span></li>
<li><span style="color: Gray;">&nbsp;</span><span style="color: Green;">for</span><span style="color: Gray;"> </span><span style="color: Olive;">(</span><span style="color: Green;">var</span><span style="color: Gray;"> </span><span style="color: Blue;">prop</span><span style="color: Gray;"> </span><span style="color: Green;">in</span><span style="color: Gray;"> </span><span style="color: Blue;">obj</span><span style="color: Olive;">)</span><span style="color: Gray;"> </span><span style="color: Olive;">{</span></li>
<li><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">console</span><span style="color: Gray;">.</span><span style="color: Blue;">log</span><span style="color: Olive;">(</span><span style="color: Blue;">prop</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: Blue;">obj</span><span style="color: Olive;">[</span><span style="color: Blue;">prop</span><span style="color: Olive;">])</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp;</span><span style="color: Olive;">}</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: Blue;">name</span><span style="color: Gray;">: </span><span style="color: Blue;">Joe</span></li>
<li><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">job</span><span style="color: Gray;">: </span><span style="color: Blue;">Coder</span></li>
<li><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">age</span><span style="color: Gray;">: </span><span style="color: Maroon;">25</span></li></ol></div>
<p>但是，浏览器中for-in遍历对象属性和方法时会包括对象原型链上的所有属性和方法。但绝大多数属性是不希望被枚举出来的。可以用hasOwnProperties方法来检测属性是否属于对象。代码如下：</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: Teal;">Function</span><span style="color: Gray;"> </span><span style="color: Blue;">Dog</span><span style="color: Gray;"> </span><span style="color: Olive;">(</span><span style="color: Blue;">name</span><span style="color: Olive;">)</span><span style="color: Gray;"> </span><span style="color: Olive;">{</span></li>
<li><span style="color: Gray;">&nbsp;</span><span style="color: Green;">this</span><span style="color: Gray;">.</span><span style="color: Blue;">name</span><span style="color: Gray;"> = </span><span style="color: Blue;">name</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp;</span><span style="color: Olive;">}</span></li>
<li><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">Dog</span><span style="color: Gray;">.</span><span style="color: Blue;">prototype</span><span style="color: Gray;">.</span><span style="color: Blue;">legs</span><span style="color: Gray;"> = </span><span style="color: Maroon;">4</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">Dog</span><span style="color: Gray;">.</span><span style="color: Blue;">prototype</span><span style="color: Gray;">.</span><span style="color: Blue;">speak</span><span style="color: Gray;"> = </span><span style="color: Green;">function</span><span style="color: Gray;"> </span><span style="color: Olive;">()</span><span style="color: Gray;"> </span><span style="color: Olive;">{</span></li>
<li><span style="color: Gray;">&nbsp;</span><span style="color: Green;">return</span><span style="color: Gray;"> </span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">woof!</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp;</span><span style="color: Olive;">}</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp;</span></li>
<li><span style="color: Gray;">&nbsp;</span><span style="color: Green;">var</span><span style="color: Gray;"> </span><span style="color: Blue;">d</span><span style="color: Gray;"> = </span><span style="color: Green;">new</span><span style="color: Gray;"> </span><span style="color: Blue;">Dog</span><span style="color: Olive;">(</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">Bowser</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">)</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp;</span></li>
<li><span style="color: Gray;">&nbsp;</span><span style="color: Green;">for</span><span style="color: Gray;"> </span><span style="color: Olive;">(</span><span style="color: Green;">var</span><span style="color: Gray;"> </span><span style="color: Blue;">prop</span><span style="color: Gray;"> </span><span style="color: Green;">in</span><span style="color: Gray;"> </span><span style="color: Blue;">d</span><span style="color: Olive;">)</span><span style="color: Gray;"> </span><span style="color: Olive;">{</span></li>
<li><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">console</span><span style="color: Gray;">.</span><span style="color: Blue;">log</span><span style="color: Olive;">(</span><span style="color: Gray;"> </span><span style="color: Blue;">prop</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: Blue;">d</span><span style="color: Olive;">[</span><span style="color: Blue;">prop</span><span style="color: Olive;">]</span><span style="color: Gray;"> </span><span style="color: Olive;">)</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp;</span><span style="color: Olive;">}</span></li>
<li><span style="color: Gray;">&nbsp;</span></li>
<li><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">console</span><span style="color: Gray;">.</span><span style="color: Blue;">log</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;</span></li>
<li><span style="color: Gray;">&nbsp;</span><span style="color: Green;">for</span><span style="color: Gray;"> </span><span style="color: Olive;">(</span><span style="color: Green;">var</span><span style="color: Gray;"> </span><span style="color: Blue;">prop</span><span style="color: Gray;"> </span><span style="color: Green;">in</span><span style="color: Gray;"> </span><span style="color: Blue;">d</span><span style="color: Olive;">)</span><span style="color: Gray;"> </span><span style="color: Olive;">{</span></li>
<li><span style="color: Gray;">&nbsp;</span><span style="color: Green;">if</span><span style="color: Gray;"> </span><span style="color: Olive;">(</span><span style="color: Blue;">d</span><span style="color: Gray;">.</span><span style="color: Blue;">hasOwnProperty</span><span style="color: Olive;">(</span><span style="color: Blue;">prop</span><span style="color: Olive;">))</span><span style="color: Gray;"> </span><span style="color: Olive;">{</span></li>
<li><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">console</span><span style="color: Gray;">.</span><span style="color: Blue;">log</span><span style="color: Olive;">(</span><span style="color: Gray;"> </span><span style="color: Blue;">prop</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: Blue;">d</span><span style="color: Olive;">[</span><span style="color: Blue;">prop</span><span style="color: Olive;">]</span><span style="color: Gray;"> </span><span style="color: Olive;">)</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp;</span><span style="color: Olive;">}</span></li>
<li><span style="color: Gray;">&nbsp;</span><span style="color: Olive;">}</span></li>
<li><span style="color: Gray;">&nbsp;</span></li>
<li><span style="color: Gray;">&nbsp;</span><span style="color: #ffa500;">// Output</span></li>
<li><span style="color: Gray;">&nbsp;</span></li>
<li><span style="color: Gray;">&nbsp;</span><span style="color: #ffa500;">// name: Bowser</span></li>
<li><span style="color: Gray;">&nbsp;</span><span style="color: #ffa500;">// legs: 4</span></li>
<li><span style="color: Gray;">&nbsp;</span><span style="color: #ffa500;">// speak: function () {</span></li>
<li><span style="color: Gray;">&nbsp;</span><span style="color: Green;">return</span><span style="color: Gray;"> </span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">woof!</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp;</span><span style="color: #ffa500;">// }</span></li>
<li><span style="color: Gray;">&nbsp;</span><span style="color: #ffa500;">// =====</span></li>
<li><span style="color: Gray;">&nbsp;</span><span style="color: #ffa500;">// name: Bowser</span></li></ol></div>
<p>有时，只希望枚举列出对象的的属性，不包括方法。可以用typeof方法，代码如下：</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;">for</span><span style="color: Gray;"> </span><span style="color: Olive;">(</span><span style="color: Green;">var</span><span style="color: Gray;"> </span><span style="color: Blue;">prop</span><span style="color: Gray;"> </span><span style="color: Green;">in</span><span style="color: Gray;"> </span><span style="color: Blue;">d</span><span style="color: Olive;">)</span><span style="color: Gray;"> </span><span style="color: Olive;">{</span></li>
<li><span style="color: Gray;">&nbsp;</span><span style="color: Green;">if</span><span style="color: Gray;"> </span><span style="color: Olive;">(</span><span style="color: Green;">typeof</span><span style="color: Gray;"> </span><span style="color: Blue;">d</span><span style="color: Olive;">[</span><span style="color: Blue;">prop</span><span style="color: Olive;">]</span><span style="color: Gray;"> !== </span><span style="color: #8b0000;">'</span><span style="color: Red;">function</span><span style="color: #8b0000;">'</span><span style="color: Olive;">)</span><span style="color: Gray;"> </span><span style="color: Olive;">{</span></li>
<li><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">console</span><span style="color: Gray;">.</span><span style="color: Blue;">log</span><span style="color: Olive;">(</span><span style="color: Gray;"> </span><span style="color: Blue;">prop</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: Blue;">d</span><span style="color: Olive;">[</span><span style="color: Blue;">prop</span><span style="color: Olive;">]</span><span style="color: Gray;"> </span><span style="color: Olive;">)</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp;</span><span style="color: Olive;">}</span></li>
<li><span style="color: Gray;">&nbsp;</span><span style="color: Olive;">}</span></li></ol></div>
<p>不管怎么样，在用for-in循环时要确保对属性进行检测，以避免得到你意料之外的结果。</p>
<h4>错误6-使用with或eval</h4>
<p>幸运的是，现在大部分javascript教程都不会教你使用with或eval。但是一些老教程或名气不大的资料时（因为有时候好的资料在网上很难找到），可能会发现有使用with或eval。<br />
下面是两个不用with的主要原因：<br />
1、 它会降低代码性能<br />
2、 不易于代码阅读</p>
<p>第一点是它与生俱来的。第二点，看看下面的代码，这里用with访问person对象的name、age属性。</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;">person</span><span style="color: Gray;"> = </span><span style="color: Olive;">{</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;">Joe</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;">, </span><span style="color: Blue;">age</span><span style="color: Gray;"> : </span><span style="color: Maroon;">10</span><span style="color: Gray;"> </span><span style="color: Olive;">}</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp;</span></li>
<li><span style="color: Gray;">&nbsp;</span><span style="color: Green;">with</span><span style="color: Gray;"> </span><span style="color: Olive;">(</span><span style="color: Blue;">person</span><span style="color: Olive;">)</span><span style="color: Gray;"> </span><span style="color: Olive;">{</span></li>
<li><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">console</span><span style="color: Gray;">.</span><span style="color: Blue;">log</span><span style="color: Olive;">(</span><span style="color: Blue;">name</span><span style="color: Olive;">)</span><span style="color: Gray;">; </span><span style="color: #ffa500;">// Joe</span></li>
<li><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">console</span><span style="color: Gray;">.</span><span style="color: Blue;">log</span><span style="color: Olive;">(</span><span style="color: Blue;">age</span><span style="color: Olive;">)</span><span style="color: Gray;">; </span><span style="color: #ffa500;">// 10</span></li>
<li><span style="color: Gray;">&nbsp;</span><span style="color: Olive;">}</span></li></ol></div>
<p>但是，若果有一个变量和对象其中一个属性同名，那用with会发生什么呢？事实上，这种情况下，访问变量会引用那个变量而不是对象的属性。另一个值得注意的是，在with语句中，如果访问的属性不存在或对象不存在，就不能给对象添加属性，同时会使得作用域链上with作用域后的那个作用域中创建一个变量。</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;">person</span><span style="color: Gray;"> = </span><span style="color: Olive;">{</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;">Joe</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;">, </span><span style="color: Blue;">age</span><span style="color: Gray;"> : </span><span style="color: Maroon;">10</span><span style="color: Gray;"> </span><span style="color: Olive;">}</span><span style="color: Gray;">,</span></li>
<li><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">name</span><span style="color: Gray;"> = </span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">Billy</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp;</span></li>
<li><span style="color: Gray;">&nbsp;</span><span style="color: Green;">with</span><span style="color: Gray;"> </span><span style="color: Olive;">(</span><span style="color: Blue;">person</span><span style="color: Olive;">)</span><span style="color: Gray;"> </span><span style="color: Olive;">{</span></li>
<li><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">console</span><span style="color: Gray;">.</span><span style="color: Blue;">log</span><span style="color: Olive;">(</span><span style="color: Blue;">name</span><span style="color: Olive;">)</span><span style="color: Gray;">; </span><span style="color: #ffa500;">// Billy</span></li>
<li><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">job</span><span style="color: Gray;"> = </span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">Designer</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp;</span><span style="color: Olive;">}</span></li>
<li><span style="color: Gray;">&nbsp;</span></li>
<li><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">console</span><span style="color: Gray;">.</span><span style="color: Blue;">log</span><span style="color: Olive;">(</span><span style="color: Blue;">person</span><span style="color: Gray;">.</span><span style="color: Blue;">job</span><span style="color: Olive;">)</span><span style="color: Gray;">; </span><span style="color: #ffa500;">// undefined;</span></li>
<li><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">console</span><span style="color: Gray;">.</span><span style="color: Blue;">log</span><span style="color: Olive;">(</span><span style="color: Blue;">job</span><span style="color: Olive;">)</span><span style="color: Gray;">; </span><span style="color: #ffa500;">// Designer</span></li></ol></div>
<p>那eval呢？它可以接受一个字符串参数，并且解析执行改字符串。</p>
<p>这听起来没有什么不好，甚至觉得很棒，对吗？但问题就是这太棒了！与其将一连串字符串将给它来解析执行，为什么不直接编写在程序中呢？不该这么做的原因如下：</p>
<ol>
<li>完全可以直接编写在代码中。</li>
<li>eval解析很慢的，性能跟with差不多。</li>
</ol>
<p>eval的用法是在非运行时运行环境。可以从服务器端或客户端获取代码。难道真的想你的网站用户来底控制你的代码？这样不就意味着你的网站向无数的黑客敞开了大门。用eval就好比，离开了家，并告诉大家钥匙就是门口垫子下面。如果你爱自己或你的用户，就不要用eval。</p>
<h4>错误7-在用parseInt时不用基数</h4>
<p>Javascript提供了一个非常有用的方法parseInt，它可以将字符串转换为数值。</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;">parseInt</span><span style="color: Olive;">(</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">200</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">)</span><span style="color: Gray;">; </span><span style="color: #ffa500;">// 200</span></li>
<li><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">parseInt</span><span style="color: Olive;">(</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">043</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">)</span><span style="color: Gray;">; </span><span style="color: #ffa500;">// 35</span></li></ol></div>
<p>结果是不是令人觉得意外？第二句为什么不是43？事实上，parseInt方法不仅仅是只能把字符串当做十进制数来转换。当parseInt的第一个参数是以0开头，它就会把字符串当作是八进制数来转换。这就是不使用基数出现的意料之外结果。第二个参数&#8211;基数，会指定parseInt方法把字符串当做什么进制的数来转换。（当然，它的返回值永远是十进制数）</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;">parseInt</span><span style="color: Olive;">(</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">020</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;">, </span><span style="color: Maroon;">10</span><span style="color: Olive;">)</span><span style="color: Gray;">; </span><span style="color: #ffa500;">// 20</span></li>
<li><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">parseInt</span><span style="color: Olive;">(</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">100</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;">, </span><span style="color: Maroon;">2</span><span style="color: Olive;">)</span><span style="color: Gray;">; </span><span style="color: #ffa500;">// 4</span></li></ol></div>
<h4>错误8 if和while语句不使用{}</h4>
<p>Javascript最明显的特点是语法要求不那么严格。但正是这样的特点，有时会带来麻烦。If和while语句的{}就会引起一些麻烦。{}是根据if条件成立时执行代码语句的条数来用的。</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;">if</span><span style="color: Gray;"> </span><span style="color: Olive;">(</span><span style="color: Green;">true</span><span style="color: Olive;">)</span></li>
<li><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">console</span><span style="color: Gray;">.</span><span style="color: Blue;">log</span><span style="color: Olive;">(</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">inside the if statement</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">)</span><span style="color: Gray;">;</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: Green;">var</span><span style="color: Gray;"> </span><span style="color: Blue;">arr</span><span style="color: Gray;"> = </span><span style="color: Olive;">[</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">one</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;">, </span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">two</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;">, </span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">three</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;">, </span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">four</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;">, </span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">five</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;">, </span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">six</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;">, </span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">seven</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;">, </span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">eight</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;">, </span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">nine</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;">, </span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">ten</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">]</span><span style="color: Gray;">,</span></li>
<li><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">i</span><span style="color: Gray;"> = </span><span style="color: Blue;">arr</span><span style="color: Gray;">.</span><span style="color: Blue;">length</span><span style="color: Gray;"> - </span><span style="color: Blue;">i</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp;</span></li>
<li><span style="color: Gray;">&nbsp;</span><span style="color: Green;">while</span><span style="color: Gray;"> </span><span style="color: Olive;">(</span><span style="color: Blue;">i</span><span style="color: Olive;">)</span><span style="color: Gray;"> </span><span style="color: Blue;">console</span><span style="color: Gray;">.</span><span style="color: Blue;">log</span><span style="color: Olive;">(</span><span style="color: Gray;"> </span><span style="color: Blue;">arr</span><span style="color: Olive;">[</span><span style="color: Blue;">i</span><span style="color: Gray;">--</span><span style="color: Olive;">]</span><span style="color: Gray;"> </span><span style="color: Olive;">)</span><span style="color: Gray;">;</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: Green;">if</span><span style="color: Gray;"> </span><span style="color: Olive;">(</span><span style="color: Green;">true</span><span style="color: Olive;">)</span></li>
<li><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">console</span><span style="color: Gray;">.</span><span style="color: Blue;">log</span><span style="color: Olive;">(</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">inside the if-statement.</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">)</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">console</span><span style="color: Gray;">.</span><span style="color: Blue;">log</span><span style="color: Olive;">(</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">outside the if-statement.</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">)</span><span style="color: Gray;">;</span></li></ol></div>
<p>看看上面的代码，第二行console语句是不属于if执行语句的，但是这里它看起来像是if的执行语句。使用{}会使结构更清晰。同时，如果你想在if的执行代码中添加一句，也需要使用{}。习惯使用{}并不是一件难事。</p>
<h4>错误9-单个单个地插入dom元素</h4>
<p>这并不是javascript自身的问题。99%100的javascript编程都会涉及DOM操作，在对DOM操作上会犯很多错误，但这是最明显的一个。<br />
DOM操作会使浏览器重绘页面，所以如果有一连串的元素一个接一个的插入页面中，这会急剧增加浏览器渲染页面的负担。</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;">list</span><span style="color: Gray;"> = </span><span style="color: Teal;">document</span><span style="color: Gray;">.</span><span style="color: Blue;">getElementById</span><span style="color: Olive;">(</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">list</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">)</span><span style="color: Gray;">,</span></li>
<li><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">items</span><span style="color: Gray;"> = </span><span style="color: Olive;">[</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">one</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;">, </span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">two</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;">, </span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">three</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;">, </span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">four</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">]</span><span style="color: Gray;">,</span></li>
<li><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">el</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp;</span></li>
<li><span style="color: Gray;">&nbsp;</span><span style="color: Green;">for</span><span style="color: Gray;"> </span><span style="color: Olive;">(</span><span style="color: Green;">var</span><span style="color: Gray;"> </span><span style="color: Blue;">i</span><span style="color: Gray;"> = </span><span style="color: Maroon;">0</span><span style="color: Gray;">; </span><span style="color: Blue;">items</span><span style="color: Olive;">[</span><span style="color: Blue;">i</span><span style="color: Olive;">]</span><span style="color: Gray;">; </span><span style="color: Blue;">i</span><span style="color: Gray;">++</span><span style="color: Olive;">)</span><span style="color: Gray;"> </span><span style="color: Olive;">{</span></li>
<li><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">el</span><span style="color: Gray;"> = </span><span style="color: Teal;">document</span><span style="color: Gray;">.</span><span style="color: Blue;">createElement</span><span style="color: Olive;">(</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">li</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">)</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">el</span><span style="color: Gray;">.</span><span style="color: Blue;">appendChild</span><span style="color: Olive;">(</span><span style="color: Gray;"> </span><span style="color: Teal;">document</span><span style="color: Gray;">.</span><span style="color: Blue;">createTextNode</span><span style="color: Olive;">(</span><span style="color: Blue;">items</span><span style="color: Olive;">[</span><span style="color: Blue;">i</span><span style="color: Olive;">])</span><span style="color: Gray;"> </span><span style="color: Olive;">)</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">list</span><span style="color: Gray;">.</span><span style="color: Blue;">appendChild</span><span style="color: Olive;">(</span><span style="color: Blue;">el</span><span style="color: Olive;">)</span><span style="color: Gray;">; </span><span style="color: #ffa500;">// slow, bad idea</span></li>
<li><span style="color: Gray;">&nbsp;</span><span style="color: Olive;">}</span></li></ol></div>
<p>Document fragments 是一个DOM元素容器，可以使用它同时添加这些元素到页面中。Document fragment自身不是一个DOM节点，它不会在页面DOM树中显示，并且在把它插入DOM之前它是不可见的。下面是它的用法：</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;">list</span><span style="color: Gray;"> = </span><span style="color: Teal;">document</span><span style="color: Gray;">.</span><span style="color: Blue;">getElementById</span><span style="color: Olive;">(</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">list</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">)</span><span style="color: Gray;">,</span></li>
<li><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">frag</span><span style="color: Gray;"> = </span><span style="color: Teal;">document</span><span style="color: Gray;">.</span><span style="color: Blue;">createDocumentFragment</span><span style="color: Olive;">()</span><span style="color: Gray;">,</span></li>
<li><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">items</span><span style="color: Gray;"> = </span><span style="color: Olive;">[</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">one</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;">, </span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">two</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;">, </span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">three</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;">, </span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">four</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">]</span><span style="color: Gray;">,</span></li>
<li><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">el</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp;</span></li>
<li><span style="color: Gray;">&nbsp;</span><span style="color: Green;">for</span><span style="color: Gray;"> </span><span style="color: Olive;">(</span><span style="color: Green;">var</span><span style="color: Gray;"> </span><span style="color: Blue;">i</span><span style="color: Gray;"> = </span><span style="color: Maroon;">0</span><span style="color: Gray;">; </span><span style="color: Blue;">items</span><span style="color: Olive;">[</span><span style="color: Blue;">i</span><span style="color: Olive;">]</span><span style="color: Gray;">; </span><span style="color: Blue;">i</span><span style="color: Gray;">++</span><span style="color: Olive;">)</span><span style="color: Gray;"> </span><span style="color: Olive;">{</span></li>
<li><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">el</span><span style="color: Gray;"> = </span><span style="color: Teal;">document</span><span style="color: Gray;">.</span><span style="color: Blue;">createElement</span><span style="color: Olive;">(</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">li</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">)</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">el</span><span style="color: Gray;">.</span><span style="color: Blue;">appendChild</span><span style="color: Olive;">(</span><span style="color: Gray;"> </span><span style="color: Teal;">document</span><span style="color: Gray;">.</span><span style="color: Blue;">createTextNode</span><span style="color: Olive;">(</span><span style="color: Blue;">items</span><span style="color: Olive;">[</span><span style="color: Blue;">i</span><span style="color: Olive;">])</span><span style="color: Gray;"> </span><span style="color: Olive;">)</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">frag</span><span style="color: Gray;">.</span><span style="color: Blue;">appendChild</span><span style="color: Olive;">(</span><span style="color: Blue;">el</span><span style="color: Olive;">)</span><span style="color: Gray;">; </span><span style="color: #ffa500;">// better!</span></li>
<li><span style="color: Gray;">&nbsp;</span><span style="color: Olive;">}</span></li>
<li><span style="color: Gray;">&nbsp;</span></li>
<li><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">list</span><span style="color: Gray;">.</span><span style="color: Blue;">appendChild</span><span style="color: Olive;">(</span><span style="color: Blue;">frag</span><span style="color: Olive;">)</span><span style="color: Gray;">;</span></li></ol></div>
<p>非常快速、简洁！</p>
<h4>错误10-不懂javascript</h4>
<p>许多人不花时间来认真地学习javascript。<br />
Javascript并不等于jquery。这是否吓到你了？如果你会犯以上列出的错误，那么你需要认真地学习javascript。Javascript是一门语言，一门基本上不用学习就可以使用的语言，这就导致许多人不花时间来认真学习。千万不要这么做，已经有太多太多的教程指出这样做的弊端，你没有借口不认真学习javascript。如果你只是了解jquery（或mootools，或别的），那么你学习了解javascript的出发点就已经错了。</p>
<h4>错误11-严格遵循以上的规则</h4>
<p><strong>“Rules are made to be broken.”</strong>(规则是用来被打破的。)</p>
<p>虽然本文列举了以上规则，但像任何事一样，规则是用来被打破的。如果是刚开始学习javascript，你会严于律己，严格遵循以上规则。但是到了真正理解了为什么要遵循以上规则的原因后，你才会知道灵活运用以上规则。例如，eval被反复的说到不能用，但是它却是唯一能解析服务器端返回json字符串的方法。当然这里在运用它时会做很多安全的检测（你可能会用到一个javascript库）。这里想要指明的是，在需要的地方，不应该害怕犯错，大胆的运用它。当然，永远不要犯错误10所指出的问题。</p>
<h4>结论：</h4>
<p>如果你是javascript新手，希望以上的内容对你javascript编程有所帮助。如果你是一个资深javascript工程师，如过这里有遗漏的，请在留言板中留言告知大家。</p>
<p>本文翻译自<a href="http://net.tutsplus.com/tutorials/javascript-ajax/the-10-javascript-mistakes-youre-making/" target="_blank">《The 11 JavaScript Mistakes you’re Making》</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.36ria.com/4479/feed</wfw:commentRss>
		<slash:comments>10</slash:comments>
		</item>
		<item>
		<title>Jasmine入门教程—web前端开发七武器（下）</title>
		<link>http://www.36ria.com/4473</link>
		<comments>http://www.36ria.com/4473#comments</comments>
		<pubDate>Tue, 13 Sep 2011 11:40:45 +0000</pubDate>
		<dc:creator>苏河</dc:creator>
				<category><![CDATA[前端开发工具]]></category>
		<category><![CDATA[Jasmine]]></category>
		<category><![CDATA[Jasmine教程]]></category>
		<category><![CDATA[web前端开发七武器]]></category>

		<guid isPermaLink="false">http://www.36ria.com/?p=4473</guid>
		<description><![CDATA[上一篇教程明河同学给大家翻译了Jasmine的基础知识，接下来跟随苏河学习下Jasmine的更为深入的语法。 第四步：学习匹配器 好了，通过以上的学习应该初步了解Jasmine的简单使用，下面将介绍两种匹配器：toEqual和toThrow。当然还有很多其他奇奇怪怪的匹配器，如果你有兴趣，你可以在wiki里面寻找它们。 toBeDefined / toBeUndefined 这里介绍的两种匹配器是用于测试一个变量是否被定义......]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.36ria.com/4457">上一篇教程</a>明河同学给大家翻译了Jasmine的基础知识，接下来跟随苏河学习下Jasmine的更为深入的语法。</p>
<h4>第四步：学习匹配器</h4>
<p>好了，通过以上的学习应该初步了解Jasmine的简单使用，下面将介绍两种匹配器：<strong>toEqual</strong>和<strong>toThrow</strong>。当然还有很多其他奇奇怪怪的匹配器，如果你有兴趣，你可以在<a href="https://github.com/pivotal/jasmine/wiki/Matchers">wiki</a>里面寻找它们。</p>
<h5>toBeDefined / toBeUndefined</h5>
<p>这里介绍的两种匹配器是用于测试一个变量是否被定义，当一个变量被定义了，你可以用toBeDefined去判断它，反之，你可以用toBeUndefined去判断一个变量是否未被定义。</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;">it</span><span style="color: Olive;">(</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">is defined</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;">, </span><span style="color: Green;">function</span><span style="color: Gray;"> </span><span style="color: Olive;">()</span><span style="color: Gray;"> </span><span style="color: Olive;">{</span><span style="color: Gray;">&nbsp; </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;">name</span><span style="color: Gray;"> = </span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">Andrew</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;">;&nbsp; </span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Blue;">expect</span><span style="color: Olive;">(</span><span style="color: Blue;">name</span><span style="color: Olive;">)</span><span style="color: Gray;">.</span><span style="color: Blue;">toBeDefined</span><span style="color: Olive;">()</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: Blue;">it</span><span style="color: Olive;">(</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">is not defined</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;">, </span><span style="color: Green;">function</span><span style="color: Gray;">&nbsp;</span><span style="color: Olive;">()</span><span style="color: Gray;"> </span><span style="color: Olive;">{</span><span style="color: Gray;">&nbsp; </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;">name</span><span style="color: Gray;">;&nbsp; </span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Blue;">expect</span><span style="color: Olive;">(</span><span style="color: Blue;">name</span><span style="color: Olive;">)</span><span style="color: Gray;">.</span><span style="color: Blue;">toBeUndefined</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>
<h5>toBeTruthy / toBeFalsy</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: Blue;">it</span><span style="color: Olive;">(</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">is true</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;">, </span><span style="color: Green;">function</span><span style="color: Gray;"> </span><span style="color: Olive;">()</span><span style="color: Gray;"> </span><span style="color: Olive;">{</span><span style="color: Gray;">&nbsp; </span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Blue;">expect</span><span style="color: Olive;">(</span><span style="color: Blue;">Lib</span><span style="color: Gray;">.</span><span style="color: Blue;">isAWeekDay</span><span style="color: Olive;">())</span><span style="color: Gray;">.</span><span style="color: Blue;">toBeTruthy</span><span style="color: Olive;">()</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: Blue;">it</span><span style="color: Olive;">(</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">is false</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;">, </span><span style="color: Green;">function</span><span style="color: Gray;">&nbsp;</span><span style="color: Olive;">()</span><span style="color: Gray;"> </span><span style="color: Olive;">{</span><span style="color: Gray;">&nbsp; </span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Blue;">expect</span><span style="color: Olive;">(</span><span style="color: Blue;">Lib</span><span style="color: Gray;">.</span><span style="color: Blue;">finishedQuiz</span><span style="color: Olive;">)</span><span style="color: Gray;">.</span><span style="color: Blue;">toBeFalsy</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>
<h5>toBeLessThan / toBeGreaterThan</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: Blue;">it</span><span style="color: Olive;">(</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">is less than 10</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;">, </span><span style="color: Green;">function</span><span style="color: Gray;"> </span><span style="color: Olive;">()</span><span style="color: Gray;"> </span><span style="color: Olive;">{</span><span style="color: Gray;">&nbsp; </span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Blue;">expect</span><span style="color: Olive;">(</span><span style="color: Maroon;">5</span><span style="color: Olive;">)</span><span style="color: Gray;">.</span><span style="color: Blue;">toBeLessThan</span><span style="color: Olive;">(</span><span style="color: Maroon;">10</span><span style="color: Olive;">)</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: Blue;">it</span><span style="color: Olive;">(</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">is greater than 10</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;">, </span><span style="color: Green;">function</span><span style="color: Gray;">&nbsp;</span><span style="color: Olive;">()</span><span style="color: Gray;"> </span><span style="color: Olive;">{</span><span style="color: Gray;">&nbsp; </span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Blue;">expect</span><span style="color: Olive;">(</span><span style="color: Maroon;">20</span><span style="color: Olive;">)</span><span style="color: Gray;">.</span><span style="color: Blue;">toBeGreaterThan</span><span style="color: Olive;">(</span><span style="color: Maroon;">10</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>
<h5>toMatch</h5>
<p>如果我们需要运用正则表达式进行相关验证，那么toMatch正好满足我们的需求。</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;">it</span><span style="color: Olive;">(</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">outputs the right text</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;">, </span><span style="color: Green;">function</span><span style="color: Gray;"> </span><span style="color: Olive;">()</span><span style="color: Gray;"> </span><span style="color: Olive;">{</span><span style="color: Gray;">&nbsp; </span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Blue;">expect</span><span style="color: Olive;">(</span><span style="color: Blue;">cart</span><span style="color: Gray;">.</span><span style="color: Blue;">total</span><span style="color: Olive;">())</span><span style="color: Gray;">.</span><span style="color: Blue;">toMatch</span><span style="color: Olive;">(</span><span style="color: #8b0000;">/</span><span style="color: Red;">\$\d*.\d\d</span><span style="color: #8b0000;">/</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>
<h5>toContain</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: Blue;">it</span><span style="color: Olive;">(</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">should contain oranges</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;">, </span><span style="color: Green;">function</span><span style="color: Gray;"> </span><span style="color: Olive;">()</span><span style="color: Gray;"> </span><span style="color: Olive;">{</span><span style="color: Gray;">&nbsp; </span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Blue;">expect</span><span style="color: Olive;">([</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">apples</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;">, </span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">oranges</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;">, </span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">pears</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">])</span><span style="color: Gray;">.</span><span style="color: Blue;">toContain</span><span style="color: Olive;">(</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">oranges</span><span style="color: #8b0000;">&quot;</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>还有很多的匹配器，这里就不一一介绍了，我们可以查看<a href="https://github.com/pivotal/jasmine/wiki/Matchers">wiki</a>来了解更多。但是你有没有想过，如果你想要的匹配器如果wiki里面没有怎么办？别担心，Jasmine允许我们建立自己的匹配器（第六步会提到），但是做这个之前，我们得学习一些其他的东西。（题外话：当然，我们需要通过jasmine建立一些匹配器，但是有些时候更重要的是，我们得知道代码的逻辑，这样方便我们建立可读性更强的测试代码。）</p>
<h4>第五步：了解Before和After</h4>
<p>（PS:下面的代码比较多，可以参照上一篇教程中的压缩包中的demo来看。）<br />
当我们对代码进行测试的时候，很多变量需要初始化。但是这是一个痛苦的过程，因为在每段测试用例后，这个变量就会被新的测试代码重新赋值，所以jasmine提供beforeEach和afterEach方法让我们对变量进行重新申明。好了，首先让我们看看beforeEach是如何使用的：</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;">describe</span><span style="color: Olive;">(</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">MyObject</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;">, </span><span style="color: Green;">function</span><span style="color: Gray;"> </span><span style="color: Olive;">()</span><span style="color: Gray;"> </span><span style="color: Olive;">{</span><span style="color: Gray;">&nbsp; </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;">obj</span><span style="color: Gray;"> = </span><span style="color: Green;">new</span><span style="color: Gray;"> </span><span style="color: Blue;">MyObject</span><span style="color: Olive;">()</span><span style="color: Gray;">;&nbsp; </span></li>
<li><span style="color: Gray;">&nbsp; </span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Blue;">beforeEach</span><span style="color: Olive;">(</span><span style="color: Green;">function</span><span style="color: Gray;">&nbsp;</span><span style="color: Olive;">()</span><span style="color: Gray;"> </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: Blue;">obj</span><span style="color: Gray;">.</span><span style="color: Blue;">setState</span><span style="color: Olive;">(</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">clean</span><span style="color: #8b0000;">&quot;</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; </span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Blue;">it</span><span style="color: Olive;">(</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">changes state</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;">, </span><span style="color: Green;">function</span><span style="color: Gray;">&nbsp;</span><span style="color: Olive;">()</span><span style="color: Gray;"> </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: Blue;">obj</span><span style="color: Gray;">.</span><span style="color: Blue;">setState</span><span style="color: Olive;">(</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">dirty</span><span style="color: #8b0000;">&quot;</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: Blue;">expect</span><span style="color: Olive;">(</span><span style="color: Blue;">obj</span><span style="color: Gray;">.</span><span style="color: Blue;">getState</span><span style="color: Olive;">())</span><span style="color: Gray;">.</span><span style="color: Blue;">toEqual</span><span style="color: Olive;">(</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">dirty</span><span style="color: #8b0000;">&quot;</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: Blue;">it</span><span style="color: Olive;">(</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">adds states</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;">, </span><span style="color: Green;">function</span><span style="color: Gray;">&nbsp;</span><span style="color: Olive;">()</span><span style="color: Gray;"> </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: Blue;">obj</span><span style="color: Gray;">.</span><span style="color: Blue;">addState</span><span style="color: Olive;">(</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">packaged</span><span style="color: #8b0000;">&quot;</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: Blue;">expect</span><span style="color: Olive;">(</span><span style="color: Blue;">obj</span><span style="color: Gray;">.</span><span style="color: Blue;">getState</span><span style="color: Olive;">())</span><span style="color: Gray;">.</span><span style="color: Blue;">toEqual</span><span style="color: Olive;">([</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">clean</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;">, </span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">packaged</span><span style="color: #8b0000;">&quot;</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>在以上代码片段中，你可以看到，当一段测试用例运行前，obj的状态会被置为“clean”，如果我们不用beforeEach做这个初始化的话，那么obj的状态在下一次测试用例执行之前不会被重置，这样也就达不到测试的效果了，也就是说，beforeEach是作用于每个测试用例之前的。同样，jasmine也提供afterEach方法，该方法作用于每个测试用例执行之后。</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;">describe</span><span style="color: Olive;">(</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">MyObject</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;">, </span><span style="color: Green;">function</span><span style="color: Gray;"> </span><span style="color: Olive;">()</span><span style="color: Gray;"> </span><span style="color: Olive;">{</span><span style="color: Gray;">&nbsp; </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;">obj</span><span style="color: Gray;"> = </span><span style="color: Green;">new</span><span style="color: Gray;"> </span><span style="color: Blue;">MyObject</span><span style="color: Olive;">(</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">clean</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">)</span><span style="color: Gray;">; </span><span style="color: #ffa500;">// sets initial state&nbsp; </span></li>
<li><span style="color: Gray;">&nbsp; </span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Blue;">afterEach</span><span style="color: Olive;">(</span><span style="color: Green;">function</span><span style="color: Gray;">&nbsp;</span><span style="color: Olive;">()</span><span style="color: Gray;"> </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: Blue;">obj</span><span style="color: Gray;">.</span><span style="color: Blue;">setState</span><span style="color: Olive;">(</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">clean</span><span style="color: #8b0000;">&quot;</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; </span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Blue;">it</span><span style="color: Olive;">(</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">changes state</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;">, </span><span style="color: Green;">function</span><span style="color: Gray;">&nbsp;</span><span style="color: Olive;">()</span><span style="color: Gray;"> </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: Blue;">obj</span><span style="color: Gray;">.</span><span style="color: Blue;">setState</span><span style="color: Olive;">(</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">dirty</span><span style="color: #8b0000;">&quot;</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: Blue;">expect</span><span style="color: Olive;">(</span><span style="color: Blue;">obj</span><span style="color: Gray;">.</span><span style="color: Blue;">getState</span><span style="color: Olive;">())</span><span style="color: Gray;">.</span><span style="color: Blue;">toEqual</span><span style="color: Olive;">(</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">dirty</span><span style="color: #8b0000;">&quot;</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: Blue;">it</span><span style="color: Olive;">(</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">adds states</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;">, </span><span style="color: Green;">function</span><span style="color: Gray;">&nbsp;</span><span style="color: Olive;">()</span><span style="color: Gray;"> </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: Blue;">obj</span><span style="color: Gray;">.</span><span style="color: Blue;">addState</span><span style="color: Olive;">(</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">packaged</span><span style="color: #8b0000;">&quot;</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: Blue;">expect</span><span style="color: Olive;">(</span><span style="color: Blue;">obj</span><span style="color: Gray;">.</span><span style="color: Blue;">getState</span><span style="color: Olive;">())</span><span style="color: Gray;">.</span><span style="color: Blue;">toEqual</span><span style="color: Olive;">([</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">clean</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;">, </span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">packaged</span><span style="color: #8b0000;">&quot;</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>以上测试代码就是在每个测试用例执行完之后重置obj的状态为“clean”。</p>
<h4>第六步：编写自定义匹配器</h4>
<p>（PS:这一步其实可以跳过。）<br />
回到前面第四步提及的场景，自定义的匹配器还是适合某些场景的。所以接下来我就来写一个自定义的匹配器，例如，我们可以增加一个匹配器在BeforeEach或者it函数里（当然，这里你会想把这个匹配器放在afterEach函数体里，但是这个应用场景并不广泛），如下所示：</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;">beforeEach</span><span style="color: Olive;">(</span><span style="color: Green;">function</span><span style="color: Gray;"> </span><span style="color: Olive;">()</span><span style="color: Gray;"> </span><span style="color: Olive;">{</span><span style="color: Gray;">&nbsp; </span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Green;">this</span><span style="color: Gray;">.</span><span style="color: Blue;">addMatchers</span><span style="color: Olive;">({</span><span style="color: Gray;">&nbsp; </span></li>
<li><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>一个很简单的开始对吧？哈哈，好了，下面我们将在this.addMatchers这个函数体定义内容，这个内容关系到这个匹配器是如何运行的。举个例子，我们想定义一个匹配器做如下验证：一个数字是否在两个数字的之间。那么我们会这么写：</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;">beforeEach</span><span style="color: Olive;">(</span><span style="color: Green;">function</span><span style="color: Gray;"> </span><span style="color: Olive;">()</span><span style="color: Gray;"> </span><span style="color: Olive;">{</span><span style="color: Gray;">&nbsp; </span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Green;">this</span><span style="color: Gray;">.</span><span style="color: Blue;">addMatchers</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: Blue;">toBeBetween</span><span style="color: Gray;">: </span><span style="color: Green;">function</span><span style="color: Gray;">&nbsp;</span><span style="color: Olive;">(</span><span style="color: Blue;">rangeFloor</span><span style="color: Gray;">, </span><span style="color: Blue;">rangeCeiling</span><span style="color: Olive;">)</span><span style="color: Gray;"> </span><span style="color: Olive;">{</span><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: Gray;">&nbsp;</span><span style="color: Olive;">(</span><span style="color: Blue;">rangeFloor</span><span style="color: Gray;"> &gt; </span><span style="color: Blue;">rangeCeiling</span><span style="color: Olive;">)</span><span style="color: Gray;"> </span><span style="color: Olive;">{</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: Green;">var</span><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">temp</span><span style="color: Gray;"> = </span><span style="color: Blue;">rangeFloor</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: Blue;">rangeFloor</span><span style="color: Gray;"> = </span><span style="color: Blue;">rangeCeiling</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: Blue;">rangeCeiling</span><span style="color: Gray;"> = </span><span style="color: Blue;">temp</span><span style="color: Gray;">;&nbsp; </span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Olive;">}</span><span style="color: Gray;">&nbsp; </span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Green;">return</span><span style="color: Gray;">&nbsp;</span><span style="color: Green;">this</span><span style="color: Gray;">.</span><span style="color: Blue;">actual</span><span style="color: Gray;"> &gt; </span><span style="color: Blue;">rangeFloor</span><span style="color: Gray;"> &amp;&amp; </span><span style="color: Green;">this</span><span style="color: Gray;">.</span><span style="color: Blue;">actual</span><span style="color: Gray;"> &lt; </span><span style="color: Blue;">rangeCeiling</span><span style="color: Gray;">;&nbsp; </span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &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: Olive;">})</span><span style="color: Gray;">;&nbsp; </span></li>
<li><span style="color: Olive;">})</span><span style="color: Gray;">;</span></li></ol></div>
<p>这里面toBeBetween传入两个参数，上限和下限，然后函数体返回布尔来确定这个值是否在传入的上限和下限之间，接下来我们看下面的测试用例是如何使用以上的方法的：</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;">it</span><span style="color: Olive;">(</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">is between 5 and 30</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;">, </span><span style="color: Green;">function</span><span style="color: Gray;"> </span><span style="color: Olive;">()</span><span style="color: Gray;"> </span><span style="color: Olive;">{</span><span style="color: Gray;">&nbsp; </span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Blue;">expect</span><span style="color: Olive;">(</span><span style="color: Maroon;">10</span><span style="color: Olive;">)</span><span style="color: Gray;">.</span><span style="color: Blue;">toBeBetween</span><span style="color: Olive;">(</span><span style="color: Maroon;">5</span><span style="color: Gray;">, </span><span style="color: Maroon;">30</span><span style="color: Olive;">)</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: Blue;">it</span><span style="color: Olive;">(</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">is between 30 and 500</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;">, </span><span style="color: Green;">function</span><span style="color: Gray;">&nbsp;</span><span style="color: Olive;">()</span><span style="color: Gray;"> </span><span style="color: Olive;">{</span><span style="color: Gray;">&nbsp; </span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Blue;">expect</span><span style="color: Olive;">(</span><span style="color: Maroon;">100</span><span style="color: Olive;">)</span><span style="color: Gray;">.</span><span style="color: Blue;">toBeBetween</span><span style="color: Olive;">(</span><span style="color: Maroon;">500</span><span style="color: Gray;">, </span><span style="color: Maroon;">30</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>怎么样，很简单吧！这些就是SpecHelper.js这个文件做的，它还有很多其他的用处，有兴趣的话可以尝试阅读下它的源代码。</p>
<h4>结束语</h4>
<p>亲，jasmine这东西，真的很给力！上面的内容已经涵盖到jasmine的常用语法，其实还少了异步测试一块内容，这块内容后面由明河同学补充。<br />
jasmine的语法其实很简单，熟能生巧，希望这篇文章能起到抛砖引玉的作用。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.36ria.com/4473/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Jasmine入门教程—web前端开发七武器（上）</title>
		<link>http://www.36ria.com/4457</link>
		<comments>http://www.36ria.com/4457#comments</comments>
		<pubDate>Mon, 05 Sep 2011 13:44:48 +0000</pubDate>
		<dc:creator>明河</dc:creator>
				<category><![CDATA[前端开发工具]]></category>
		<category><![CDATA[Jasmine]]></category>
		<category><![CDATA[Jasmine教程]]></category>

		<guid isPermaLink="false">http://www.36ria.com/?p=4457</guid>
		<description><![CDATA[武器档案 名称：Jasmine 用途：javascript单元测试框架 下载：http://pivotal.github.com/jasmine/downloads/jasmine-standalone-1.1.0.rc1.zip 使用文档：http://github.com/pivotal/jasmine/wiki 必备指数： 使用难度： 页面前端逻辑复杂度与日俱增，前端工程师写出来的javascript变得庞大甚至臃肿，维护的难度不断加大，你需要一个javascript单元测试框架，用于降低维护javascript代码时的出错风险，保证重构后的代......]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.36ria.com/4457/jasmine-2" rel="attachment wp-att-4470"><img src="http://www.36ria.com/wp-content/uploads/2011/09/jasmine.png" alt="" title="jasmine" width="680" height="200" class="alignnone size-full wp-image-4470" /></a></p>
<h4>武器档案</h4>
<ul>
<li>名称：<a href="http://pivotal.github.com/jasmine/">Jasmine</a></li>
<li>用途：javascript单元测试框架</li>
<li>下载：<a href="http://pivotal.github.com/jasmine/downloads/jasmine-standalone-1.1.0.rc1.zip">http://pivotal.github.com/jasmine/downloads/jasmine-standalone-1.1.0.rc1.zip</a></li>
<li>使用文档：<a href="hhttp://github.com/pivotal/jasmine/wiki">http://github.com/pivotal/jasmine/wiki</a></li>
<li>必备指数：<img src="http://www.36ria.com/star.png" class="icon-star"></img><img src="http://www.36ria.com/star.png" class="icon-star"></img><img src="http://www.36ria.com/star.png" class="icon-star"></img></li>
<li>使用难度：<img src="http://www.36ria.com/star.png" class="icon-star"></img><img src="http://www.36ria.com/star.png" class="icon-star"></img><img src="http://www.36ria.com/star.png" class="icon-star"></img></li>
</ul>
<p>页面前端逻辑复杂度与日俱增，前端工程师写出来的javascript变得庞大甚至臃肿，维护的难度不断加大，你需要一个javascript单元测试框架，用于降低维护javascript代码时的出错风险，保证重构后的代码的兼容性，最重要的是减少人肉测试的过程，降低js代码维护成本。jasmine无疑是目前最优秀的javascript单元测试框架之一，目前淘宝UED正在使用，在易用性和质量上都非常不错。<br />
<strong>单元测试的核心任务是建议一套针对javascript代码的实例库</strong>（如果你愿意可以覆盖你写的javascript所有的类的方法！）。</p>
<ul class="tow-columns clearfix">
<li class="l"><a href="http://www.36ria.com/demo/tool/jasmine/SpecRunner.html" class="btn-view-demo" target="_blank">点此查看demo</a></li>
<li class="l"><a href="http://www.36ria.com/wp-content/plugins/download-monitor/download.php?id=222" title="名称：jasmine-demo，下载次数：73，文件大小：23.63 kB" class="btn-download">点此下载</a></li>
</ul>
<p>在jasmine的官网的第一行文字是“BDD for JavaScript”。</p>
<h5>什么是BDD呢？</h5>
<p>（PS:这部分内容很晦涩，不喜欢就直接跳过，不影响阅读。）<br />
说真得明河也是一知半解，全称是“behavior-driven development”，即行为驱动开发。百度百科有句解释，“是一种敏捷软件开发技术，鼓励开发人员、质量保证和非技术或商业参与者都参与到项目中来。”BDD更像是一种团队的约定，javascript单元测试，也许对于你本人（开发该脚本的前端）意义不是特别突出，但对于整个团队，整个项目来说就是一种财富。</p>
<h5>哪些是典型的BDD实践呢？</h5>
<ul>
<li>为不同利益相关者建立共有的可实施的目标期望。（Establishing the goals of different stakeholders required for a vision to be implemented）；</li>
<li>-_-！英语水平太差，不献丑了（Involving stakeholders in the implementation process through outside-in software development）；</li>
<li>使用例子去描述应用的行为或单元代码（Using examples to describe the behavior of the application, or of units of code）；</li>
<li>通过这些例子（单元测试）实现自动化的快速反馈和测试回归（Automating those examples to provide quick feedback and regression testing）。</li>
</ul>
<h4>1.学习jasmine的基础语法</h4>
<p>（ps：如果你熟悉Rspec（一个BDD测试框架），那么jasmine对于你来说非常容易，因为jasmine风格上很接近Rspec。）<br />
jasmine单元测试有二个核心的部分：<strong>describe </strong>函数块和<strong>it</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: #ffa500;">//建立个describe块</span></li>
<li><span style="color: Blue;">describe</span><span style="color: Olive;">(</span><span style="color: #8b0000;">'</span><span style="color: Red;">JavaScript addition operator</span><span style="color: #8b0000;">'</span><span style="color: Gray;">, </span><span style="color: Green;">function</span><span style="color: Gray;">&nbsp;</span><span style="color: Olive;">()</span><span style="color: Gray;"> </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;">//建立it块</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Blue;">it</span><span style="color: Olive;">(</span><span style="color: #8b0000;">'</span><span style="color: Red;">adds two numbers together</span><span style="color: #8b0000;">'</span><span style="color: Gray;">, </span><span style="color: Green;">function</span><span style="color: Gray;">&nbsp;</span><span style="color: Olive;">()</span><span style="color: Gray;"> </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;">//测试1+2是否等于3</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Blue;">expect</span><span style="color: Olive;">(</span><span style="color: Maroon;">1</span><span style="color: Gray;"> + </span><span style="color: Maroon;">2</span><span style="color: Olive;">)</span><span style="color: Gray;">.</span><span style="color: Blue;">toEqual</span><span style="color: Olive;">(</span><span style="color: Maroon;">3</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>describe和it函数都有二个参数：</p>
<ul>
<li>第一个参数：测试描述（一般使用英文，当然你使用中文也是完全没问题的）；</li>
<li>第二个参数：测试逻辑函数（具体干活的主）</li>
</ul>
<p>在it的函数块（第二个参数）内，你可以针对你要测试的javascript代码书写相应的测试代码，上面的代码有行“<strong>expect(1 + 2).toEqual(3); </strong>”，<strong>expect</strong>方法用于表明你测试的预期，<strong>toEqual</strong>是它的子方法，表示是否等于你的预期。所以这句代码可以翻译为，1 + 2等于3，如果等于3，那么it函数块测试通过，it测试通过，那么describe也就测试通过。<br />
it函数块可以包含多个expect过程，只要有其中的expect不符合期望，it就会测试不通过；而describe也可以包含多个it，只要有中有一个it报错，那么describe就会测试不通过。<br />
当然单纯的测试1+2是否等于3，完全没有意义，明河觉得单元测试的最主要作用在于对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: Green;">var</span><span style="color: Gray;"> </span><span style="color: Blue;">Select</span><span style="color: Gray;"> = </span><span style="color: Green;">function</span><span style="color: Olive;">(){</span></li>
<li><span style="color: Olive;">}</span><span style="color: Gray;">;</span></li>
<li><span style="color: Blue;">Select</span><span style="color: Gray;">.</span><span style="color: Blue;">prototype</span><span style="color: Gray;"> = </span><span style="color: Olive;">{</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Blue;">show</span><span style="color: Gray;"> : </span><span style="color: Green;">function</span><span style="color: Olive;">(){}</span><span style="color: Gray;">,</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Blue;">hide</span><span style="color: Gray;"> : </span><span style="color: Green;">function</span><span style="color: Olive;">(){}</span><span style="color: Gray;">,</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Blue;">change</span><span style="color: Gray;"> : </span><span style="color: Green;">function</span><span style="color: Olive;">(){}</span><span style="color: Gray;">,</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Blue;">width</span><span style="color: Gray;"> : </span><span style="color: Green;">function</span><span style="color: Olive;">(){}</span></li>
<li><span style="color: Olive;">}</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: Blue;">describe</span><span style="color: Olive;">(</span><span style="color: #8b0000;">'</span><span style="color: Red;">模拟选择框测试</span><span style="color: #8b0000;">'</span><span style="color: Gray;">, </span><span style="color: Green;">function</span><span style="color: Gray;"> </span><span style="color: Olive;">()</span><span style="color: Gray;"> </span><span style="color: Olive;">{</span><span style="color: Gray;">&nbsp;</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;">select</span><span style="color: Gray;"> = </span><span style="color: Green;">new</span><span style="color: Gray;"> </span><span style="color: Blue;">Select</span><span style="color: Olive;">()</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Blue;">it</span><span style="color: Olive;">(</span><span style="color: #8b0000;">'</span><span style="color: Red;">显示方法无误</span><span style="color: #8b0000;">'</span><span style="color: Gray;">, </span><span style="color: Green;">function</span><span style="color: Gray;">&nbsp;</span><span style="color: Olive;">()</span><span style="color: Gray;"> </span><span style="color: Olive;">{</span><span style="color: Gray;">&nbsp; </span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp;&nbsp; </span><span style="color: Blue;">expect</span><span style="color: Olive;">(</span><span style="color: Blue;">select</span><span style="color: Gray;">.</span><span style="color: Blue;">show</span><span style="color: Olive;">())</span><span style="color: Gray;">.</span><span style="color: Blue;">toEqual</span><span style="color: Olive;">(</span><span style="color: Green;">true</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;">;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Blue;">it</span><span style="color: Olive;">(</span><span style="color: #8b0000;">'</span><span style="color: Red;">隐藏方法无误</span><span style="color: #8b0000;">'</span><span style="color: Gray;">, </span><span style="color: Green;">function</span><span style="color: Gray;">&nbsp;</span><span style="color: Olive;">()</span><span style="color: Gray;"> </span><span style="color: Olive;">{</span><span style="color: Gray;">&nbsp; </span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp;&nbsp; </span><span style="color: Blue;">expect</span><span style="color: Olive;">(</span><span style="color: Blue;">select</span><span style="color: Gray;">.</span><span style="color: Blue;">hide</span><span style="color: Olive;">())</span><span style="color: Gray;">.</span><span style="color: Blue;">toEqual</span><span style="color: Olive;">(</span><span style="color: Green;">true</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; &nbsp; </span></li>
<li><span style="color: Olive;">})</span><span style="color: Gray;">;</span></li></ol></div>
<p>show、hide方法执行正确时返回true，这里明河隐去代码具体实现。<br />
当我下次重构select组件时，如果我漏写了hide方法或者把hide写成hidden，那么运行这个单元测试就会报错。当然也许你会说这个过程不是用肉眼就可以知晓吗？是的，明河不否认人地主观能动性的强大，但是思考个问题，如果你的类有很多方法，如果你需要知道方法各种调用的执行情况，那么人肉很容易出现纰漏。<br />
接下来我们来看个实际的使用jasmine的项目例子。</p>
<h4>2.如何在你的项目中应用jasmine？</h4>
<p>如果你下载了jasmine的源文件，那么结构应该是如下图所示：<br />
<a href="http://www.36ria.com/4457/2011-9-5-20-39-12" rel="attachment wp-att-4461"><img src="http://www.36ria.com/wp-content/uploads/2011/09/2011-9-5-20-39-12.png" alt="" title="2011-9-5 20-39-12" width="225" height="97" class="alignnone size-full wp-image-4461" /></a><br />
你可以运行下SpecRunner.html（实例页）体验下jasmine的测试界面，如下图：<br />
<a href="http://www.36ria.com/4457/2011-9-5-20-41-12" rel="attachment wp-att-4462"><img src="http://www.36ria.com/wp-content/uploads/2011/09/2011-9-5-20-41-12.png" alt="" title="2011-9-5 20-41-12" width="430" height="339" class="alignnone size-full wp-image-4462" /></a><br />
当测试用例的背景全部为绿色时，表示测试通过，红色出现时表示测试失败，代码有问题。<br />
SpecRunner.html是非常标准的单元测试，可以作为你项目测试页面模板。<br />
接下来我们以实例包为例，里面已经包含了jasmine的源码了。实例包的目录如下：<br />
<a href="http://www.36ria.com/4457/2011-9-5-20-47-32" rel="attachment wp-att-4463"><img src="http://www.36ria.com/wp-content/uploads/2011/09/2011-9-5-20-47-32.png" alt="" title="2011-9-5 20-47-32" width="246" height="99" class="alignnone size-full wp-image-4463" /></a><br />
打开实例包的SpecRunner.html。</p>
<h5>在测试页面中引入jasmine库</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;">link</span><span style="color: Gray;"> </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;">type</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">text/css</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;">spec/jasmine/jasmine.css</span><span style="color: #8b0000;">&quot;</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;">script</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;">text/javascript</span><span style="color: #8b0000;">&quot;</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;">spec/jasmine/jasmine.js</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: Gray;">&nbsp; </span><span style="color: Olive;">&lt;</span><span style="color: Green;">script</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;">text/javascript</span><span style="color: #8b0000;">&quot;</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;">spec/jasmine/jasmine-html.js</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>
<p>必须引入这三个文件！</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;">script</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: Gray;"> </span><span style="color: #00008b;">src</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">src/convert.js</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>在测试页面中引入单元测试代码</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;">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: Gray;"> </span><span style="color: #00008b;">src</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">spec/convertSpec.js</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>初始化jasmine</h5>
<p>通用的代码，copy到页面下即可。</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;">(</span><span style="color: Green;">function</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; </span><span style="color: Green;">var</span><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">jasmineEnv</span><span style="color: Gray;"> = </span><span style="color: Blue;">jasmine</span><span style="color: Gray;">.</span><span style="color: Blue;">getEnv</span><span style="color: Olive;">()</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; </span><span style="color: Blue;">jasmineEnv</span><span style="color: Gray;">.</span><span style="color: Blue;">updateInterval</span><span style="color: Gray;"> = </span><span style="color: Maroon;">1000</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; </span><span style="color: Green;">var</span><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">trivialReporter</span><span style="color: Gray;"> = </span><span style="color: Green;">new</span><span style="color: Gray;"> </span><span style="color: Blue;">jasmine</span><span style="color: Gray;">.</span><span style="color: Blue;">TrivialReporter</span><span style="color: Olive;">()</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; </span><span style="color: Blue;">jasmineEnv</span><span style="color: Gray;">.</span><span style="color: Blue;">addReporter</span><span style="color: Olive;">(</span><span style="color: Blue;">trivialReporter</span><span style="color: Olive;">)</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; </span><span style="color: Blue;">jasmineEnv</span><span style="color: Gray;">.</span><span style="color: Blue;">specFilter</span><span style="color: Gray;"> = </span><span style="color: Green;">function</span><span style="color: Olive;">(</span><span style="color: Blue;">spec</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;">return</span><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">trivialReporter</span><span style="color: Gray;">.</span><span style="color: Blue;">specFilter</span><span style="color: Olive;">(</span><span style="color: Blue;">spec</span><span style="color: Olive;">)</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; </span><span style="color: Olive;">}</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; </span><span style="color: Green;">var</span><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">currentWindowOnload</span><span style="color: Gray;"> = </span><span style="color: Teal;">window</span><span style="color: Gray;">.</span><span style="color: Blue;">onload</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; </span><span style="color: Teal;">window</span><span style="color: Gray;">.</span><span style="color: Blue;">onload</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;">if</span><span style="color: Gray;">&nbsp;</span><span style="color: Olive;">(</span><span style="color: Blue;">currentWindowOnload</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; </span><span style="color: Blue;">currentWindowOnload</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; &nbsp; &nbsp; </span><span style="color: Blue;">execJasmine</span><span style="color: Olive;">()</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; </span><span style="color: Olive;">}</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; </span><span style="color: Green;">function</span><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">execJasmine</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; </span><span style="color: Blue;">jasmineEnv</span><span style="color: Gray;">.</span><span style="color: Blue;">execute</span><span style="color: Olive;">()</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&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; </span><span style="color: Olive;">})()</span><span style="color: Gray;">;</span></li></ol></div>
<p>接下来你就可以自由的在convertSpec.js中书写单元测试代码。</p>
<h4>3.写测试用例？</h4>
<p>可以把每个it块当做一个解释类的方法用法的例子，而describe就像一部对类进行解释的说明书，也就是说可以把测试代码当做“文档”来读。</p>
<h5>建立describe</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: Blue;">describe</span><span style="color: Olive;">(</span><span style="color: Gray;"> </span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">Convert library</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;">, </span><span style="color: Green;">function</span><span style="color: Gray;"> </span><span style="color: Olive;">()</span><span style="color: Gray;"> </span><span style="color: Olive;">{</span><span style="color: Gray;">&nbsp; </span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Blue;">describe</span><span style="color: Olive;">(</span><span style="color: Gray;">&nbsp;</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">distance converter</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;">, </span><span style="color: Green;">function</span><span style="color: Gray;"> </span><span style="color: Olive;">()</span><span style="color: Gray;"> </span><span style="color: Olive;">{</span><span style="color: Gray;">&nbsp; </span></li>
<li><span style="color: Gray;">&nbsp; </span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Olive;">})</span><span style="color: Gray;">;&nbsp; </span></li>
<li><span style="color: Gray;">&nbsp; </span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Blue;">describe</span><span style="color: Olive;">(</span><span style="color: Gray;">&nbsp;</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">volume converter</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;">, </span><span style="color: Green;">function</span><span style="color: Gray;"> </span><span style="color: Olive;">()</span><span style="color: Gray;"> </span><span style="color: Olive;">{</span><span style="color: Gray;">&nbsp; </span></li>
<li><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>从上面的代码可以看出describe是可以嵌套的，（一般不会出现嵌套太多的情况）。<br />
这里的describe测试的是Convert library，即convert.js中的<strong>xConvert</strong>类（xConvert主要用于单位的转换）下的方法可用性。<br />
需要测试二方面的内容：distance converter（距离单位转换），volume converter（体积单位转换），所以我们创建了二个子<strong>describe</strong>。</p>
<h5>对xConvert的API进行测试</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: Blue;">describe</span><span style="color: Olive;">(</span><span style="color: Gray;"> </span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">distance converter</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;">, </span><span style="color: Green;">function</span><span style="color: Gray;"> </span><span style="color: Olive;">()</span><span style="color: Gray;"> </span><span style="color: Olive;">{</span><span style="color: Gray;">&nbsp; </span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Blue;">it</span><span style="color: Olive;">(</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">converts inches to centimeters</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;">, </span><span style="color: Green;">function</span><span style="color: Gray;">&nbsp;</span><span style="color: Olive;">()</span><span style="color: Gray;"> </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: Blue;">expect</span><span style="color: Olive;">(</span><span style="color: Blue;">Convert</span><span style="color: Olive;">(</span><span style="color: Maroon;">12</span><span style="color: Gray;">, </span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">in</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">)</span><span style="color: Gray;">.</span><span style="color: Blue;">to</span><span style="color: Olive;">(</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">cm</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">))</span><span style="color: Gray;">.</span><span style="color: Blue;">toEqual</span><span style="color: Olive;">(</span><span style="color: Maroon;">30.48</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; </span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Blue;">it</span><span style="color: Olive;">(</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">converts centimeters to yards</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;">, </span><span style="color: Green;">function</span><span style="color: Gray;">&nbsp;</span><span style="color: Olive;">()</span><span style="color: Gray;"> </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: Blue;">expect</span><span style="color: Olive;">(</span><span style="color: Blue;">Convert</span><span style="color: Olive;">(</span><span style="color: Maroon;">2000</span><span style="color: Gray;">, </span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">cm</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">)</span><span style="color: Gray;">.</span><span style="color: Blue;">to</span><span style="color: Olive;">(</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">yards</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">))</span><span style="color: Gray;">.</span><span style="color: Blue;">toEqual</span><span style="color: Olive;">(</span><span style="color: Maroon;">21.87</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>上面的代码提供了二个用例，将单位in转成cm，将cm转成yards，使用expect方法看结果是否符合预期，如果符合那么测试通过。<br />
通过上面的测试代码，我们可以阅读到二个信息：</p>
<ul>
<li>Convert函数有二个参数，第一个参数是数值型，为待转换的数字，第二个参数为单位；</li>
<li>Convert还有to字方法，用于转换成指定单位。</li>
</ul>
<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: Blue;">describe</span><span style="color: Olive;">(</span><span style="color: Gray;"> </span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">volume converter</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;">, </span><span style="color: Green;">function</span><span style="color: Gray;"> </span><span style="color: Olive;">()</span><span style="color: Gray;"> </span><span style="color: Olive;">{</span><span style="color: Gray;">&nbsp; </span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Blue;">it</span><span style="color: Olive;">(</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">converts litres to gallons</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;">, </span><span style="color: Green;">function</span><span style="color: Gray;">&nbsp;</span><span style="color: Olive;">()</span><span style="color: Gray;"> </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: Blue;">expect</span><span style="color: Olive;">(</span><span style="color: Blue;">Convert</span><span style="color: Olive;">(</span><span style="color: Maroon;">3</span><span style="color: Gray;">, </span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">litres</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">)</span><span style="color: Gray;">.</span><span style="color: Blue;">to</span><span style="color: Olive;">(</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">gallons</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">))</span><span style="color: Gray;">.</span><span style="color: Blue;">toEqual</span><span style="color: Olive;">(</span><span style="color: Maroon;">0.79</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; </span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Blue;">it</span><span style="color: Olive;">(</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">converts gallons to cups</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;">, </span><span style="color: Green;">function</span><span style="color: Gray;">&nbsp;</span><span style="color: Olive;">()</span><span style="color: Gray;"> </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: Blue;">expect</span><span style="color: Olive;">(</span><span style="color: Blue;">Convert</span><span style="color: Olive;">(</span><span style="color: Maroon;">2</span><span style="color: Gray;">, </span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">gallons</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">)</span><span style="color: Gray;">.</span><span style="color: Blue;">to</span><span style="color: Olive;">(</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">cups</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">))</span><span style="color: Gray;">.</span><span style="color: Blue;">toEqual</span><span style="color: Olive;">(</span><span style="color: Maroon;">32</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>代码跟距离转换非常类似就不再一一解释。<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;">it</span><span style="color: Olive;">(</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">throws an error when passed an unknown from-unit</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;">, </span><span style="color: Green;">function</span><span style="color: Gray;"> </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; </span><span style="color: Green;">var</span><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">testFn</span><span style="color: Gray;"> = </span><span style="color: Green;">function</span><span style="color: Gray;"> </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;">Convert</span><span style="color: Olive;">(</span><span style="color: Maroon;">1</span><span style="color: Gray;">, </span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">dollar</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">)</span><span style="color: Gray;">.</span><span style="color: Blue;">to</span><span style="color: Olive;">(</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">yens</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; &nbsp; &nbsp; </span><span style="color: Olive;">}</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Blue;">expect</span><span style="color: Olive;">(</span><span style="color: Blue;">testFn</span><span style="color: Olive;">)</span><span style="color: Gray;">.</span><span style="color: Blue;">toThrow</span><span style="color: Olive;">(</span><span style="color: Green;">new</span><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">Error</span><span style="color: Olive;">(</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">unrecognized from-unit</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;">it</span><span style="color: Olive;">(</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">throws an error when passed an unknown to-unit</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;">, </span><span style="color: Green;">function</span><span style="color: Gray;">&nbsp;</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; </span><span style="color: Green;">var</span><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">testFn</span><span style="color: Gray;"> = </span><span style="color: Green;">function</span><span style="color: Gray;"> </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;">Convert</span><span style="color: Olive;">(</span><span style="color: Maroon;">1</span><span style="color: Gray;">, </span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">cm</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">)</span><span style="color: Gray;">.</span><span style="color: Blue;">to</span><span style="color: Olive;">(</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">furlongs</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; &nbsp; &nbsp; </span><span style="color: Olive;">}</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Blue;">expect</span><span style="color: Olive;">(</span><span style="color: Blue;">testFn</span><span style="color: Olive;">)</span><span style="color: Gray;">.</span><span style="color: Blue;">toThrow</span><span style="color: Olive;">(</span><span style="color: Green;">new</span><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">Error</span><span style="color: Olive;">(</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">unrecognized to-unit</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></ol></div>
<p>如果你运行SpecRunner.html，那么页面将会出现如下错误！<br />
<a href="http://www.36ria.com/4457/2011-9-5-21-14-21" rel="attachment wp-att-4464"><img src="http://www.36ria.com/wp-content/uploads/2011/09/2011-9-5-21-14-21.png" alt="" title="2011-9-5 21-14-21" width="493" height="552" class="alignnone size-full wp-image-4464" /></a><br />
错误很明确的指向Convert变量未定义！！！好的，我们接下来打开src/convert.js，你就会发现变量错了！将xConvert改成Convert，你就会发现测试通过了！<br />
<a href="http://www.36ria.com/4457/2011-9-5-21-18-31" rel="attachment wp-att-4465"><img src="http://www.36ria.com/wp-content/uploads/2011/09/2011-9-5-21-18-31.png" alt="" title="2011-9-5 21-18-31" width="388" height="362" class="alignnone size-full wp-image-4465" /></a><br />
当然这个错误其实是人为制造的错误，而且代码偏简单。代码越复杂，越有必要进行单元测试，才能保证你日后维护时，整个类逻辑的正确性。</p>
<h5>下一篇将由苏河同学向大家讲解Jasmine的其他语法</h5>
]]></content:encoded>
			<wfw:commentRss>http://www.36ria.com/4457/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>前端中文原创推荐—梦里不知身是客一晌贪欢</title>
		<link>http://www.36ria.com/4451</link>
		<comments>http://www.36ria.com/4451#comments</comments>
		<pubDate>Fri, 02 Sep 2011 02:52:19 +0000</pubDate>
		<dc:creator>明河</dc:creator>
				<category><![CDATA[前端原创推荐]]></category>
		<category><![CDATA[前端中文原创推荐]]></category>

		<guid isPermaLink="false">http://www.36ria.com/?p=4451</guid>
		<description><![CDATA[（PS:最近很喜欢李煜的词，大爱这首《浪淘沙》，O(∩_∩)O哈！） 有段时间没推荐一些好的前端中文教程了，接下来的推荐地几篇教程，篇篇经典，不可错过。 1.用CSS3制作50个超棒动画效果教程 推荐指数： 博客：彬Go 2.js平滑的拖拽动画 推荐指数： 博客：前端乱炖 3.]避免常见的六种HTML5错误用法 推荐指数： 博客：UED TEAM,用户体验设计,web前端开发 4.]Firefox 4中javascript脚本执行......]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.36ria.com/4451/recommend" rel="attachment wp-att-4452"><img src="http://www.36ria.com/wp-content/uploads/2011/09/recommend.png" alt="" title="recommend" width="660" height="200" class="alignnone size-full wp-image-4452" /></a><br />
（PS:最近很喜欢李煜的词，大爱这首《浪淘沙》，O(∩_∩)O哈！）<br />
有段时间没推荐一些好的前端中文教程了，接下来的推荐地几篇教程，篇篇经典，不可错过。</p>
<h4>1.<a href="http://blog.bingo929.com/50-awesome-css3-animations.html" target="_blank">用CSS3制作50个超棒动画效果教程</a></h4>
<p><img alt="" src="http://blog.bingo929.com/wp-content/uploads/2010/03/css3-animations-title.jpg" class="alignnone" width="500" height="150" /></p>
<ul>
<li>推荐指数：<img class="icon-star" src="http://www.36ria.com/star.png" alt="" /><img class="icon-star" src="http://www.36ria.com/star.png" alt="" /><img class="icon-star" src="http://www.36ria.com/star.png" alt="" /><img class="icon-star" src="http://www.36ria.com/star.png" alt="" /><img class="icon-star" src="http://www.36ria.com/star.png" alt="" /></li>
<li>博客：<a href="http://blog.bingo929.com/">彬Go</a></li>
</ul>
<h4>2.<a href="http://www.html-js.com/?p=1232" target="_blank">js平滑的拖拽动画</a></h4>
<ul>
<li>推荐指数：<img class="icon-star" src="http://www.36ria.com/star.png" alt="" /><img class="icon-star" src="http://www.36ria.com/star.png" alt="" /><img class="icon-star" src="http://www.36ria.com/star.png" alt="" /><img class="icon-star" src="http://www.36ria.com/star.png" alt="" /><img class="icon-star" src="http://www.36ria.com/star.png" alt="" /></li>
<li>博客：<a href="http://www.html-js.com/">前端乱炖</a></li>
</ul>
<h4>3.<a href="http://www.ued163.com/?p=1820" target="_blank">]避免常见的六种HTML5错误用法</a></h4>
<ul>
<li>推荐指数：<img class="icon-star" src="http://www.36ria.com/star.png" alt="" /><img class="icon-star" src="http://www.36ria.com/star.png" alt="" /><img class="icon-star" src="http://www.36ria.com/star.png" alt="" /><img class="icon-star" src="http://www.36ria.com/star.png" alt="" /><img class="icon-star" src="http://www.36ria.com/star.png" alt="" /></li>
<li>博客：<a href="http://www.ued163.com/">UED TEAM,用户体验设计,web前端开发</a></li>
</ul>
<h4>4.<a href="http://www.f2e-arsenal.com/?p=303" target="_blank">]Firefox 4中javascript脚本执行的变化</a></h4>
<ul>
<li>推荐指数：<img class="icon-star" src="http://www.36ria.com/star.png" alt="" /><img class="icon-star" src="http://www.36ria.com/star.png" alt="" /><img class="icon-star" src="http://www.36ria.com/star.png" alt="" /><img class="icon-star" src="http://www.36ria.com/star.png" alt="" /></li>
<li>博客：<a href="http://www.f2e-arsenal.com/">前端开发兵工厂</a></li>
</ul>
<h4>5.<a href="http://www.y513.com/201108874.html" target="_blank">]ActionScript 3.0 事件机制</a></h4>
<ul>
<li>推荐指数：<img class="icon-star" src="http://www.36ria.com/star.png" alt="" /><img class="icon-star" src="http://www.36ria.com/star.png" alt="" /><img class="icon-star" src="http://www.36ria.com/star.png" alt="" /><img class="icon-star" src="http://www.36ria.com/star.png" alt="" /><img class="icon-star" src="http://www.36ria.com/star.png" alt="" /></li>
<li>博客：<a href="http://www.y513.com/">纸口杯</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.36ria.com/4451/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>认识基础任务标签（上）—ant入门指南（3）</title>
		<link>http://www.36ria.com/4442</link>
		<comments>http://www.36ria.com/4442#comments</comments>
		<pubDate>Tue, 30 Aug 2011 09:29:26 +0000</pubDate>
		<dc:creator>明河</dc:creator>
				<category><![CDATA[前端开发工具]]></category>
		<category><![CDATA[ant]]></category>
		<category><![CDATA[ant教程]]></category>
		<category><![CDATA[web前端开发七武器]]></category>

		<guid isPermaLink="false">http://www.36ria.com/?p=4442</guid>
		<description><![CDATA[前面二篇教程，主要讲解了ant的基础概念以及二个简单的实际demo，今天这篇文章，明河带大家认识下前端常用的几个ant常用任务标签。 1.concat：合并文件 concat标签非常常用，我们前端使用ant的一个核心任务，就是合并js/css文件以减少http请求。 1.1 concat的主要属性 属性 说明 destfile 合并后的文件的目标路径，包含文件名 overwrite 是否允许覆盖目标文件，默认是允许 outputencoding ......]]></description>
			<content:encoded><![CDATA[<p>前面二篇教程，主要讲解了ant的基础概念以及二个简单的实际demo，今天这篇文章，明河带大家认识下前端常用的几个ant常用任务标签。</p>
<h4>1.concat：合并文件</h4>
<p>concat标签非常常用，我们前端使用ant的一个核心任务，就是合并js/css文件以减少http请求。</p>
<h5>1.1 concat的主要属性</h5>
<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>destfile</strong></p>
</td>
<td valign="top">
<p>合并后的文件的目标路径，包含文件名</p>
</td>
</tr>
<tr>
<td valign="top">
<p><strong>overwrite</strong></p>
</td>
<td valign="top">
<p>是否允许覆盖目标文件，默认是允许</p>
</td>
</tr>
<tr>
<td valign="top">
<p><strong>outputencoding</strong></p>
</td>
<td valign="top">
<p>输出的目标文件的编码</p>
</td>
</tr>
</tbody>
</table>
<p>全部属性请看ant的英文文档。</p>
<h5>1.2 header子标签</h5>
<p>第二篇教程的demo，concat标签内有个header标签，这个标签是用来修改输出的目标文件的头部内容，比如你可以在目标前添加一行合并信息注释等，比如下面的代码：</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;">src/a_b.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;">header</span><span style="color: Gray;">&nbsp;</span><span style="color: #00008b;">trimleading</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">yes</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">&gt;</span><span style="color: Gray;">//合并自a.js和b.js</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Olive;">&lt;/</span><span style="color: Green;">header</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: Gray;">&nbsp;</span><span style="color: #00008b;">path</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">a.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: Gray;">&nbsp;</span><span style="color: #00008b;">path</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">b.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;">concat</span><span style="color: Olive;">&gt;</span></li></ol></div>
<p>header有个trimleading用于清理行空白的属性比较关键，其他属性明河也不太理解，旧不翻译了，有兴趣的看英文文档。</p>
<h5>1.3 concat的一些demo</h5>
<p><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: 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;">src/a_b.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: Gray;">&nbsp;</span><span style="color: #00008b;">path</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">a.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: Gray;">&nbsp;</span><span style="color: #00008b;">path</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">b.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;">concat</span><span style="color: Olive;">&gt;</span></li></ol></div>
<p>（PS:path子标签的作用在于指定文件路径。）<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: 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;">test.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;">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</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; </span><span style="color: Olive;">&lt;/</span><span style="color: Green;">concat</span><span style="color: Olive;">&gt;</span></li></ol></div>
<p>合并src目录下的所有文件，fileset这个标签非常重要，在讲解dataType时会重点说明。<br />
<strong>给目标文件增加文字：</strong><br />
利用header标签，demo已经贴出，不再重复贴出。</p>
<h4>2.mkdir：创建一个新的目录</h4>
<p>比较简单，只有一个属性<strong>dir</strong>，用来指定创建的目录路径，不只是名称哦。<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: Olive;">&lt;</span><span style="color: Green;">mkdir</span><span style="color: Gray;"> </span><span style="color: #00008b;">dir</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">${dist}/lib</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">/&gt;</span></li></ol></div>
<p>在${dist}（属性引用）下创建一个名为lib的目录。</p>
<h4>3.copy：复制指定文件到指定位置</h4>
<h5>3.1.copy主要属性</h5>
<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>file</strong></p>
</td>
<td valign="top">
<p>必有属性，用于复制的源文件，除非存在fileset等dataType</p>
</td>
</tr>
<tr>
<td valign="top">
<p><strong>tofile</strong></p>
</td>
<td valign="top">
<p>将文件复制到该路径</p>
</td>
</tr>
<tr>
<td valign="top">
<p><strong>todir</strong></p>
</td>
<td valign="top">
<p>将文件复制到该目录</p>
</td>
</tr>
<tr>
<td valign="top">
<p><strong>outputencoding</strong></p>
</td>
<td valign="top">
<p>目标文件的编码</p>
</td>
</tr>
</tbody>
</table>
<h5>3.2.copy的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;">copy</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;">a.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;">src/a.js</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">/&gt;</span></li></ol></div>
<p>将a.js文件复制到src目录下，这里你可以修改文件名哦。</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;">copy</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;">a</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;">src</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">/&gt;</span></li></ol></div>
<p>将a.js文件复制到src目录下。</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;">copy</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;">build</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;">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</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;">**/*.css</span><span style="color: #8b0000;">&quot;</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;">copy</span><span style="color: Olive;">&gt;</span></li></ol></div>
<p>将src的文件（排除css文件）复制到build目录下。excludes=”**/*.css”的含义在讲解fileset会说明。</p>
<h4>4.delete：删除指定文件（目录）</h4>
<h5>4.1.delete的主要属性</h5>
<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>file</strong></p>
</td>
<td valign="top">
<p>删除的目标文件</p>
</td>
</tr>
<tr>
<td valign="top">
<p><strong>dir</strong></p>
</td>
<td valign="top">
<p>删除的目标目录</p>
</td>
</tr>
<tr>
<td valign="top">
<p><strong>verbose</strong></p>
</td>
<td valign="top">
<p>是否显示每个删除的目标文件名称</p>
</td>
</tr>
<tr>
<td valign="top">
<p><strong>quiet</strong></p>
</td>
<td valign="top">
<p>当设置为true，删除的文件或目录出现错误时不抛出任何异常，正常情况下会有删除失败说明</p>
</td>
</tr>
</tbody>
</table>
<h5>4.2.delete的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;">delete</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;">/lib/ant.jar</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;">delete</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;">lib</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">/&gt;</span></li></ol></div>
<p>删除ant.jar文件和lib目录。</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;">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;">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;">.</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;">**/*.bak</span><span style="color: #8b0000;">&quot;</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;">delete</span><span style="color: Olive;">&gt;</span></li></ol></div>
<p>删除根目录下的所有后缀是.bak的文件。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.36ria.com/4442/feed</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>构建文件入门—ant入门指南（2）</title>
		<link>http://www.36ria.com/4436</link>
		<comments>http://www.36ria.com/4436#comments</comments>
		<pubDate>Fri, 26 Aug 2011 03:39:39 +0000</pubDate>
		<dc:creator>明河</dc:creator>
				<category><![CDATA[前端开发工具]]></category>
		<category><![CDATA[ant]]></category>
		<category><![CDATA[ant教程]]></category>
		<category><![CDATA[web前端开发七武器]]></category>

		<guid isPermaLink="false">http://www.36ria.com/?p=4436</guid>
		<description><![CDATA[上一篇的教程《ant入门指南—web前端开发七武器（1）》明河主要讲解了ant的安装，以及贴出了一个简单的demo，接下来我们来看下demo中的build.xml（构建文件）的含义。 1.什么是构建文件？ 构建文件是ant执行工程构建的入门文件，构建的所有任务都必须只能写在构建文件内，构建文件必须是符合标准的xml文件，默认的构建文件为build.xml，当你键入“ant”命名执行时，默认执行bui......]]></description>
			<content:encoded><![CDATA[<p>上一篇的教程<a href="http://www.36ria.com/4411">《ant入门指南—web前端开发七武器（1）》</a>明河主要讲解了ant的安装，以及贴出了一个简单的demo，接下来我们来看下demo中的build.xml（构建文件）的含义。</p>
<h4>1.什么是构建文件？</h4>
<p>构建文件是ant执行工程构建的入门文件，构建的所有任务都必须只能写在构建文件内，构建文件必须是符合标准的xml文件，默认的构建文件为build.xml，当你键入“ant”命名执行时，默认执行<strong>build.xml</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;">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;">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;">refund</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: 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: 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;">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>
<h5>关键点说明</h5>
<ul>
<li>第一行为xml声明，必须存在；</li>
<li>有且仅有一个<strong>project</strong>根标签；</li>
<li>default属性执行默认目标；</li>
<li>target（任务目标）；</li>
<li>task：任务，是构建文件的最小执行单位，是具体干活的标签；</li>
<li>property：特性，或理解为属性。</li>
</ul>
<h4>2.新的demo代码</h4>
<p>改变下上一篇的demo，增加点复杂点：创建一个src目录，将合并后的文件放在src目录下，并在合并后的文件内顶部添加一行自定义的合并注释。<br />
新的demo中的build.xml:</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;">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;">refund</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: 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;">concat.note</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;">//合并自a.js和b.js</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;">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;">echo</span><span style="color: Olive;">&gt;</span><span style="color: Gray;">生成src目录</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; </span><span style="color: Olive;">&lt;</span><span style="color: Green;">mkdir</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</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;">echo</span><span style="color: Olive;">&gt;</span><span style="color: Gray;">开始合并文件</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; </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;">src/a_b.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;">header</span><span style="color: Gray;">&nbsp;</span><span style="color: #00008b;">trimleading</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">yes</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">&gt;</span><span style="color: Gray;">${concat.note}</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Olive;">&lt;/</span><span style="color: Green;">header</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: Gray;">&nbsp;</span><span style="color: #00008b;">path</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">a.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: Gray;">&nbsp;</span><span style="color: #00008b;">path</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">b.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;">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: Olive;">&lt;/</span><span style="color: Green;">project</span><span style="color: Olive;">&gt;</span></li></ol></div>
<p>在“CMD”界面运行“ant”命令，结果如下：（请确保你的demo中有a.js和b.js）<br />
<a href="http://www.36ria.com/4436/2011-8-26-10-53-06" rel="attachment wp-att-4437"><img src="http://www.36ria.com/wp-content/uploads/2011/08/2011-8-26-10-53-06.png" alt="" title="2011-8-26 10-53-06" width="317" height="167" class="alignnone size-full wp-image-4437" /></a><br />
成功运行后你就会发现生成了一个src目录，目录下有个a_b.js文件，文件的第一行注释是//合并自a.js和b.js，完全符合我们构建要求！<br />
这个demo的代码会比上一篇教程复杂了不少，明河来逐个说明下。</p>
<h5>property标签</h5>
<p><strong>property</strong>标签为特性标签，你可以理解为编程语言中的属性或者变量，它起到的作用和变量是类似的，赋值后的property，可以在之后的目标任务内方便的引用。<br />
property有二种数据元素：</p>
<ul>
<li>以名—值对出现的简单数据定义形式，比如demo中的
<property name="concat.note" value="//合并自a.js和b.js" />；</li>
<li><strong>dataType</strong>复杂数据元素，比如fileset，日后会讲解到。</li>
</ul>
<p><strong>如何引用property呢？</strong><br />
非常简单，在你需要引用的地方使用<strong>${property名}</strong>即可，比如demo中的${concat.note}。<br />
<strong>property的location属性</strong><br />
property除了value属性外，还有个<strong>location</strong>属性，起到的作用类似，区别是location属性用来保存路径，location带了路径转换功能，会将路径转成绝对路径，如果你的路径是/，它会自动转换成\，这个属性日后会经常用到。比如下面的代码：</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;">property</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;">refund.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;">d:/ant-demo/</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;">refund.dir2</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;">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: Olive;">&gt;</span></li>
<li><span style="color: Gray;">&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;">${refund.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; </span><span style="color: Olive;">&lt;</span><span style="color: Green;">echo</span><span style="color: Olive;">&gt;</span><span style="color: Gray;">${refund.dir2}</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; </span><span style="color: Olive;">&lt;/</span><span style="color: Green;">target</span><span style="color: Olive;">&gt;</span></li></ol></div>
<p>看看输出结果，留意明河取的是代码片段，请根据实际情况做下修改。</p>
<h5>target标签</h5>
<p><strong>target</strong>标签非常的重要，“目标”标签可以理解为一系列任务标签的容器，是对任务的隐式说明，构建文件允许出现多个target，明河的建议是使用更细的target，比如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;">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;">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;">refund</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: 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;">concat.note</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;">//合并自a.js和b.js</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;">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;">mkdir,concat</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: 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;">mkdir</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;">echo</span><span style="color: Olive;">&gt;</span><span style="color: Gray;">生成src目录</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; </span><span style="color: Olive;">&lt;</span><span style="color: Green;">mkdir</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</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: 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;">echo</span><span style="color: Olive;">&gt;</span><span style="color: Gray;">开始合并文件</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; </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;">src/a_b.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;">header</span><span style="color: Gray;">&nbsp;</span><span style="color: #00008b;">trimleading</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">yes</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">&gt;</span><span style="color: Gray;">${concat.note}</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Olive;">&lt;/</span><span style="color: Green;">header</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: Gray;">&nbsp;</span><span style="color: #00008b;">path</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">a.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: Gray;">&nbsp;</span><span style="color: #00008b;">path</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">b.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;">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: Olive;">&lt;/</span><span style="color: Green;">project</span><span style="color: Olive;">&gt;</span></li></ol></div>
<p>这里明河将一个target拆成了多个target，留意属性depends。<br />
depends用于处理目标依赖，比如这里“build”依赖于“mkdir”和“concat”目标，那么ant会优先执行“mkdir”和“concat”然后才执行“build”。这种依赖机制是ant非常重要的处理模式！体现出ant的灵活性！</p>
<h5>task任务标签</h5>
<p>任务是ant构建文件的最小构建块，是构建的实施者，demo中的echo、<strong>concat</strong>都是任务标签，那么ant能完成多少个任务呢，或者说ant有多少构建功能呢？<a href="http://ant.apache.org/manual/index.html">请猛击这里查看</a>，（有个task list）。看了这个任务清单，我想你可以体会到ant究竟有多强大！<br />
明河不会对所有的任务标签进行讲解，只讲解前端常用的几个关键任务标签，今天先到这里，下一篇教程将详细讲解concat、mkdir、copy等标签用法。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.36ria.com/4436/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>firefox常用快捷键集合</title>
		<link>http://www.36ria.com/4407</link>
		<comments>http://www.36ria.com/4407#comments</comments>
		<pubDate>Tue, 23 Aug 2011 01:30:53 +0000</pubDate>
		<dc:creator>明河</dc:creator>
				<category><![CDATA[浏览器]]></category>
		<category><![CDATA[firefox]]></category>
		<category><![CDATA[firefox快捷键]]></category>

		<guid isPermaLink="false">http://www.36ria.com/?p=4407</guid>
		<description><![CDATA[firefox是明河用于前端开发时主要使用的浏览器，调试必然讲究效率，所以收集以下常用的firefox快捷键，以备自己日后翻用。 常用指数： 快捷键 说明 Ctrl + Tab 切换标签页（从左向右） Ctrl + Shift + Tab 切换标签页（从右向左） Alt + D 移动光标至地址栏 Ctrl + E 移动光标至搜索栏 Ctrl + U 查看源文件 ALT + F4 关闭当前浏览器 ctrl + T 新建一个tab ctrl + W 关闭一个tab Ctrl + F 打开查找栏 / 快......]]></description>
			<content:encoded><![CDATA[<p>firefox是明河用于前端开发时主要使用的浏览器，调试必然讲究效率，所以收集以下常用的firefox快捷键，以备自己日后翻用。</p>
<h4>常用指数：<img src="http://www.36ria.com/star.png" class="icon-star"></img><img src="http://www.36ria.com/star.png" class="icon-star"></img><img src="http://www.36ria.com/star.png" class="icon-star"></img><img src="http://www.36ria.com/star.png" class="icon-star"></img><img src="http://www.36ria.com/star.png" class="icon-star"></img></h4>
<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>Ctrl + Tab</strong></p>
</td>
<td valign="top">
<p>切换标签页（从左向右）</p>
</td>
</tr>
<tr>
<td valign="top">
<p><strong>Ctrl + Shift + Tab</strong></p>
</td>
<td valign="top">
<p>切换标签页（从右向左）</p>
</td>
</tr>
<tr>
<td valign="top">
<p><strong>Alt + D</strong></p>
</td>
<td valign="top">
<p>移动光标至地址栏</p>
</td>
</tr>
<tr>
<td valign="top">
<p><strong>Ctrl + E</strong></p>
</td>
<td valign="top">
<p>移动光标至搜索栏</p>
</td>
</tr>
<tr>
<td valign="top">
<p><strong>Ctrl + U</strong></p>
</td>
<td valign="top">
<p>查看源文件</p>
</td>
</tr>
<tr>
<td valign="top">
<p><strong>ALT + F4</strong></p>
</td>
<td valign="top">
<p>关闭当前浏览器</p>
</td>
</tr>
<tr>
<td valign="top">
<p><strong>ctrl + T</strong></p>
</td>
<td valign="top">
<p>新建一个tab</p>
</td>
</tr>
<tr>
<td valign="top">
<p><strong>ctrl + W</strong></p>
</td>
<td valign="top">
<p>关闭一个tab</p>
</td>
</tr>
<tr>
<td valign="top">
<p><strong>Ctrl + F</strong></p>
</td>
<td valign="top">
<p>打开查找栏</p>
</td>
</tr>
<tr>
<td valign="top">
<p><strong>/</strong></p>
</td>
<td valign="top">
<p>快速查找</p>
</td>
</tr>
<tr>
<td valign="top">
<p><strong>F5</strong></p>
</td>
<td valign="top">
<p>刷新</p>
</td>
</tr>
</tbody>
</table>
<h4>常用指数：<img src="http://www.36ria.com/star.png" class="icon-star"></img><img src="http://www.36ria.com/star.png" class="icon-star"></img><img src="http://www.36ria.com/star.png" class="icon-star"></img><img src="http://www.36ria.com/star.png" class="icon-star"></img></h4>
<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>End</strong></p>
</td>
<td valign="top">
<p>到页面底部</p>
</td>
</tr>
<tr>
<td valign="top">
<p><strong>Home</strong></p>
</td>
<td valign="top">
<p>到页面顶部</p>
</td>
</tr>
<tr>
<td valign="top">
<p><strong>Ctrl++</strong></p>
</td>
<td valign="top">
<p>放大文字</p>
</td>
</tr>
<tr>
<td valign="top">
<p><strong>Ctrl+-</strong></p>
</td>
<td valign="top">
<p>缩小文字</p>
</td>
</tr>
<tr>
<td valign="top">
<p><strong>Ctrl+0</strong></p>
</td>
<td valign="top">
<p>恢复文本大小</p>
</td>
</tr>
<tr>
<td valign="top">
<p><strong>Ctrl+[1 到 8]</strong></p>
</td>
<td valign="top">
<p>选择标签页 [1 to 8]</p>
</td>
</tr>
<tr>
<td valign="top">
<p><strong>Ctrl+9</strong></p>
</td>
<td valign="top">
<p>选择最后标签页</p>
</td>
</tr>
<tr>
<td valign="top">
<p><strong>ctrl + D</strong></p>
</td>
<td valign="top">
<p>加入收藏夹</p>
</td>
</tr>
<tr>
<td valign="top">
<p><strong></strong></p>
</td>
<td valign="top">
</td>
</tr>
<tr>
<td valign="top">
<p><strong>Ctrl + Page Up</strong></p>
</td>
<td valign="top">
<p>激活左边一个标签页</p>
</td>
</tr>
<tr>
<td valign="top">
<p><strong>Ctrl + Page Down</strong></p>
</td>
<td valign="top">
<p> 激活右边一个标签页</p>
</td>
</tr>
<tr>
<td valign="top">
<p><strong>Ctrl + Shift + J</strong></p>
</td>
<td valign="top">
<p>Firefox的错误控制台</p>
</td>
</tr>
</tbody>
</table>
]]></content:encoded>
			<wfw:commentRss>http://www.36ria.com/4407/feed</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>ant入门指南—web前端开发七武器（1）</title>
		<link>http://www.36ria.com/4411</link>
		<comments>http://www.36ria.com/4411#comments</comments>
		<pubDate>Sun, 21 Aug 2011 12:51:58 +0000</pubDate>
		<dc:creator>明河</dc:creator>
				<category><![CDATA[前端开发工具]]></category>
		<category><![CDATA[ant]]></category>
		<category><![CDATA[ant教程]]></category>
		<category><![CDATA[web前端开发七武器]]></category>

		<guid isPermaLink="false">http://www.36ria.com/?p=4411</guid>
		<description><![CDATA[武器档案 名称：apache ant 最新版本：1.8.2 用途：文件构建工具 下载：http://labs.renren.com/apache-mirror//ant/binaries/apache-ant-1.8.2-bin.zip ant使用文档：http://ant.apache.org/manual/index.html 必备指数： 使用难度： ant作为目前中国最受欢迎的开源构建工具，广泛应用于java工程构建。也许你会感到很疑惑，js作为动态语言，并不需要编译过程，为什么需要ant这样的构建工具呢？ant能够帮助前端工......]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.36ria.com/4411/ant-3" rel="attachment wp-att-4420"><img src="http://www.36ria.com/wp-content/uploads/2011/08/ant1.png" alt="" title="ant" width="680" height="200" class="alignnone size-full wp-image-4420" /></a></p>
<h4>武器档案</h4>
<ul>
<li>名称：<a href="http://ant.apache.org/">apache ant</a></li>
<li>最新版本：1.8.2</li>
<li>用途：文件构建工具</li>
<li>下载：<a href="http://labs.renren.com/apache-mirror//ant/binaries/apache-ant-1.8.2-bin.zip">http://labs.renren.com/apache-mirror//ant/binaries/apache-ant-1.8.2-bin.zip</a></li>
<li>ant使用文档：<a href="http://ant.apache.org/manual/index.html">http://ant.apache.org/manual/index.html</a></li>
<li>必备指数：<img src="http://www.36ria.com/star.png" class="icon-star"></img><img src="http://www.36ria.com/star.png" class="icon-star"></img><img src="http://www.36ria.com/star.png" class="icon-star"></img><img src="http://www.36ria.com/star.png" class="icon-star"></img></li>
<li>使用难度：<img src="http://www.36ria.com/star.png" class="icon-star"></img><img src="http://www.36ria.com/star.png" class="icon-star"></img><img src="http://www.36ria.com/star.png" class="icon-star"></img></li>
</ul>
<p>ant作为目前中国最受欢迎的开源构建工具，广泛应用于java工程构建。也许你会感到很疑惑，js作为动态语言，并不需要编译过程，为什么需要ant这样的构建工具呢？ant能够帮助前端工程师解决那些问题呢？采用ant构建js和css的优点和缺点是什么呢？如何使用ant呢？这些问题在这个系列教程中明河将一一解答。</p>
<h4>1.为什么前端工程师需要ant？</h4>
<p>来看个经典的应用场景：<br />
在你的页面中需要引用不少的jquery插件，比如plug-1.js、plug-2.js、plug-3.js&#8230;yslow关于前端性能优化的第一建议就是页面应该保持尽量少的js和css引用。明显这个场景违背了这个建议，所以我们需要合并这些js插件，合并成plug-combine.js文件，传统的做法是人肉合并，以前明河也是这么干的，但遇到了如下烦恼，plug-1.js是自己写的插件，经常要更新这个文件的代码，每次更新完都要重新人肉更新下plug-combine.js，作为一个懒人，明河在想，“有没有一个工具可以帮我自动合并文件呢？当然合并后能够自动调用压缩工具压缩文件就更棒了！”。ant这个神奇的小工具就是用来帮前端偷这样的懒的！</p>
<h5>ant能帮前端干些什么呢？</h5>
<ul>
<li>合并js/css文件；</li>
<li>调用YUI Compressor自动压缩css文件，调用Google Closure Compiler自动压缩js；</li>
<li>快速批量复制/删除指定文件；</li>
<li>调用jsDoc工具，自动生成js文档；</li>
<li>连接FTP，将代码快速发布到指定服务器；</li>
<li>将文件自动上传到svn上；</li>
<li>自动打包成zip文件</li>
<li>&#8230;</li>
</ul>
<p>ant提供了一整套的任务列表帮你从重复耗时的构建流程中解脱出来！看到ant这只神奇的蚂蚁能做如此多的事，心动了吗？那么跟着明河来学学如何使用ant。<br />
明河要强调的一点是<strong>ant很简单</strong>，只要你有足够的耐心，你一个在1天内掌握其使用方法。</p>
<h4>2.安装ant</h4>
<h5>1)下载<a href="http://labs.renren.com/apache-mirror//ant/binaries/apache-ant-1.8.2-bin.zip">ant</a>（好吧，这是废话-_-!）</h5>
<p>你下载下来的ant，应该包含如下文件：<br />
<a href="http://www.36ria.com/4411/ant-files" rel="attachment wp-att-4412"><img src="http://www.36ria.com/wp-content/uploads/2011/08/ant-files.png" alt="" title="ant-files" width="430" height="387" class="alignnone size-full wp-image-4412" /></a></p>
<h5>2)安装java运行环境</h5>
<p>ant是java程序，所以依赖于java运行环境，如果你的机子已经安装JDK，那么请跳过这一步，如果没有请先下载JDK，<a href="http://www.oracle.com/technetwork/java/javase/downloads/index.html">传送门在此</a>。<br />
（PS:请运行“CMD”，然后键入“javac”，如果出现如下界面说明java环境OK。）<br />
<a href="http://www.36ria.com/4411/javac" rel="attachment wp-att-4414"><img src="http://www.36ria.com/wp-content/uploads/2011/08/javac.png" alt="" title="javac" width="422" height="230" class="alignnone size-full wp-image-4414" /></a><br />
如果出现“&#8217;javac&#8217; 不是内部或外部命令，也不是可运行的程序或批处理文件。”，那么请设置下java环境变量。<br />
设置方法参见，明河之前写的<a href="http://www.36ria.com/3948">《YUI Compressor快速使用指南—web前端开发七武器》</a>，这里不再累述。</p>
<h5>3)配置环境变量</h5>
<p>右击“计算机”，点击“系统设置”，出现如下界面：<br />
<a href="http://www.36ria.com/4411/environment" rel="attachment wp-att-4413"><img src="http://www.36ria.com/wp-content/uploads/2011/08/environment.png" alt="" title="environment" width="600" height="545" class="alignnone size-full wp-image-4413" /></a><br />
新建系统变量,变量名：<strong>ANT_HOME</strong>，变量值：d:\soft\ant，变量值指向你本机ant的解压目录，请勿直接copy这个变量值。<br />
<a href="http://www.36ria.com/4411/ant%e2%80%94%e2%80%94home" rel="attachment wp-att-4415"><img src="http://www.36ria.com/wp-content/uploads/2011/08/ant——home.png" alt="" title="ant——home" width="362" height="140" class="alignnone size-full wp-image-4415" /></a><br />
修改变量：<strong>path</strong>，在最后添加：%ANT_HOME%\bin;<br />
<a href="http://www.36ria.com/4411/ant-2" rel="attachment wp-att-4416"><img src="http://www.36ria.com/wp-content/uploads/2011/08/ant.png" alt="" title="ant" width="365" height="150" class="alignnone size-full wp-image-4416" /></a></p>
<h5>4)试运行ant</h5>
<p>在”CMD”界面，输入“ant”，如果出现以下内容，说明配置成功！<br />
<a href="http://www.36ria.com/4411/ant-2-2" rel="attachment wp-att-4417"><img src="http://www.36ria.com/wp-content/uploads/2011/08/ant-2.png" alt="" title="ant-2" width="334" height="86" class="alignnone size-full wp-image-4417" /></a></p>
<h4>3.ant版的hello world！</h4>
<p>在d盘新建个<strong>ant-demo</strong>的目录。<br />
在该目录下新建个build.xml，代码如下：</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;">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;">refund</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: 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: Olive;">&gt;</span></li>
<li><span style="color: Gray;">&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;">Hello world!</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; </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;">a_b.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: Gray;">&nbsp;</span><span style="color: #00008b;">path</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">a.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: Gray;">&nbsp;</span><span style="color: #00008b;">path</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">b.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;">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: Olive;">&lt;/</span><span style="color: Green;">project</span><span style="color: Olive;">&gt;</span></li></ol></div>
<p>再准备二个用于合并的js文件，比如a.js和b.js，（随便在二个文件中加些js代码）。<br />
进入cmd界面，敲入ant，留意必须先将目录指向build.xml的根目录。<br />
<a href="http://www.36ria.com/4411/ant-hello" rel="attachment wp-att-4423"><img src="http://www.36ria.com/wp-content/uploads/2011/08/ant-hello.png" alt="" title="ant-hello" width="514" height="329" class="alignnone size-full wp-image-4423" /></a><br />
你将成功输出a_b.js文件，目录结构如下;<br />
<a href="http://www.36ria.com/4411/ant-files-2" rel="attachment wp-att-4419"><img src="http://www.36ria.com/wp-content/uploads/2011/08/ant-files-2.png" alt="" title="ant-files-2" width="219" height="145" class="alignnone size-full wp-image-4419" /></a><br />
build.xml中的代码是什么意思呢？别急，下一篇教程明河将讲解ant的build文件。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.36ria.com/4411/feed</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>ajax异步文件上传原理解析</title>
		<link>http://www.36ria.com/4397</link>
		<comments>http://www.36ria.com/4397#comments</comments>
		<pubDate>Sun, 07 Aug 2011 07:32:09 +0000</pubDate>
		<dc:creator>明河</dc:creator>
				<category><![CDATA[javascript教程]]></category>
		<category><![CDATA[javasctipt教程]]></category>
		<category><![CDATA[多选文件上传]]></category>
		<category><![CDATA[异步文件上传]]></category>

		<guid isPermaLink="false">http://www.36ria.com/?p=4397</guid>
		<description><![CDATA[（PS:由于上传文件会给服务器造成负担，这里明河就不将demo上传，请自行在本地服务器测试demo。） 有一段时间没发文章了，明河手上项目太紧了，终于快临近发布了，偷闲跟大家分享下ajax异步文件上传原理，前段时间一直在捣鼓异步文件上传，也算颇有心得，以前也写过flash文件上传组件，有兴趣的朋友可以看yijs.File，早期作品，代码比较粗糙，最近又写了二个异步文件上......]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.36ria.com/4397/ajax-uploader" rel="attachment wp-att-4398"><img src="http://www.36ria.com/wp-content/uploads/2011/08/ajax-uploader.png" alt="" title="ajax-uploader" width="680" height="200" class="alignnone size-full wp-image-4398" /></a></p>
<ul class="tow-columns clearfix">
<li class="l"></li>
<li class="l"><a href="http://www.36ria.com/wp-content/plugins/download-monitor/download.php?id=221" title="名称：ajax异步文件上传原理解析，下载次数：216，文件大小：352.85 kB" class="btn-download">点此下载</a></li>
</ul>
<p>（PS:由于上传文件会给服务器造成负担，这里明河就不将demo上传，请自行在本地服务器测试demo。）<br />
有一段时间没发文章了，明河手上项目太紧了，终于快临近发布了，偷闲跟大家分享下ajax异步文件上传原理，前段时间一直在捣鼓异步文件上传，也算颇有心得，以前也写过flash文件上传组件，有兴趣的朋友可以看<a href="http://www.36ria.com/1227" title="yijs.File — 基于flash多文件上传组件（明河作品）" target="_blank">yijs.File</a>，早期作品，代码比较粗糙，最近又写了二个异步文件上传组件，一个是基于iframe，一个是基于flash，都是基于KISSY1.2，日后会放出。言归正传，今天来谈下ajax异步文件上传的原理。<br />
（PS:英文原文可以看<a href="http://net.tutsplus.com/tutorials/javascript-ajax/uploading-files-with-ajax/" target="_blank">《Uploading Files with AJAX》</a>）。</p>
<h4>1.在demo中我们要实现的功能</h4>
<ul>
<li>异步上传文件（支持多选上传）</li>
<li>可以即时预览图片</li>
</ul>
<h4>2.通过这篇教程你将学会什么？</h4>
<ul>
<li>ajax异步文件上传的核心原理</li>
<li>新的文件API：<a href="http://www.w3.org/TR/FileAPI/" target="_blank">FileReader</a>对象的用法；</li>
<li><a href="http://www.w3.org/TR/XMLHttpRequest2/#the-formdata-interface" target="_blank">FormData</a>对象的用法（这是XMLHttpRequest2的内容）。</li>
</ul>
<p>很遗憾的是IE对FileReader和FormData并不支持（包括IE9），所以文中的方案有兼容性问题，想要实现全兼容的文件上传（包括图片预览），还需要其他技巧，以后讲解明河完成的异步上传组件时会说明。<br />
（PS：Opera目前不支持FormData对象，请在firefox和chrome下浏览demo。）</p>
<h4>3.构建图片上传表单</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;">form</span><span style="color: Gray;"> </span><span style="color: #00008b;">method</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">post</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;"> </span><span style="color: #00008b;">enctype</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">multipart/form-data</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;">&nbsp; </span><span style="color: #00008b;">action</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">upload.php</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;">input</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;">file</span><span style="color: #8b0000;">&quot;</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;">images</span><span style="color: #8b0000;">&quot;</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;">images</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: 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;">button</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;">submit</span><span style="color: #8b0000;">&quot;</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;">btn</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">&gt;</span><span style="color: Gray;">Upload Files!</span><span style="color: Olive;">&lt;/</span><span style="color: Green;">button</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;">form</span><span style="color: Olive;">&gt;</span></li></ol></div>
<p>想要实现异步文件上传的第一个关键步骤，给form增加<strong>enctype=”multipart/form-data”</strong>属性，这个属性非常关键，缺少这个属性，将直接提交表单。<br />
<strong>action</strong>属性指向处理文件上传数据的服务器端路径。<br />
多选上传的关键是在上传框上加<strong>multiple</strong>属性。 </p>
<h4>4.upload.php</h4>
<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;">&lt;?php</span></li>
<li><span style="color: Gray;">&nbsp;</span></li>
<li><span style="color: Green;">foreach</span><span style="color: Gray;">&nbsp;</span><span style="color: Olive;">(</span><span style="color: #00008b;">$_FILES</span><span style="color: Olive;">[</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">images</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">][</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">error</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">]</span><span style="color: Gray;"> </span><span style="color: Green;">as</span><span style="color: Gray;"> </span><span style="color: #00008b;">$key</span><span style="color: Gray;"> =&gt; </span><span style="color: #00008b;">$error</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;">if</span><span style="color: Gray;">&nbsp;</span><span style="color: Olive;">(</span><span style="color: #00008b;">$error</span><span style="color: Gray;"> == </span><span style="color: Blue;">UPLOAD_ERR_OK</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; </span><span style="color: #00008b;">$name</span><span style="color: Gray;"> = </span><span style="color: #00008b;">$_FILES</span><span style="color: Olive;">[</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">images</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">][</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">name</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">][</span><span style="color: #00008b;">$key</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;">move_uploaded_file</span><span style="color: Olive;">(</span><span style="color: Gray;">&nbsp;</span><span style="color: #00008b;">$_FILES</span><span style="color: Olive;">[</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">images</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">][</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">tmp_name</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">][</span><span style="color: #00008b;">$key</span><span style="color: Olive;">]</span><span style="color: Gray;">, </span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">uploads/</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;"> . </span><span style="color: #00008b;">$_FILES</span><span style="color: Olive;">[</span><span style="color: #8b0000;">'</span><span style="color: Red;">images</span><span style="color: #8b0000;">'</span><span style="color: Olive;">][</span><span style="color: #8b0000;">'</span><span style="color: Red;">name</span><span style="color: #8b0000;">'</span><span style="color: Olive;">][</span><span style="color: #00008b;">$key</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>
<li><span style="color: Green;">echo</span><span style="color: Gray;">&nbsp;</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">&lt;h2&gt;文件成功上传！&lt;/h2&gt;</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;">;</span></li></ol></div>
<p>这段php脚本做了非常多的简化，比如缺少文件大小限制、文件去重、用户限制等一系列安全处理。<br />
<strong>$_FILES</strong>这个关联数组存放着文件数据，是处理的关键，有不清楚的朋友可以看php手册，这里不再累述，毕竟不是本文讲解重点。</p>
<h4>5.监听上传框的change事件</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: Green;">var</span><span style="color: Gray;"> </span><span style="color: Blue;">input</span><span style="color: Gray;"> = </span><span style="color: Teal;">document</span><span style="color: Gray;">.</span><span style="color: Blue;">getElementById</span><span style="color: Olive;">(</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">images</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">)</span><span style="color: Gray;">;</span></li>
<li><span style="color: Blue;">input</span><span style="color: Gray;">.</span><span style="color: Blue;">addEventListener</span><span style="color: Olive;">(</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">change</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;">, </span><span style="color: Green;">function</span><span style="color: Gray;">&nbsp;</span><span style="color: Olive;">(</span><span style="color: Blue;">evt</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;">files</span><span style="color: Gray;"> = </span><span style="color: Green;">this</span><span style="color: Gray;">.</span><span style="color: Blue;">files</span><span style="color: Gray;">; </span></li>
<li><span style="color: Olive;">})</span></li></ol></div>
<p>留意这里的this.files，files数组将存储你上传的文件信息，即使只上传1张图片，也是数组形式出现。<br />
<a href="http://www.36ria.com/4397/files" rel="attachment wp-att-4401"><img src="http://www.36ria.com/wp-content/uploads/2011/08/files.png" alt="" title="files" width="389" height="295" class="alignnone size-full wp-image-4401" /></a></p>
<h4>6.利用FileReader将图片显示到页面上</h4>
<p>关于FileReader，w3c有非常详细的说明，<a href="http://www.w3.org/TR/FileAPI/" target="_blank">传送门点此</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: #ffa500;">//遍历文件</span></li>
<li><span style="color: Green;">for</span><span style="color: Gray;">&nbsp;</span><span style="color: Olive;">(</span><span style="color: Gray;"> ; </span><span style="color: Blue;">i</span><span style="color: Gray;"> &lt; </span><span style="color: Blue;">len</span><span style="color: Gray;">; </span><span style="color: Blue;">i</span><span style="color: Gray;">++ </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: Blue;">file</span><span style="color: Gray;"> = </span><span style="color: Green;">this</span><span style="color: Gray;">.</span><span style="color: Blue;">files</span><span style="color: Olive;">[</span><span style="color: Blue;">i</span><span style="color: Olive;">]</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: #ffa500;">//文件类型为图片</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Green;">if</span><span style="color: Gray;">&nbsp;</span><span style="color: Olive;">(</span><span style="color: Gray;">!!</span><span style="color: Blue;">file</span><span style="color: Gray;">.</span><span style="color: Blue;">type</span><span style="color: Gray;">.</span><span style="color: Blue;">match</span><span style="color: Olive;">(</span><span style="color: #8b0000;">/</span><span style="color: Red;">image.*</span><span style="color: #8b0000;">/</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; </span><span style="color: #ffa500;">//浏览器支持FileReader对象</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Green;">if</span><span style="color: Gray;">&nbsp;</span><span style="color: Olive;">(</span><span style="color: Gray;"> </span><span style="color: Teal;">window</span><span style="color: Gray;">.</span><span style="color: Blue;">FileReader</span><span style="color: Gray;"> </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;">reader</span><span style="color: Gray;"> = </span><span style="color: Green;">new</span><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">FileReader</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: #ffa500;">//监听文件读取结束后事件</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Blue;">reader</span><span style="color: Gray;">.</span><span style="color: Blue;">onloadend</span><span style="color: Gray;"> = </span><span style="color: Green;">function</span><span style="color: Gray;">&nbsp;</span><span style="color: Olive;">(</span><span style="color: Blue;">e</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; </span><span style="color: #ffa500;">//将图片添加到显示列表</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Blue;">showUploadedItem</span><span style="color: Olive;">(</span><span style="color: Blue;">e</span><span style="color: Gray;">.</span><span style="color: Blue;">target</span><span style="color: Gray;">.</span><span style="color: Blue;">result</span><span style="color: Gray;">, </span><span style="color: Blue;">file</span><span style="color: Gray;">.</span><span style="color: Blue;">fileName</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: Olive;">}</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: #ffa500;">//读取文件</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Blue;">reader</span><span style="color: Gray;">.</span><span style="color: Blue;">readAsDataURL</span><span style="color: Olive;">(</span><span style="color: Blue;">file</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; &nbsp; &nbsp; </span><span style="color: #ffa500;">//将文件数据添加到FormData对象内</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Green;">if</span><span style="color: Gray;">&nbsp;</span><span style="color: Olive;">(</span><span style="color: Blue;">formdata</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;">formdata</span><span style="color: Gray;">.</span><span style="color: Blue;">append</span><span style="color: Olive;">(</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">images[]</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;">, </span><span style="color: Blue;">file</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;">&nbsp; &nbsp; </span></li>
<li><span style="color: Olive;">}</span></li></ol></div>
<p>首先需要判断下文件类型，<strong>file.type.match(/image.*/)</strong>，如果是图片，file.type值会类似“image/jpeg”的形式。<br />
接下来实例化<strong>FileReader</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: Blue;">reader</span><span style="color: Gray;"> = </span><span style="color: Green;">new</span><span style="color: Gray;"> </span><span style="color: Blue;">FileReader</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: #ffa500;">//监听文件读取结束后事件</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Blue;">reader</span><span style="color: Gray;">.</span><span style="color: Blue;">onloadend</span><span style="color: Gray;"> = </span><span style="color: Green;">function</span><span style="color: Gray;">&nbsp;</span><span style="color: Olive;">(</span><span style="color: Blue;">e</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; </span><span style="color: #ffa500;">//将图片添加到显示列表</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Blue;">showUploadedItem</span><span style="color: Olive;">(</span><span style="color: Blue;">e</span><span style="color: Gray;">.</span><span style="color: Blue;">target</span><span style="color: Gray;">.</span><span style="color: Blue;">result</span><span style="color: Gray;">, </span><span style="color: Blue;">file</span><span style="color: Gray;">.</span><span style="color: Blue;">fileName</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: Olive;">}</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: #ffa500;">//读取文件</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Blue;">reader</span><span style="color: Gray;">.</span><span style="color: Blue;">readAsDataURL</span><span style="color: Olive;">(</span><span style="color: Blue;">file</span><span style="color: Olive;">)</span><span style="color: Gray;">;</span></li></ol></div>
<p>FileReader有6个事件( onloadstart、onprogress、onload、onabort、 onerror、onloadend)，<strong>onloadend</strong>监听读取完毕事件，我们需要读取结束后把图片打印到页面。<br />
留意<strong>e.target.result</strong>，result包含图片数据<br />
最后来看下showUploadedItem函数：</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: #ffa500;">//显示上传图片</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Green;">function</span><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">showUploadedItem</span><span style="color: Gray;"> </span><span style="color: Olive;">(</span><span style="color: Blue;">source</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; </span><span style="color: Green;">var</span><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">list</span><span style="color: Gray;"> = </span><span style="color: Teal;">document</span><span style="color: Gray;">.</span><span style="color: Blue;">getElementById</span><span style="color: Olive;">(</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">image-list</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; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Blue;">li</span><span style="color: Gray;">&nbsp;&nbsp; = </span><span style="color: Teal;">document</span><span style="color: Gray;">.</span><span style="color: Blue;">createElement</span><span style="color: Olive;">(</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">li</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; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Blue;">img</span><span style="color: Gray;">&nbsp; = </span><span style="color: Teal;">document</span><span style="color: Gray;">.</span><span style="color: Blue;">createElement</span><span style="color: Olive;">(</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">img</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; &nbsp; &nbsp; &nbsp; </span><span style="color: Blue;">img</span><span style="color: Gray;">.</span><span style="color: Blue;">src</span><span style="color: Gray;"> = </span><span style="color: Blue;">source</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Blue;">li</span><span style="color: Gray;">.</span><span style="color: Blue;">appendChild</span><span style="color: Olive;">(</span><span style="color: Blue;">img</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;">list</span><span style="color: Gray;">.</span><span style="color: Blue;">appendChild</span><span style="color: Olive;">(</span><span style="color: Blue;">li</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></ol></div>
<p>非常简单，将img元素添加到li元素，然后li添加到ul即可。</p>
<h4>7.ajax发送FormData数据</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;">//遍历文件</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Green;">for</span><span style="color: Gray;">&nbsp;</span><span style="color: Olive;">(</span><span style="color: Gray;"> ; </span><span style="color: Blue;">i</span><span style="color: Gray;"> &lt; </span><span style="color: Blue;">len</span><span style="color: Gray;">; </span><span style="color: Blue;">i</span><span style="color: Gray;">++ </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;">file</span><span style="color: Gray;"> = </span><span style="color: Green;">this</span><span style="color: Gray;">.</span><span style="color: Blue;">files</span><span style="color: Olive;">[</span><span style="color: Blue;">i</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; </span><span style="color: #ffa500;">//将文件数据添加到FormData对象内</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Green;">if</span><span style="color: Gray;">&nbsp;</span><span style="color: Olive;">(</span><span style="color: Blue;">formdata</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;">formdata</span><span style="color: Gray;">.</span><span style="color: Blue;">append</span><span style="color: Olive;">(</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">images[]</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;">, </span><span style="color: Blue;">file</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: Olive;">}</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Olive;">}</span></li></ol></div>
<p>将文件信息添加到formdata。</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: #ffa500;">//发送ajax请求，存储文件（传递FormData对象过去）</span></li>
<li><span style="color: Green;">if</span><span style="color: Gray;">&nbsp;</span><span style="color: Olive;">(</span><span style="color: Blue;">formdata</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: Blue;">ajax</span><span style="color: Olive;">({</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Blue;">url</span><span style="color: Gray;">: </span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">upload.php</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;">,</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Blue;">type</span><span style="color: Gray;">: </span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">POST</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;">,</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Blue;">data</span><span style="color: Gray;">: </span><span style="color: Blue;">formdata</span><span style="color: Gray;">,</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Blue;">processData</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; </span><span style="color: Blue;">contentType</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; </span><span style="color: Blue;">success</span><span style="color: Gray;">: </span><span style="color: Green;">function</span><span style="color: Gray;">&nbsp;</span><span style="color: Olive;">(</span><span style="color: Blue;">res</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: #ffa500;">//将上传成功后的提示打印到页面</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Teal;">document</span><span style="color: Gray;">.</span><span style="color: Blue;">getElementById</span><span style="color: Olive;">(</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">response</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">)</span><span style="color: Gray;">.</span><span style="color: Blue;">innerHTML</span><span style="color: Gray;"> = </span><span style="color: Blue;">res</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>
<p>发送异步请求将数据传给upload.php处理。这里使用jquery的ajax方法。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.36ria.com/4397/feed</wfw:commentRss>
		<slash:comments>10</slash:comments>
		</item>
		<item>
		<title>15个相当不错的jquery技巧</title>
		<link>http://www.36ria.com/4391</link>
		<comments>http://www.36ria.com/4391#comments</comments>
		<pubDate>Fri, 15 Jul 2011 13:18:42 +0000</pubDate>
		<dc:creator>明河</dc:creator>
				<category><![CDATA[jquery教程]]></category>

		<guid isPermaLink="false">http://www.36ria.com/?p=4391</guid>
		<description><![CDATA[今天在tutorialzine发现一篇关于jquery使用技巧的，相当不错，翻译分享给各位。 1.使用最新的jquery版本 明河觉得这个建议有待商榷，虽然越新的jquery版本性能上更加优秀，但是有些方法的变迁还是会导致一些bug，比如从1.4.2到1.5时很多朋友就抱怨ajax上出现问题了。明河的建议是旧的页面的jquery升级需谨慎，新项目可以大胆的使用jquery新版本。 还有个建议是使用google的cdn上的jquer......]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.36ria.com/4391/jquery-15-tips" rel="attachment wp-att-4394"><img src="http://www.36ria.com/wp-content/uploads/2011/07/jquery-15-tips.png" alt="" title="jquery-15-tips" width="680" height="200" class="alignnone size-full wp-image-4394" /></a><br />
今天在<a href="http://tutorialzine.com/2011/06/15-powerful-jquery-tips-and-tricks-for-developers/">tutorialzine</a>发现一篇关于jquery使用技巧的，相当不错，翻译分享给各位。</p>
<h4>1.使用最新的jquery版本</h4>
<p>明河觉得这个建议有待商榷，虽然越新的jquery版本性能上更加优秀，但是有些方法的变迁还是会导致一些bug，比如从1.4.2到1.5时很多朋友就抱怨ajax上出现问题了。明河的建议是旧的页面的jquery升级需谨慎，新项目可以大胆的使用jquery新版本。<br />
还有个建议是使用google的cdn上的jquery文件，加载速度更快。猛击<a href="http://code.google.com/intl/zh-CN/apis/libraries/devguide.html" target="_blank">Google Libraries API</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: #ffa500;">&lt;!-- Include a specific version of jQuery --&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;">http://ajax.googleapis.com/ajax/libs/jquery/1.6.1/jquery.min.js</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: #ffa500;">&lt;!-- Include the latest version in the 1.6 branch --&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;">http://ajax.googleapis.com/ajax/libs/jquery/1.6/jquery.min.js</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>
<h4>2.保持选择器的简单</h4>
<p>这个建议明河非常赞同，有很多朋友不喜欢给元素增加样式或id，希望保持html的简洁，使用jquery强大的选择器去检索元素，这不是好的习惯。首先越复杂的选择器，遍历的效率越低，这是显而易见的，最高效率无疑是使用原生的<strong>getElementById()</strong>；其次，复杂的选择器将标签名称和层级结构固化在里面，假如你的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;">$</span><span style="color: Olive;">(</span><span style="color: #8b0000;">'</span><span style="color: Red;">li[data-selected=&quot;true&quot;] a</span><span style="color: #8b0000;">'</span><span style="color: Olive;">)</span><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: #ffa500;">// Fancy, but slow</span></li>
<li><span style="color: Gray;">$</span><span style="color: Olive;">(</span><span style="color: #8b0000;">'</span><span style="color: Red;">li.selected a</span><span style="color: #8b0000;">'</span><span style="color: Olive;">)</span><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: #ffa500;">// Better</span></li>
<li><span style="color: Gray;">$</span><span style="color: Olive;">(</span><span style="color: #8b0000;">'</span><span style="color: Red;">#elem</span><span style="color: #8b0000;">'</span><span style="color: Olive;">)</span><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: #ffa500;">// Best</span></li></ol></div>
<p>访问DOM，是javascript最耗资源和性能的部分，所以尽量<strong>避免复杂或重复的遍历DOM</strong>。<br />
避免重复遍历DOM的方法就是将$()检索的元素存储到变量，比如下面的代码：</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;">buttons</span><span style="color: Gray;"> = $</span><span style="color: Olive;">(</span><span style="color: #8b0000;">'</span><span style="color: Red;">#navigation a.button</span><span style="color: #8b0000;">'</span><span style="color: Olive;">)</span><span style="color: Gray;">;</span></li>
<li><span style="color: #ffa500;">// 使用$前缀来标示jquery对象，是非常好的习惯，推荐使用。</span></li>
<li><span style="color: Green;">var</span><span style="color: Gray;"> $</span><span style="color: Blue;">buttons</span><span style="color: Gray;"> = $</span><span style="color: Olive;">(</span><span style="color: #8b0000;">'</span><span style="color: Red;">#navigation a.button</span><span style="color: #8b0000;">'</span><span style="color: Olive;">)</span><span style="color: Gray;">;</span></li></ol></div>
<p>jquery选择器支持大部分的css3伪类方法，像<strong>:visible</strong>, <strong>:hidden</strong>, <strong>:animated</strong>，虽然很便利，但请慎用，因为当你使用伪类选择器的时候，jQuery不得不使用<strong>querySelectorAll()</strong>，性能的损耗更大。</p>
<h4>3.jQuery对象作为数组处理</h4>
<p>jQuery对象定义了length属性，当使用数组的形式操作时候返回其实是DOM元素而不是子jQuery对象，比如下面代码。</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: #ffa500;">// Selecting all the navigation buttons:</span></li>
<li><span style="color: Green;">var</span><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">buttons</span><span style="color: Gray;"> = $</span><span style="color: Olive;">(</span><span style="color: #8b0000;">'</span><span style="color: Red;">#navigation a.button</span><span style="color: #8b0000;">'</span><span style="color: Olive;">)</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp;</span></li>
<li><span style="color: #ffa500;">// 遍历buttons对象</span></li>
<li><span style="color: Green;">for</span><span style="color: Olive;">(</span><span style="color: Green;">var</span><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">i</span><span style="color: Gray;">=</span><span style="color: Maroon;">0</span><span style="color: Gray;">;</span><span style="color: Blue;">i</span><span style="color: Gray;">&lt;</span><span style="color: Blue;">buttons</span><span style="color: Gray;">.</span><span style="color: Blue;">length</span><span style="color: Gray;">;</span><span style="color: Blue;">i</span><span style="color: Gray;">++</span><span style="color: Olive;">){</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Blue;">console</span><span style="color: Gray;">.</span><span style="color: Blue;">log</span><span style="color: Olive;">(</span><span style="color: Blue;">buttons</span><span style="color: Olive;">[</span><span style="color: Blue;">i</span><span style="color: Olive;">])</span><span style="color: Gray;">;&nbsp; &nbsp; </span><span style="color: #ffa500;">// 是DOM元素，而不是jQuery对象！</span></li>
<li><span style="color: Olive;">}</span></li>
<li><span style="color: Gray;">&nbsp;</span></li>
<li><span style="color: #ffa500;">// We can even slice it:</span></li>
<li><span style="color: Green;">var</span><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">firstFour</span><span style="color: Gray;"> = </span><span style="color: Blue;">buttons</span><span style="color: Gray;">.</span><span style="color: Blue;">slice</span><span style="color: Olive;">(</span><span style="color: Maroon;">0</span><span style="color: Gray;">,</span><span style="color: Maroon;">4</span><span style="color: Olive;">)</span><span style="color: Gray;">;</span></li></ol></div>
<p>根据实验，使用for或while循环，执行效率比$.each()来的高。详细测试可以看<a href="http://jsfiddle.net/martinaglv/NcRsV/" target="_blank">several times faster</a>。<br />
使用length属性来检查元素存在性：</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;">if</span><span style="color: Olive;">(</span><span style="color: Blue;">buttons</span><span style="color: Olive;">){</span><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: #ffa500;">// This is always true</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: #ffa500;">// Do something</span></li>
<li><span style="color: Olive;">}</span></li>
<li><span style="color: Gray;">&nbsp;</span></li>
<li><span style="color: Green;">if</span><span style="color: Olive;">(</span><span style="color: Blue;">buttons</span><span style="color: Gray;">.</span><span style="color: Blue;">length</span><span style="color: Olive;">){</span><span style="color: Gray;">&nbsp;</span><span style="color: #ffa500;">// True only if buttons contains elements</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: #ffa500;">// Do something</span></li>
<li><span style="color: Olive;">}</span></li></ol></div>
<h4>4.selector属性</h4>
<p>jQuery对象都带有一个selector属性，用于获取选择器名称，比如：</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;">'</span><span style="color: Red;">#container li:first-child</span><span style="color: #8b0000;">'</span><span style="color: Olive;">)</span><span style="color: Gray;">.</span><span style="color: Blue;">selector</span><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: #ffa500;">// #container li:first-child</span></li>
<li><span style="color: Gray;">$</span><span style="color: Olive;">(</span><span style="color: #8b0000;">'</span><span style="color: Red;">#container li</span><span style="color: #8b0000;">'</span><span style="color: Olive;">)</span><span style="color: Gray;">.</span><span style="color: Blue;">filter</span><span style="color: Olive;">(</span><span style="color: #8b0000;">'</span><span style="color: Red;">:first-child</span><span style="color: #8b0000;">'</span><span style="color: Olive;">)</span><span style="color: Gray;">.</span><span style="color: Blue;">selector</span><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: #ffa500;">// #container li.filter(:first-child)</span></li></ol></div>
<p>留意第二行代码，selector返回的是获取的元素完整的选择器。<br />
这个属性常用于编写jquery插件的时候。</p>
<h4>5.创建一个空的jQuery对象</h4>
<p>这种情况应用场景不多，当你需要先创建个空的jQuery对象，然后使用<a href="http://api.jquery.com/add/" target="_blank">add()</a>方法向此对象注入jQuery对象时会用到。</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;">container</span><span style="color: Gray;"> = $</span><span style="color: Olive;">([])</span><span style="color: Gray;">;</span></li>
<li><span style="color: Blue;">container</span><span style="color: Gray;">.</span><span style="color: Blue;">add</span><span style="color: Olive;">(</span><span style="color: Blue;">another_element</span><span style="color: Olive;">)</span><span style="color: Gray;">;)</span></li></ol></div>
<h4>6.选择随机元素</h4>
<p>应用场景不多，举个例子，现在你需要随机给li增加一个red的class。</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;">(</span><span style="color: Green;">function</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;">random</span><span style="color: Gray;"> = </span><span style="color: Maroon;">0</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;">expr</span><span style="color: Olive;">[</span><span style="color: #8b0000;">'</span><span style="color: Red;">:</span><span style="color: #8b0000;">'</span><span style="color: Olive;">]</span><span style="color: Gray;">.</span><span style="color: Blue;">random</span><span style="color: Gray;"> = </span><span style="color: Green;">function</span><span style="color: Olive;">(</span><span style="color: Blue;">a</span><span style="color: Gray;">, </span><span style="color: Blue;">i</span><span style="color: Gray;">, </span><span style="color: Blue;">m</span><span style="color: Gray;">, </span><span style="color: Blue;">r</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;">if</span><span style="color: Gray;">&nbsp;</span><span style="color: Olive;">(</span><span style="color: Blue;">i</span><span style="color: Gray;"> == </span><span style="color: Maroon;">0</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;">random</span><span style="color: Gray;"> = </span><span style="color: Teal;">Math</span><span style="color: Gray;">.</span><span style="color: Blue;">floor</span><span style="color: Olive;">(</span><span style="color: Teal;">Math</span><span style="color: Gray;">.</span><span style="color: Blue;">random</span><span style="color: Olive;">()</span><span style="color: Gray;"> * </span><span style="color: Blue;">r</span><span style="color: Gray;">.</span><span style="color: Blue;">length</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; &nbsp; &nbsp; </span><span style="color: Green;">return</span><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">i</span><span style="color: Gray;"> == </span><span style="color: Blue;">random</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;</span></li>
<li><span style="color: Olive;">})(</span><span style="color: Blue;">jQuery</span><span style="color: Olive;">)</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp;</span></li>
<li><span style="color: Gray;">$</span><span style="color: Olive;">(</span><span style="color: #8b0000;">'</span><span style="color: Red;">li:random</span><span style="color: #8b0000;">'</span><span style="color: Olive;">)</span><span style="color: Gray;">.</span><span style="color: Blue;">addClass</span><span style="color: Olive;">(</span><span style="color: #8b0000;">'</span><span style="color: Red;">glow</span><span style="color: #8b0000;">'</span><span style="color: Olive;">)</span><span style="color: Gray;">;</span></li></ol></div>
<p>需要扩展jquery的选择器，这段代码很好的演示了<strong>jQuery.expr</strong>的用法。</p>
<h4>7.使用css钩子</h4>
<p><a href="http://api.jquery.com/jQuery.cssHooks/" target="_blank">jQuery.cssHooks</a>是1.4.3新增的方法，用的不估计不多，当你定义新的CSS Hooks时实际上定义的是getter和setter方法，举个例子，border-radius这个圆角属性想要成功应用于firefox、webkit等浏览器，需要增加属性前缀，比如-moz-border-radius和-webkit-border-radius。你可以通过定义CSS Hooks将其封装成统一的接口borderRadius，而不是一一设置css属性。</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;">cssHooks</span><span style="color: Olive;">[</span><span style="color: #8b0000;">'</span><span style="color: Red;">borderRadius</span><span style="color: #8b0000;">'</span><span style="color: Olive;">]</span><span style="color: Gray;"> = </span><span style="color: Olive;">{</span></li>
<li><span style="color: Gray;">&amp;</span><span style="color: Blue;">nbsp</span><span style="color: Gray;">; &amp;</span><span style="color: Blue;">nbsp</span><span style="color: Gray;">; &amp;</span><span style="color: Blue;">nbsp</span><span style="color: Gray;">; &amp;</span><span style="color: Blue;">nbsp</span><span style="color: Gray;">; </span><span style="color: Blue;">get</span><span style="color: Gray;">: </span><span style="color: Green;">function</span><span style="color: Olive;">(</span><span style="color: Blue;">elem</span><span style="color: Gray;">, </span><span style="color: Blue;">computed</span><span style="color: Gray;">, </span><span style="color: Blue;">extra</span><span style="color: Olive;">){</span></li>
<li><span style="color: Gray;">&amp;</span><span style="color: Blue;">nbsp</span><span style="color: Gray;">; &amp;</span><span style="color: Blue;">nbsp</span><span style="color: Gray;">; &amp;</span><span style="color: Blue;">nbsp</span><span style="color: Gray;">; &amp;</span><span style="color: Blue;">nbsp</span><span style="color: Gray;">; &amp;</span><span style="color: Blue;">nbsp</span><span style="color: Gray;">; &amp;</span><span style="color: Blue;">nbsp</span><span style="color: Gray;">; </span><span style="color: #ffa500;">// Depending on the browser, read the value of</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: #ffa500;">// -moz-border-radius, -webkit-border-radius or border-radius</span></li>
<li><span style="color: Gray;">&amp;</span><span style="color: Blue;">nbsp</span><span style="color: Gray;">; &amp;</span><span style="color: Blue;">nbsp</span><span style="color: Gray;">; &amp;</span><span style="color: Blue;">nbsp</span><span style="color: Gray;">; &amp;</span><span style="color: Blue;">nbsp</span><span style="color: Gray;">; </span><span style="color: Olive;">}</span><span style="color: Gray;">,</span></li>
<li><span style="color: Gray;">&amp;</span><span style="color: Blue;">nbsp</span><span style="color: Gray;">; &amp;</span><span style="color: Blue;">nbsp</span><span style="color: Gray;">; &amp;</span><span style="color: Blue;">nbsp</span><span style="color: Gray;">; &amp;</span><span style="color: Blue;">nbsp</span><span style="color: Gray;">; </span><span style="color: Blue;">set</span><span style="color: Gray;">: </span><span style="color: Green;">function</span><span style="color: Olive;">(</span><span style="color: Blue;">elem</span><span style="color: Gray;">, </span><span style="color: Blue;">value</span><span style="color: Olive;">){</span></li>
<li><span style="color: Gray;">&amp;</span><span style="color: Blue;">nbsp</span><span style="color: Gray;">; &amp;</span><span style="color: Blue;">nbsp</span><span style="color: Gray;">; &amp;</span><span style="color: Blue;">nbsp</span><span style="color: Gray;">; &amp;</span><span style="color: Blue;">nbsp</span><span style="color: Gray;">; &amp;</span><span style="color: Blue;">nbsp</span><span style="color: Gray;">; &amp;</span><span style="color: Blue;">nbsp</span><span style="color: Gray;">; </span><span style="color: #ffa500;">// Set the appropriate CSS3 property</span></li>
<li><span style="color: Gray;">&amp;</span><span style="color: Blue;">nbsp</span><span style="color: Gray;">; &amp;</span><span style="color: Blue;">nbsp</span><span style="color: Gray;">; &amp;</span><span style="color: Blue;">nbsp</span><span style="color: Gray;">; &amp;</span><span style="color: Blue;">nbsp</span><span style="color: Gray;">; </span><span style="color: Olive;">}</span></li>
<li><span style="color: Olive;">}</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp;</span></li>
<li><span style="color: #ffa500;">// Use it without worrying which property the browser actually understands:</span></li>
<li><span style="color: Gray;">$</span><span style="color: Olive;">(</span><span style="color: #8b0000;">'</span><span style="color: Red;">#rect</span><span style="color: #8b0000;">'</span><span style="color: Olive;">)</span><span style="color: Gray;">.</span><span style="color: Blue;">css</span><span style="color: Olive;">(</span><span style="color: #8b0000;">'</span><span style="color: Red;">borderRadius</span><span style="color: #8b0000;">'</span><span style="color: Gray;">,</span><span style="color: Maroon;">5</span><span style="color: Olive;">)</span><span style="color: Gray;">;</span></li></ol></div>
<h4>8.使用自定义的Easing（缓动动画效果）函数</h4>
<p><a href="http://tutorialzine.com/2011/06/15-powerful-jquery-tips-and-tricks-for-developers/" target="_blank">easing plugin</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;">$.</span><span style="color: Blue;">easing</span><span style="color: Gray;">.</span><span style="color: Blue;">easeInOutQuad</span><span style="color: Gray;"> = </span><span style="color: Green;">function</span><span style="color: Gray;"> </span><span style="color: Olive;">(</span><span style="color: Blue;">x</span><span style="color: Gray;">, </span><span style="color: Blue;">t</span><span style="color: Gray;">, </span><span style="color: Blue;">b</span><span style="color: Gray;">, </span><span style="color: Blue;">c</span><span style="color: Gray;">, </span><span style="color: Blue;">d</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;">if</span><span style="color: Gray;">&nbsp;</span><span style="color: Olive;">((</span><span style="color: Blue;">t</span><span style="color: #8b0000;">/</span><span style="color: Red;">=d</span><span style="color: #8b0000;">/</span><span style="color: Maroon;">2</span><span style="color: Olive;">)</span><span style="color: Gray;"> &lt; </span><span style="color: Maroon;">1</span><span style="color: Olive;">)</span><span style="color: Gray;"> </span><span style="color: Green;">return</span><span style="color: Gray;"> </span><span style="color: Blue;">c</span><span style="color: #8b0000;">/</span><span style="color: Red;">2*t*t + b;</span></li>
<li><span style="color: Red;">&nbsp; &nbsp; return -c</span><span style="color: #8b0000;">/</span><span style="color: Maroon;">2</span><span style="color: Gray;"> * </span><span style="color: Olive;">((</span><span style="color: Gray;">--</span><span style="color: Blue;">t</span><span style="color: Olive;">)</span><span style="color: Gray;">*</span><span style="color: Olive;">(</span><span style="color: Blue;">t</span><span style="color: Gray;">-</span><span style="color: Maroon;">2</span><span style="color: Olive;">)</span><span style="color: Gray;"> - </span><span style="color: Maroon;">1</span><span style="color: Olive;">)</span><span style="color: Gray;"> + </span><span style="color: Blue;">b</span><span style="color: Gray;">;</span></li>
<li><span style="color: Olive;">}</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp;</span></li>
<li><span style="color: #ffa500;">// To use it:</span></li>
<li><span style="color: Gray;">$</span><span style="color: Olive;">(</span><span style="color: #8b0000;">'</span><span style="color: Red;">#elem</span><span style="color: #8b0000;">'</span><span style="color: Olive;">)</span><span style="color: Gray;">.</span><span style="color: Blue;">animate</span><span style="color: Olive;">({</span><span style="color: Blue;">width</span><span style="color: Gray;">:</span><span style="color: Maroon;">200</span><span style="color: Olive;">}</span><span style="color: Gray;">,</span><span style="color: #8b0000;">'</span><span style="color: Red;">slow</span><span style="color: #8b0000;">'</span><span style="color: Gray;">,</span><span style="color: #8b0000;">'</span><span style="color: Red;">easeInOutQuad</span><span style="color: #8b0000;">'</span><span style="color: Olive;">)</span><span style="color: Gray;">;</span></li></ol></div>
<h4>9.$.proxy()的使用</h4>
<p>关于$.proxy()，明河曾经详细介绍过，传送门在此<a href="http://www.36ria.com/1372" target="_blank">《jquery1.4教程三：新增方法教程（3）》</a>。<br />
jquery有个让人头疼的地方，回调函数过多，上下文this总是在变化着，有时候我们需要控制this的指向，这时候就需要$.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: 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;">panel</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;">display:none</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;">button</span><span style="color: Olive;">&gt;</span><span style="color: Gray;">Close</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: 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: Gray;">$</span><span style="color: Olive;">(</span><span style="color: #8b0000;">'</span><span style="color: Red;">#panel</span><span style="color: #8b0000;">'</span><span style="color: Olive;">)</span><span style="color: Gray;">.</span><span style="color: Blue;">fadeIn</span><span style="color: Olive;">(</span><span style="color: Green;">function</span><span style="color: Olive;">(){</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: #ffa500;">// this points to #panel</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; $</span><span style="color: Olive;">(</span><span style="color: #8b0000;">'</span><span style="color: Red;">#panel button</span><span style="color: #8b0000;">'</span><span style="color: Olive;">)</span><span style="color: Gray;">.</span><span style="color: Blue;">click</span><span style="color: Olive;">(</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;">// this points to the button</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; $</span><span style="color: Olive;">(</span><span style="color: Green;">this</span><span style="color: Olive;">)</span><span style="color: Gray;">.</span><span style="color: Blue;">fadeOut</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: Olive;">})</span><span style="color: Gray;">;</span></li></ol></div>
<p>嵌套的二个回调函数this指向是不同的！现在我们希望this的指向是#panel的元素。代码如下：</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;">'</span><span style="color: Red;">#panel</span><span style="color: #8b0000;">'</span><span style="color: Olive;">)</span><span style="color: Gray;">.</span><span style="color: Blue;">fadeIn</span><span style="color: Olive;">(</span><span style="color: Green;">function</span><span style="color: Olive;">(){</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: #ffa500;">// Using $.proxy to bind this:</span></li>
<li><span style="color: Gray;">&nbsp;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; $</span><span style="color: Olive;">(</span><span style="color: #8b0000;">'</span><span style="color: Red;">#panel button</span><span style="color: #8b0000;">'</span><span style="color: Olive;">)</span><span style="color: Gray;">.</span><span style="color: Blue;">click</span><span style="color: Olive;">(</span><span style="color: Gray;">$.</span><span style="color: Blue;">proxy</span><span style="color: Olive;">(</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;">// this points to #panel</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; $</span><span style="color: Olive;">(</span><span style="color: Green;">this</span><span style="color: Olive;">)</span><span style="color: Gray;">.</span><span style="color: Blue;">fadeOut</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><span style="color: Green;">this</span><span style="color: Olive;">))</span><span style="color: Gray;">;</span></li>
<li><span style="color: Olive;">})</span><span style="color: Gray;">;</span></li></ol></div>
<h4>10.快速获取节点数</h4>
<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;">console</span><span style="color: Gray;">.</span><span style="color: Blue;">log</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;">*</span><span style="color: #8b0000;">'</span><span style="color: Olive;">)</span><span style="color: Gray;">.</span><span style="color: Blue;">length</span><span style="color: Gray;"> </span><span style="color: Olive;">)</span><span style="color: Gray;">;</span></li></ol></div>
<h4>11.构建个jquery插件</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;">(</span><span style="color: Green;">function</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: Blue;">fn</span><span style="color: Gray;">.</span><span style="color: Blue;">yourPluginName</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;">// Your code goes here</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Green;">return</span><span style="color: Gray;">&nbsp;</span><span style="color: Green;">this</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: Olive;">})(</span><span style="color: Blue;">jQuery</span><span style="color: Olive;">)</span><span style="color: Gray;">;</span></li></ol></div>
<p>关于jquery插件的构建，明河曾发过系列教程，传送门：<a href="http://www.36ria.com/2765" title="制作jquery文字提示插件—jquery插件实战教程（1）" target="_blank">制作jquery文字提示插件—jquery插件实战教程（1）</a>。<br />
这里就不再详述。</p>
<h4>12.设置ajax全局事件</h4>
<p>关于ajax全局事件，明河曾发过完整的介绍文章，传送门：《<a href="http://www.36ria.com/2882" title="jquery的ajax全局事件详解—明河谈jquery" target="_blank">jquery的ajax全局事件详解—明河谈jquery</a>》。</p>
<h4>13.延迟动画</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;">// This is wrong:</span></li>
<li><span style="color: Gray;">$</span><span style="color: Olive;">(</span><span style="color: #8b0000;">'</span><span style="color: Red;">#elem</span><span style="color: #8b0000;">'</span><span style="color: Olive;">)</span><span style="color: Gray;">.</span><span style="color: Blue;">animate</span><span style="color: Olive;">({</span><span style="color: Blue;">width</span><span style="color: Gray;">:</span><span style="color: Maroon;">200</span><span style="color: Olive;">}</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; </span><span style="color: Blue;">setTimeout</span><span style="color: Olive;">(</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: Olive;">(</span><span style="color: #8b0000;">'</span><span style="color: Red;">#elem</span><span style="color: #8b0000;">'</span><span style="color: Olive;">)</span><span style="color: Gray;">.</span><span style="color: Blue;">animate</span><span style="color: Olive;">({</span><span style="color: Blue;">marginTop</span><span style="color: Gray;">:</span><span style="color: Maroon;">100</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><span style="color: Maroon;">2000</span><span style="color: Olive;">)</span><span style="color: Gray;">;</span></li>
<li><span style="color: Olive;">})</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp;</span></li>
<li><span style="color: #ffa500;">// Do it like this:</span></li>
<li><span style="color: Gray;">$</span><span style="color: Olive;">(</span><span style="color: #8b0000;">'</span><span style="color: Red;">#elem</span><span style="color: #8b0000;">'</span><span style="color: Olive;">)</span><span style="color: Gray;">.</span><span style="color: Blue;">animate</span><span style="color: Olive;">({</span><span style="color: Blue;">width</span><span style="color: Gray;">:</span><span style="color: Maroon;">200</span><span style="color: Olive;">})</span><span style="color: Gray;">.</span><span style="color: Blue;">delay</span><span style="color: Olive;">(</span><span style="color: Maroon;">2000</span><span style="color: Olive;">)</span><span style="color: Gray;">.</span><span style="color: Blue;">animate</span><span style="color: Olive;">({</span><span style="color: Blue;">marginTop</span><span style="color: Gray;">:</span><span style="color: Maroon;">100</span><span style="color: Olive;">})</span><span style="color: Gray;">;</span></li></ol></div>
<p>当存在多个animate动画时，如何处理动画的执行顺序是个烦心事，原文作者是建议使用<strong>delay()</strong>函数，如上面的代码，但明河的建议是使用<strong>queue()</strong>方法，因为delay你要考虑延迟多少时间，而queue没有这个问题，进入队列的函数会一个个顺序执行。可以看明河以前的文章<a href="http://www.36ria.com/8" title="queue和dequeue—明河谈jquery" target="_blank">queue和dequeue—明河谈jquery</a>。</p>
<h4>15.jquery的本地存储</h4>
<p>本地存储在现在web应用中使用越来越频繁，jquery有个专门用于本地存储的插件叫<a href="http://www.jstorage.info/" target="_blank">$.jStorage jQuery plugin</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: #ffa500;">// Check if &quot;key&quot; exists in the storage</span></li>
<li><span style="color: Green;">var</span><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">value</span><span style="color: Gray;"> = $.</span><span style="color: Blue;">jStorage</span><span style="color: Gray;">.</span><span style="color: Blue;">get</span><span style="color: Olive;">(</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">key</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">)</span><span style="color: Gray;">;</span></li>
<li><span style="color: Green;">if</span><span style="color: Olive;">(</span><span style="color: Gray;">!</span><span style="color: Blue;">value</span><span style="color: Olive;">){</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: #ffa500;">// if not - load the data from the server</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp;&nbsp; </span><span style="color: Blue;">value</span><span style="color: Gray;"> = </span><span style="color: Blue;">load_data_from_server</span><span style="color: Olive;">()</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp;&nbsp; </span><span style="color: #ffa500;">// and save it</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; $.</span><span style="color: Blue;">jStorage</span><span style="color: Gray;">.</span><span style="color: Blue;">set</span><span style="color: Olive;">(</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">key</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;">,</span><span style="color: Blue;">value</span><span style="color: Olive;">)</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: #ffa500;">// Use value</span></li></ol></div>
]]></content:encoded>
			<wfw:commentRss>http://www.36ria.com/4391/feed</wfw:commentRss>
		<slash:comments>14</slash:comments>
		</item>
	</channel>
</rss>

<!-- Dynamic page generated in 2.027 seconds. -->
<!-- Cached page generated by WP-Super-Cache on 2012-02-06 08:13:03 -->

