<?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>猫猫的天空</title>
	<atom:link href="http://www.wumain.com/php/blog/feed" rel="self" type="application/rss+xml" />
	<link>http://www.wumain.com/php/blog</link>
	<description>MyBlog</description>
	<lastBuildDate>Fri, 30 Dec 2011 05:02:22 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>视频: 腾讯内部员工认证微博流出　腾讯苦逼设计师</title>
		<link>http://www.wumain.com/php/blog/archives/579</link>
		<comments>http://www.wumain.com/php/blog/archives/579#comments</comments>
		<pubDate>Fri, 30 Dec 2011 05:02:22 +0000</pubDate>
		<dc:creator>Ryan</dc:creator>
				<category><![CDATA[心情]]></category>
		<category><![CDATA[f2e]]></category>
		<category><![CDATA[tx]]></category>
		<category><![CDATA[产品]]></category>
		<category><![CDATA[前端]]></category>
		<category><![CDATA[腾讯]]></category>
		<category><![CDATA[苦逼]]></category>
		<category><![CDATA[设计师]]></category>

		<guid isPermaLink="false">http://www.wumain.com/php/blog/?p=579</guid>
		<description><![CDATA[<object width="480" height="400" classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="src" value="http://player.youku.com/player.php/sid/XMzM0MzM3NDY0/v.swf" /><param name="allowfullscreen" value="true" /><param name="quality" value="high" /><param name="allowscriptaccess" value="always" /><embed width="480" height="400" type="application/x-shockwave-flash" src="http://player.youku.com/player.php/sid/XMzM0MzM3NDY0/v.swf" allowfullscreen="true" quality="high" allowscriptaccess="always" /></object>

<a href="http://weibo.com/1627118291/xEoHqarqY?type=repost" title="链接" target="_blank">http://weibo.com/1627118291/xEoHqarqY?type=repost</a>]]></description>
		<wfw:commentRss>http://www.wumain.com/php/blog/archives/579/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>JAY 原来那么强大。。。</title>
		<link>http://www.wumain.com/php/blog/archives/575</link>
		<comments>http://www.wumain.com/php/blog/archives/575#comments</comments>
		<pubDate>Tue, 13 Dec 2011 05:39:32 +0000</pubDate>
		<dc:creator>Ryan</dc:creator>
				<category><![CDATA[心情]]></category>
		<category><![CDATA[AV]]></category>
		<category><![CDATA[edison]]></category>
		<category><![CDATA[Jay]]></category>
		<category><![CDATA[周杰伦]]></category>
		<category><![CDATA[陈冠希]]></category>

		<guid isPermaLink="false">http://www.wumain.com/php/blog/?p=575</guid>
		<description><![CDATA[<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=7,0,19,0" width="400" height="325"><param name="movie" value="http://v.ifeng.com/include/exterior.swf?guid=58ecc881-c4ae-deb8-27d0-9d9628f6d095&#038;pageurl=http://www.ifeng.com&#038;fromweb=other&#038;AutoPlay=false" /><param name="quality" value="high" /><param name="allowScriptAccess" value="always" /><embed src="http://v.ifeng.com/include/exterior.swf?guid=58ecc881-c4ae-deb8-27d0-9d9628f6d095&#038;pageurl=http://www.ifeng.com&#038;fromweb=other&#038;AutoPlay=false" quality="high"  allowScriptAccess="always" pluginspage="http://www.macromedia.com/go/getflashplayer" type="application/x-shockwave-flash" width="400" height="325"></embed></object>]]></description>
		<wfw:commentRss>http://www.wumain.com/php/blog/archives/575/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>欧洲杯小组抽签16强表情变化 笑残了～</title>
		<link>http://www.wumain.com/php/blog/archives/572</link>
		<comments>http://www.wumain.com/php/blog/archives/572#comments</comments>
		<pubDate>Sun, 11 Dec 2011 13:15:39 +0000</pubDate>
		<dc:creator>Ryan</dc:creator>
				<category><![CDATA[心情]]></category>
		<category><![CDATA[抽签]]></category>
		<category><![CDATA[欧洲杯]]></category>
		<category><![CDATA[死亡之组]]></category>
		<category><![CDATA[爆笑]]></category>
		<category><![CDATA[笑话]]></category>

		<guid isPermaLink="false">http://www.wumain.com/php/blog/?p=572</guid>
		<description><![CDATA[<div id="repasteCon" class="f14 zoom" style="line-height: 1.5;">

抽签前：

第一档：

乌克兰<img src="http://www.wumain.com/Image/tie/24.gif" alt="" border="0" />A组（爷种子！）、波兰D组<img src="http://www.wumain.com/Image/tie/24.gif" alt="" border="0" />（爷也是！）、西班牙<img src="http://www.wumain.com/Image/tie/10.gif" alt="" border="0" />（毫无压力）、荷兰<img src="http://www.wumain.com/Image/tie/14.gif" alt="" border="0" />（死亡之组的常客）

第二档：

德国<img src="http://www.wumain.com/Image/tie/10.gif" alt="" border="0" />（求A、D组种子）、意大利<img src="http://www.wumain.com/Image/tie/6.gif" alt="" border="0" />(同求）、英格兰<img src="http://www.wumain.com/Image/tie/30.gif" alt="" border="0" />（求鲁尼···）、俄罗斯<img src="http://www.wumain.com/Image/tie/18.gif" alt="" border="0" />（我要荷兰~）

第三档：

克罗地亚<img src="http://www.wumain.com/Image/tie/33.gif" alt="" border="0" />（重在参与）、希腊<img src="http://www.wumain.com/Image/tie/32.gif" alt="" border="0" />（想当年···）、葡萄牙<img src="http://www.wumain.com/Image/tie/1.gif" alt="" border="0" />（我不要这鸟档）、瑞典<img src="http://www.wumain.com/Image/tie/11.gif" alt="" border="0" />（求英格兰~）

第四档：

丹麦<img src="http://www.wumain.com/Image/tie/32.gif" alt="" border="0" />（二十年前···）、法国<img src="http://www.wumain.com/Image/tie/31.gif" alt="" border="0" />（多梅内克！！！）、捷克<img src="http://www.wumain.com/Image/tie/28.gif" alt="" border="0" />（差点没赶上）、爱尔兰<img src="http://www.wumain.com/Image/tie/28.gif" alt="" border="0" />（我也是~）

抽签第一轮：

A组：波兰<img src="http://www.wumain.com/Image/tie/24.gif" alt="" border="0" />（好鸡动！）

B组：荷兰<img src="http://www.wumain.com/Image/tie/14.gif" alt="" border="0" />（好紧张！）

C组：西班牙<img src="http://www.wumain.com/Image/tie/10.gif" alt="" border="0" />（呵呵~）

D组：乌克兰<img src="http://www.wumain.com/Image/tie/23.gif" alt="" border="0" />（我咋觉着不对劲呢？)

第二轮：

A组：波兰<img src="http://www.wumain.com/Image/tie/5.gif" alt="" border="0" />（还好~）、捷克<img src="http://www.wumain.com/Image/tie/18.gif" alt="" border="0" />（不错~）

B组：荷兰<img src="http://www.wumain.com/Image/tie/15.gif" alt="" border="0" />（吓死我了）、丹麦<img src="http://www.wumain.com/Image/tie/8.gif" alt="" border="0" />（奶奶个熊！）

C组：西班牙<img src="http://www.wumain.com/Image/tie/2.gif" alt="" border="0" />（小样儿~）、爱尔兰<img src="http://www.wumain.com/Image/tie/31.gif" alt="" border="0" />（妈逼的啊！）

D组：乌克兰<img src="http://www.wumain.com/Image/tie/28.gif" alt="" border="0" />（操！）、法国<img src="http://www.wumain.com/Image/tie/2.gif" alt="" border="0" />（哈哈哈哈！）

第三轮：

A组：波兰<img src="http://www.wumain.com/Image/tie/2.gif" alt="" border="0" />（嘿嘿~）、捷克<img src="http://www.wumain.com/Image/tie/2.gif" alt="" border="0" />（嘿嘿~）、希腊<img src="http://www.wumain.com/Image/tie/2.gif" alt="" border="0" />（有戏了~）

B组：荷兰<img src="http://www.wumain.com/Image/tie/28.gif" alt="" border="0" />（妈逼老是我！）、丹麦<img src="http://www.wumain.com/Image/tie/31.gif" alt="" border="0" />（齐秃子！）、葡萄牙<img src="http://www.wumain.com/Image/tie/31.gif" alt="" border="0" />（你妹啊！）

C组：西班牙<img src="http://www.wumain.com/Image/tie/24.gif" alt="" border="0" />（哈哈哈哈！）、爱尔兰<img src="http://www.wumain.com/Image/tie/6.gif" alt="" border="0" />（还行~）、克罗地亚<img src="http://www.wumain.com/Image/tie/26.gif" alt="" border="0" />（西班牙怎么也在！）

D组：乌克兰<img src="http://www.wumain.com/Image/tie/8.gif" alt="" border="0" />（妈呀吓死我了！）、法国<img src="http://www.wumain.com/Image/tie/11.gif" alt="" border="0" />（有的打~）、瑞典<img src="http://www.wumain.com/Image/tie/18.gif" alt="" border="0" />（命不错~）

第四轮：

A组：波兰<img src="http://www.wumain.com/Image/tie/24.gif" alt="" border="0" />（哈哈！）、捷克<img src="http://www.wumain.com/Image/tie/24.gif" alt="" border="0" />（哈哈！）、希腊<img src="http://www.wumain.com/Image/tie/24.gif" alt="" border="0" />（嘿嘿！）、俄罗斯<img src="http://www.wumain.com/Image/tie/18.gif" alt="" border="0" />（不错，这个屌~）

B组：荷兰<img src="http://www.wumain.com/Image/tie/7.gif" alt="" border="0" />（操，又是死亡之组！）、丹麦<img src="http://www.wumain.com/Image/tie/28.gif" alt="" border="0" />（打酱油了）、葡萄牙<img src="http://www.wumain.com/Image/tie/31.gif" alt="" border="0" />（妈逼！）、德国<img src="http://www.wumain.com/Image/tie/7.gif" alt="" border="0" />（我怎么在这！）

C组：西班牙<img src="http://www.wumain.com/Image/tie/10.gif" alt="" border="0" />（不错不错）、爱尔兰<img src="http://www.wumain.com/Image/tie/28.gif" alt="" border="0" />（玩完了~）、克罗地亚<img src="http://www.wumain.com/Image/tie/14.gif" alt="" border="0" />（我要A组！）、意大利<img src="http://www.wumain.com/Image/tie/10.gif" alt="" border="0" />（真幸运！）

D组：乌克兰<img src="http://www.wumain.com/Image/tie/28.gif" alt="" border="0" />（不好玩~）、法国<img src="http://www.wumain.com/Image/tie/24.gif" alt="" border="0" />（我亲爹！）、瑞典<img src="http://www.wumain.com/Image/tie/18.gif" alt="" border="0" />（英格兰你好~）、英格兰<img src="http://www.wumain.com/Image/tie/30.gif" alt="" border="0" />（我要鲁尼~）

<span style="color: #993366; font-size: large;">
</span>

</div>]]></description>
		<wfw:commentRss>http://www.wumain.com/php/blog/archives/572/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>很不错的HTML5 CSS3 总结文档</title>
		<link>http://www.wumain.com/php/blog/archives/566</link>
		<comments>http://www.wumain.com/php/blog/archives/566#comments</comments>
		<pubDate>Fri, 02 Dec 2011 07:04:03 +0000</pubDate>
		<dc:creator>Ryan</dc:creator>
				<category><![CDATA[HTML5]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[技术]]></category>
		<category><![CDATA[CSS]]></category>
		<category><![CDATA[CSS3]]></category>
		<category><![CDATA[jquery]]></category>
		<category><![CDATA[浏览器]]></category>

		<guid isPermaLink="false">http://www.wumain.com/php/blog/?p=566</guid>
		<description><![CDATA[<p align="left"><strong><span style="font-size: small;">最近看到了一篇文章对<a href="http://www.html5cn.org/" target="_blank">HTML5</a> <a href="http://www.html5cn.org/portal.php?mod=list&#38;catid=16" target="_blank">CSS3</a>进行了一些总结，个人感觉还不错，贴出来供大家看看。</span></strong></p>
<p align="left"><strong><span style="font-size: small;">目录：</span></strong></p>
<p align="left"><strong>第一章 HTML 5 的技术要点... 3</strong></p>
<p align="left"><strong>1. 地理位置API 3</strong></p>
<p align="left">1.1 简介：... 3</p>
<p align="left">1.2 获取地理位置的方式及其优缺点：... 3</p>
<p align="left">1.3 地理位置获取流程：... 3</p>
<p align="left">1.4 浏览器支持的情况：... 3</p>
<p align="left">1.5 浏览器支持的检查方法：... 3</p>
<p align="left">1.6 位置请求方式：... 4</p>
<p align="left">1.6.1 单次请求... 4</p>
<p align="left">1.6.2 重复请求... 5</p>
<p align="left"><strong>2. HTML5 离线功能... 5</strong></p>
<p align="left">2.1 简介：... 5</p>
<p align="left">2.1.1 离线资源缓存：... 5</p>
<p align="left">2.1.2 在线状态检测：... 5</p>
<p align="left">2.1.3 本地数据存储（Web Sotrage API）：... 5</p>
<p align="left">2.2 浏览器支持的情况：... 6</p>
<p align="left"><strong>3. Audio和Video标签... 6</strong></p>
<p align="left">3.1 各浏览器对编码格式的支持：... 6</p>
<p align="left">3.2 浏览器支持的检查方法：... 6</p>
<p align="left">3.3 标签使用方法：... 6</p>
<p align="left"><strong>4. WebSocket API 7</strong></p>
<p align="left">4.1 简介：... 7</p>
<p align="left">4.2 浏览器支持的情况：... 7</p>
<p align="left">4.3 浏览器支持的检查方法：... 8</p>
<p align="left"><strong>5. 跨文档消息机制（Cross Document Messaging）... 8</strong></p>
<p align="left">5.1 简介：... 8</p>
<p align="left">5.2 浏览器的支持情况：... 8</p>
<p align="left">5.3 浏览器支持的情况：... 8</p>
<p align="left"><strong>6. XMLHttpRequest Level 2. 8</strong></p>
<p align="left">6.1 简介：... 8</p>
<p align="left">6.2 浏览器支持情况：... 9</p>
<p align="left">6.3 浏览器支持的检查方法：... 9</p>
<p align="left"><strong>7. Web Worker API 9</strong></p>
<p align="left">7.1 简介：... 9</p>
<p align="left">7.2 浏览器支持的检查方法：... 9</p>
<p align="left"><strong>8. 其他HTML5支持的特性（部分未广泛支持）... 10</strong></p>
<p align="left"><strong>9. 总结... 10</strong></p>
<p align="left"><strong>第二章 jQuery Mobile. 10</strong></p>
<p align="left"><strong>1. 四大主流移动Web开发框架... 10</strong></p>
<p align="left">1.1 iUI: 10</p>
<p align="left">1.2 jQTouch: 10</p>
<p align="left">1.3 Sencha Touch：... 10</p>
<p align="left">1.4 jQuery Mobile: 11</p>
<p align="left"><strong>2.使用 jQuery Mobile. 11</strong></p>
<p align="left">2.1 简介：... 11</p>
<p align="left">2.2 整合jQuery Moblie + Google Maps API v3的界面... 12</p>
<span style="color: #000000;"><span style="color: #000000;"><span>
</span></span></span>
<p align="left"><strong><span style="font-size: small;">提纲：</span></strong></p>
<span style="color: #000000;"><span style="color: #000000;"><span>
</span></span></span>
<p align="left">1. Web App 开发之：HTML 5 技术要点 和 CSS 3 特性</p>
<p align="left">2. Web App 开发之：CSS 3 特性</p>
<p align="left">3. Web App 开发之：移动Web开发框架（jQuery Mobile）</p>
<span style="color: #000000;"><span style="color: #000000;"><span>
</span></span></span>
<p align="left"><strong><span style="font-size: medium;">第一章 HTML 5 的技术要点</span></strong></p>
<span style="color: #000000;"><span style="color: #000000;"><span>
</span></span></span>
<p align="left"><strong><span style="font-size: small;">1. 地理位置API</span></strong></p>
<span style="color: #000000;"><span style="color: #000000;"><span>
</span></span></span>
<p align="left"><strong>1.1 简介：</strong></p>
<p align="left">HTML5通过Geolocation API来支持检测用户位置。根据你的需求它提供了单次的位置接收以及持续的位置接收。</p>
<p align="left"><strong>1.2 获取地理位置的方式及其优缺点：</strong></p>
<p align="left">1、ip地址</p>
<p align="left">2、GPS</p>
<p align="left">3、WiFi基站的mac地址。（连接位置已知的公共WiFi的时候，通过Mac地址识别WiFi接入点，从而定位)</p>
<p align="left">4、 GSM或CDMA基站</p>
<p align="left"><strong>1.3 地理位置获取流程：</strong></p>
<p align="left">1、用户打开需要获取地理位置的web应用。</p>
<p align="left">2、应用向浏览器请求地理位置，浏览器弹出询问窗口，询问用户是否共享地理位置。</p>
<p align="left">3、假设用户允许，浏览器从设别查询相关信息。</p>
<p align="left">4、浏览器将相关信息发送到一个信任的位置服务器，服务器返回具体的地理位置。</p>
<p align="left"><strong>1.4 浏览器支持的情况：</strong></p>
<p align="left">当前版本的 Chrome、Firefox、Opera、Safari都支持，但IE9还不支持。</p>
<p align="left"><strong>1.5 浏览器支持的检查方法：</strong></p>
<p align="left">function loadDemo() {
if(navigator.geolocation) {
//supported</p>
<p align="left">} else {
//not supported
}
}</p>
<p align="left"><strong>1.6 位置请求方式：</strong></p>
<p align="left"><strong>1.6.1 单次请求</strong></p>
<p align="left">navigator.geolocation.getCurrentPosition(updateLocation, handleLocationError, options);</p>
<p align="left">回调函数updateLocation接受一个对象参数，表示当前的地理位置，它有如下属性：</p>
<p align="left">latitude——纬度
longitude——精度
accuracy——精确度，单位米
altitude——高度，单位米
altitudeAccuracy——高度的精确地，单位米
heading—运动的方向，相对于正北方向的角度
speed——运动的速度（假设你在地平线上运动），单位米/秒</p>
<p align="left">回调函数handleLocationError接受错误对象，error.code是如下错误号。</p>
<p align="left">UNKNOWN_ERROR (error code 0) —— 错误不在如下三种之内，你可以使用error.message获取错误详细信息。
PERMISSION_DENIED (error code 1)—— 用不选择不共享地理位置
POSITION_UNAVAILABLE (error code 2) ——无法获取当前位置
TIMEOUT (error code 3) ——在指定时间无法获取位置会触发此错误。</p>
<p align="left">第三个参数options是可选参数，属性如下：</p>
<p align="left">enableHighAccuracy——指示浏览器获取高精度的位置，默认为false。当开启后，可能没有任何影响，也可能使浏览器花费更长的时间获取更精确的位置数据。
timeout——指定获取地理位置的超时时间，默认不限时。单位为毫秒。
maximumAge——最长有效期，在重复获取地理位置时，此参数指定多久再次获取位置。默认为0，表示浏览器需要立刻重新计算位置。</p>
<p align="left">参数使用的例子如下：</p>
<p align="left">navigator.geolocation.getCurrentPosition(updateLocation,handleLocationError,</p>
<p align="left">{timeout:10000});</p>
<p align="left"><strong>1.6.2 重复请求</strong></p>
<p align="left">navigator.geolocation.watchPosition(updateLocation, handleLocationError);
使用 watchPosition可以持续获取地理位置，浏览器或多次调用updateLocation函数以便传递最新的位置。该函数返回一个watchID，使用navigator.geolocation.clearWatch(watchId)可以清除此次回调，使用不带参数的navigator.geolocation.clearWatch()清除说有watchPosition。</p>
<span style="color: #000000;"><span style="color: #000000;"><span>
</span></span></span>
<p align="left"><span style="font-size: small;"><strong>2. HTML5 离线功能</strong></span></p>
<span style="color: #000000;"><span style="color: #000000;"><span>
</span></span></span>
<p align="left"><strong>2.1 简介：</strong></p>
<p align="left">在开发支持离线的 Web 应用程序时，开发者通常需要使用以下三个方面的功能：</p>
<p align="left"><strong>2.1.1 离线资源缓存：</strong></p>
<p align="left">需要一种方式来指明应用程序离线工作时所需的资源文件。这样，浏览器才能在在线状态时，把这些文件缓存到本地。此后，当用户离线访问应用程序时，这些资源文件会自动加载，从而让用户正常使用。HTML5 中，通过 cache manifest 文件指明需要缓存的资源，并支持自动和手动两种缓存更新方式。</p>
<p align="left"><strong>2.1.2 在线状态检测：</strong></p>
<p align="left">开发者需要知道浏览器是否在线，这样才能够针对在线或离线的状态，做出对应的处理。在 HTML5 中，提供了两种检测当前网络是否在线的方式。</p>
<p align="left"><strong>2.1.3 本地数据存储（Web Sotrage API）：</strong></p>
<p align="left">离线时，需要能够把数据存储到本地，以便在线时同步到服务器上。为了满足不同的存储需求，HTML5 提供了 DOM Storage 和 Web SQL Database 两种存储机制。前者提供了易用的 key/value 对存储方式，而后者提供了基本的关系数据库存储功能。</p>
<p align="left">详情请参考：<a href="http://www.ibm.com/developerworks/cn/web/1011_guozb_html5off/" target="_blank">http://www.ibm.com/developerworks/cn/web/1011_guozb_html5off/</a>（使用 HTML5 开发离线应用）</p>
<p align="left"><strong>2.2 浏览器支持的情况：</strong></p>
<p align="left">浏览器支持情况：各大主流浏览器都已经实现了其中的很多功能。</p>
<span style="color: #000000;"><span style="color: #000000;"><span>
</span></span></span>
<p align="left"><span style="font-size: small;"><strong>3. Audio和Video标签</strong></span></p>
<span style="color: #000000;"><span style="color: #000000;"><span>
</span></span></span>
<p align="left"><strong>3.1 各浏览器对编码格式的支持：</strong></p>
<p align="left"><span style="color: #1d58d1;"><a href="http://images.cnblogs.com/cnblogs_com/charley_yang/201103/201103221743371462.jpg" target="_blank"><img src="http://images.cnblogs.com/cnblogs_com/charley_yang/201103/20110322174340260.jpg" alt="" height="318" border="0" /></a></span></p>
<p align="left">两个标签的实际使用，请参考w3school的教程。</p>
<p align="left">http://www.w3school.com.cn/html5/html5_audio.asp
<a href="http://www.w3school.com.cn/html5/html5_video.asp" target="_blank">http://www.w3school.com.cn/html5/html5_video.asp</a></p>
<p align="left"><strong>3.2 浏览器支持的检查方法：</strong></p>
<p align="left">var hasVideo = !!(document.createElement(‘video’).canPlayType);</p>
<p align="left"><strong>3.3 标签使用方法：</strong></p>
<p align="left">&#60;video src=”video.ogg”&#62;</p>
<p align="left">&#60;object data=”videoplayer.swf” type=”application/x-shockwave-flash”&#62;</p>
<p align="left">&#60;param name=”movie” value=”video.swf”/&#62;</p>
<p align="left">&#60;/object&#62;</p>
<p align="left">&#60;/video&#62;</p>
<p align="left">如果浏览器不支持HTML5的浏览器会载入flash标签，支持的则会优先选择HTML5的video标签。但这样必须准备两套视频格式了。</p>
<p align="left">同样对于audio元素，不同的浏览器支持不同的格式，可以提供两种不同的格式供浏览器选择。</p>
<p align="left">&#60;audio controls&#62;</p>
<p align="left">&#60;source src=”johann_sebastian_bach_air.ogg”&#62;</p>
<p align="left">&#60;source src=”johann_sebastian_bach_air.mp3″&#62;</p>
<p align="left">An audio clip from Johann Sebastian Bach.</p>
<p align="left">&#60;/audio&#62;</p>
<span style="color: #000000;"><span style="color: #000000;"><span>
</span></span></span>
<p align="left"><strong><span style="font-size: small;">4. WebSocket API</span></strong></p>
<span style="color: #000000;"><span style="color: #000000;"><span>
</span></span></span>
<p align="left"><strong>4.1 简介：</strong></p>
<p align="left">WebSocket API，浏览器和服务器只需要要做一个握手的动作，然后，浏览器和服务器之间就形成了一条快速通道。两者之间就直接可以数据互相传送。在此WebSocket 协议中，为我们实现即使服务带来了两大好处：</p>
<p align="left">1. Header</p>
<p align="left">互相沟通的Header是很小的-大概只有 2 Bytes</p>
<p align="left">2. Server Push</p>
<p align="left">服务器可以主动传送数据给客户端</p>
<p align="left">详细信息请查看：<a href="http://zh.wikipedia.org/zh-cn/WebSocket" target="_blank">http://zh.wikipedia.org/zh-cn/WebSocket</a></p>
<p align="left"><strong>4.2 浏览器支持的情况：</strong></p>
<p align="left">Chrome 4.0 supports Websockets.</p>
<p align="left">Firefox 4.0 beta supports WebSockets.</p>
<p align="left">Opera 11 (or 10.70) alpha also</p>
<p align="left">Safari 5.0.2 supports them too</p>
<p align="left">For other browsers it's not so clear.</p>
<p align="left"><strong>4.3 浏览器支持的检查方法：</strong></p>
<p align="left">function loadDemo() {</p>
<p align="left">if (window.WebSocket) {</p>
<p align="left">//support HTML5 WebSocket</p>
<p align="left">} else {</p>
<p align="left">//not support HTML5 WebSocket</p>
<p align="left">}</p>
<p align="left">}</p>
<span style="color: #000000;"><span style="color: #000000;"><span>
</span></span></span>
<p align="left"><strong><span style="font-size: small;">5. 跨文档消息机制（Cross Document Messaging）</span></strong></p>
<span style="color: #000000;"><span style="color: #000000;"><span>
</span></span></span>
<p align="left"><strong>5.1 简介：</strong></p>
<p align="left">PostMessage API 提供了跨越frame、tabs或windows通信的能力。</p>
<p align="left"><strong>5.2 浏览器的支持情况：</strong></p>
<p align="left"><span style="color: #1d58d1;"><a href="http://images.cnblogs.com/cnblogs_com/charley_yang/201103/201103221743417652.gif" target="_blank"><img src="http://images.cnblogs.com/cnblogs_com/charley_yang/201103/201103221743439963.gif" alt="" height="253" border="0" /></a></span></p>
<p align="left"><strong>5.3 浏览器支持的情况：</strong></p>
<p align="left">if (typeof window.postMessage === “undefined”) {
// postMessage not supported in this browser
}</p>
<span style="color: #000000;"><span style="color: #000000;"><span>
</span></span></span>
<p align="left"><span style="font-size: small;"><strong>6. XMLHttpRequest Level 2</strong></span></p>
<span style="color: #000000;"><span style="color: #000000;"><span>
</span></span></span>
<p align="left"><strong>6.1 简介：</strong></p>
<p align="left">HTML5中定义了XMLHttpRequest Level 2，它有两方面的增强：跨域通信，通信进度通知(progress events)</p>
<p align="left"><strong>6.2 浏览器支持情况：</strong></p>
<p align="left"><span style="color: #1d58d1;"><a href="http://images.cnblogs.com/cnblogs_com/charley_yang/201103/201103221743444291.gif" target="_blank"><img src="http://images.cnblogs.com/cnblogs_com/charley_yang/201103/201103221743491221.gif" alt="" height="277" border="0" /></a></span></p>
<p align="left"><strong>6.3 浏览器支持的检查方法：</strong></p>
<p align="left">var xhr = new XMLHttpRequest()</p>
<p align="left">if (typeof xhr.withCredentials === undefined) {</p>
<p align="left">//support HTML5 cross-origin XMLHttpRequest</p>
<p align="left">} else {</p>
<p align="left">//not support HTML5 cross-origin XMLHttpRequest</p>
<p align="left">}</p>
<span style="color: #000000;"><span style="color: #000000;"><span>
</span></span></span>
<p align="left"><span style="font-size: small;"><strong>7. Web Worker API</strong></span></p>
<span style="color: #000000;"><span style="color: #000000;"><span>
</span></span></span>
<p align="left"><strong>7.1 简介：</strong></p>
<p align="left">Web Worker可以在单独的线程中JS代码，但由于浏览器的特性，WebWorker无法访问dom，只能通过特定的事件和postMessage API和主线程通信。Web Worker可以使用timer API，在一个Worker中也可以启动子Worker。 WebWorder非常适合运算密集型的操作。</p>
<p align="left"><strong>7.2 浏览器支持的检查方法：</strong></p>
<p align="left">function loadDemo() {
if (typeof(Worker) !== “undefined”) {
//support HTML5 Web Workers”;
}
}</p>
<span style="color: #000000;"><span style="color: #000000;"><span>
</span></span></span>
<p align="left"><strong><span style="font-size: small;">8. 其他HTML5支持的特性（部分未广泛支持）</span></strong></p>
<span style="color: #000000;"><span style="color: #000000;"><span>
</span></span></span>
<p align="left">Canvas、表单API、WebGL、3D Shaders（3D阴影）、Devices标签、Audio Data API、针对触摸屏设备的事件、点对点网络通信</p>
<span style="color: #000000;"><span style="color: #000000;"><span>
</span></span></span>
<p align="left"><strong><span style="font-size: small;">9. 总结</span></strong></p>
<span style="color: #000000;"><span style="color: #000000;"><span>
</span></span></span>
<p align="left">Html 5 的这些新特性对我们创建丰富高效的 web 应用提供了很好的平台。我们可以尝试使用一些对我们项目有用的功能特性，走在 web 编程技术的最前沿。</p>
<span style="color: #000000;"><span style="color: #000000;"><span>
</span></span></span>
<p align="left"><span style="font-size: medium;"><strong>第二章 CSS 3</strong></span></p>
<p align="left"><strong>CSS 3 的新特性一览可以参考文章：</strong></p>
<p align="left"><span style="color: #1d58d1;"><a href="http://www.blueidea.com/tech/web/2009/6930.asp" target="_blank">http://www.blueidea.com/tech/web/2009/6930.asp</a></span></p>
<span style="color: #000000;"><span style="color: #000000;"><span>
</span></span></span>
<p align="left"><span style="font-size: medium;"><strong>第三章 jQuery Mobile</strong></span></p>
<span style="color: #000000;"><span style="color: #000000;"><span>
</span></span></span>
<p align="left"><strong><span style="font-size: small;">1. 四大主流移动Web开发框架</span></strong></p>
<span style="color: #000000;"><span style="color: #000000;"><span>
</span></span></span>
<p align="left"><strong>1.1 iUI:</strong></p>
<p align="left">它是一个javascript和css库，用于在网页中模拟iphone的外观和感觉。虽然是专为iphone设计的UI,但在android上90%以上的功能是完全可以使用的，因为android和iphone一样，都是基于webkit浏览器的系统。</p>
<p align="left">官方：<span style="color: #1d58d1;"><a href="http://code.google.com/p/iui/" target="_blank">http://code.google.com/p/iui/</a></span></p>
<span style="color: #000000;"><span style="color: #000000;"><span>
</span></span></span>
<p align="left"><strong>1.2 jQTouch:</strong></p>
<p align="left">是一个用于移动web开发的jquery插件，支持iphone,ipod touch和其它一些基于webkit的系统。</p>
<p align="left">官方：<span style="color: #1d58d1;"><a href="http://www.jqtouch.com/" target="_blank">http://www.jqtouch.com/</a></span></p>
<span style="color: #000000;"><span style="color: #000000;"><span>
</span></span></span>
<p align="left"><strong>1.3 Sencha Touch：</strong></p>
<p align="left">可以让你的Web App看起来像Native App。美丽的用户界面组件和丰富的数据管理，全部基于最新的HTML5和CSS3的 WEB标准，全面兼容Android和Apple iOS设备。</p>
<p align="left">官方：<span style="color: #1d58d1;"><a href="http://www.sencha.com/products/touch/" target="_blank">http://www.sencha.com/products/touch/</a></span></p>
<span style="color: #000000;"><span style="color: #000000;"><span>
</span></span></span>
<p align="left"><strong>1.4 jQuery Mobile:</strong></p>
<p align="left">也就是jquery针对移动设备的版本，上个月发布了jQuery Mobile Alpha 3。主要包括针对移动设备的 jquery core 和 jquery UI 。 支持目前主流的移动操作系统（android,iphone,Symbian,Blackbery,webOS等）。</p>
<span style="color: #000000;"><span style="color: #000000;"><span>
</span></span></span>
<p align="left"><strong>选择哪个框架？</strong></p>
<p align="left">目前最主流的是jQuery Mobile 和 Sencha Touch 2个框架，关于两者的区别引用国外论坛的一个简单评价：</p>
<p align="left">Sencha Touch is an application framework (you create your interface programmatically through Javascript) while jQuery Mobile is more of a mobile enhancement library (you write regular HTML for your content, then add jQuery mobile for transitions/animations). jQuery Mobile has an easier learning curve, but Sencha Touch can better simulate "native" apps.</p>
<p align="left"><strong>主要意思是说 jQuery Mobile 更轻量级以及更简单的学习曲线。</strong></p>
<p align="left"><strong>综合来看选择 jQuery Mobile 对于我们快速创建应用更加方便。</strong></p>
<span style="color: #000000;"><span style="color: #000000;"><span>
</span></span></span>
<p align="left"><span style="font-size: small;"><strong>2. 选择 jQuery Mobile</strong></span></p>
<span style="color: #000000;"><span style="color: #000000;"><span>
</span></span></span>
<p align="left"><strong>2.1 简介：</strong></p>
<p align="left">jQuery Mobile 给移动设备 Web 应用提供了一个 jQuery 核心库，并且提供了一个统一的 UI 框架。 jQuery Mobile 的其他优势有：</p>
<p align="left">1. 基于 jQuery 核心库;兼容所有主流移动设备</p>
<p align="left">2. 小巧(12KB)</p>
<p align="left">3. 基于 HTML5/CSS3</p>
<p align="left">4. 可用性和可访问性</p>
<p align="left">5. 以及强大的 UI 框架</p>
<p align="left">6. 使用 jQuery Mobile 搭建针对移动设备的 Web 应用, 开发者只需要负责 HTML 页面即可, 并且 jQuery Mobile 对 HTML 无侵害, 完全使用符合标准的 HTML5.</p>
<span style="color: #000000;"><span style="color: #000000;"><span>
</span></span></span>
<p align="left"><strong>2.2 整合jQuery Moblie + Google Maps API v3的界面</strong></p>
<span style="color: #000000;"><span style="color: #000000;"><span>
</span></span></span>
<p align="left"><strong>1). 在android上的显示效果：</strong></p>
<span style="color: #000000;"><span style="color: #000000;"><span>
</span></span></span>
<p align="left"><span style="color: #1d58d1;"><a href="http://images.cnblogs.com/cnblogs_com/charley_yang/201103/201103221739562091.png" target="_blank"><img src="http://images.cnblogs.com/cnblogs_com/charley_yang/201103/201103221739594236.png" alt="" height="484" border="0" /></a></span>   <span style="color: #1d58d1;"><a href="http://images.cnblogs.com/cnblogs_com/charley_yang/201103/201103221740326865.png" target="_blank"><img src="http://images.cnblogs.com/cnblogs_com/charley_yang/201103/201103221740495606.png" alt="" height="484" border="0" /></a></span></p>
<span style="color: #000000;"><span style="color: #000000;"><span>
</span></span></span>
<p align="left"><strong>2). 在iphone上的显示效果</strong>：</p>
<span style="color: #000000;"><span style="color: #000000;"><span>
</span></span></span>
<p align="left"><span style="color: #1d58d1;"><a href="http://images.cnblogs.com/cnblogs_com/charley_yang/201103/201103221740521131.png" target="_blank"><img src="http://images.cnblogs.com/cnblogs_com/charley_yang/201103/2011032217405528.png" alt="" height="484" border="0" /></a></span>   <span style="color: #1d58d1;"><a href="http://images.cnblogs.com/cnblogs_com/charley_yang/201103/201103221741245877.png" target="_blank"><img src="http://images.cnblogs.com/cnblogs_com/charley_yang/201103/201103221741373552.png" alt="" height="484" border="0" /></a></span></p>
<span style="color: #000000;"><span style="color: #000000;"><span>
</span></span></span>
<p align="left"><strong>从界面可以看出，使用jQuery Mobile 和 HTML 5 CSS 3技术开发出来的web程序界面效果和手机本地应用程序很像。</strong></p>
<p align="left"><strong>而且在不同平台下，只要手机浏览器支持HTML5，jQuery Mobile UI 框架都能帮我们做到兼容，免去很多适配的麻烦。</strong></p>]]></description>
		<wfw:commentRss>http://www.wumain.com/php/blog/archives/566/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>解决JS在firefox和IE下差异问题</title>
		<link>http://www.wumain.com/php/blog/archives/563</link>
		<comments>http://www.wumain.com/php/blog/archives/563#comments</comments>
		<pubDate>Mon, 21 Nov 2011 02:18:24 +0000</pubDate>
		<dc:creator>Ryan</dc:creator>
				<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[技术]]></category>
		<category><![CDATA[CSS]]></category>
		<category><![CDATA[FF]]></category>
		<category><![CDATA[FireFox.前端]]></category>
		<category><![CDATA[IE]]></category>
		<category><![CDATA[Javascrip]]></category>
		<category><![CDATA[js]]></category>
		<category><![CDATA[兼容]]></category>
		<category><![CDATA[浏览器]]></category>

		<guid isPermaLink="false">http://www.wumain.com/php/blog/?p=563</guid>
		<description><![CDATA[本文和大家重点讨论一下JS在firefox和IE下差异及解决方案，IE下，可以使用获取常规属性的方法来获取自定义属性,也可以使用getAttribute()获取自定义属性；Firefox下，只能使用getAttribute()获取自定义属性。

<strong>JS在firefox和IE下差异及解决方案</strong>

<strong>1.document.formName.item(itemName)问题</strong>

说明:

IE下,可以使用document.formName.item(itemName)或document.formName.elements[elementName];

Firefox下,只能使用document.formName.elements[elementName].
解决方法:统一使用document.formName.elements[elementName].

<strong>2.集合类对象问题</strong>

说明:IE下,可以使用()或[]获取集合类对象;Firefox下,只能使用[]获取集合类对象.
解决方法:统一使用[]获取集合类对象.

<strong>3.自定义属性问题</strong>

说明:IE下,可以使用获取常规属性的方法来获取自定义属性,也可以使用getAttribute()获取自定义属性;Firefox下,只能使用getAttribute()获取自定义属性.
解决方法:统一通过getAttribute()获取自定义属性.

<strong>4.eval(idName)问题</strong>

说明:IE下,,可以使用eval(idName)或getElementById(idName)来取得id为idName的HTML对象;Firefox下只能使用getElementById(idName)来取得id为idName的HTML对象.
解决方法:统一用getElementById(idName)来取得id为idName的HTML对象.

<strong>5.变量名与某HTML对象ID相同的问题</strong>

说明:IE下,HTML对象的ID可以作为document的下属对象变量名直接使用;Firefox下则不能.Firefox下,可以使用与HTML对象ID相同的变量名;IE下则不能。
解决方法:使用document.getElementById(idName)代替document.idName.最好不要取HTML对象ID相同的变量名,以减少错误;在声明变量时,一律加上var,以避免歧义.

<strong>6.const问题</strong>

说明:Firefox下,可以使用const关键字或var关键字来定义常量;IE下,只能使用var关键字来定义常量.
解决方法:统一使用var关键字来定义常量.

<strong>7.input.type属性问题</strong>

说明:IE下input.type属性为只读;但是Firefox下input.type属性为读写.

<strong>8.window.event问题</strong>

说明:window.event只能在IE下运行,而不能在Firefox下运行,这是因为Firefox的event只能在事件发生的现场使用.
解决方法:

IE:
<ol>
	<li>&#60;inputnameinputname=”Button8_1″type=”button”</li>
	<li>value=”IE”onclick=”javascript:gotoSubmit8_1()”/&#62;</li>
	<li>…</li>
	<li>&#60;scriptlanguagescriptlanguage=”javascript”&#62;</li>
	<li>functiongotoSubmit8_1(){</li>
	<li>…</li>
	<li>alert(window.event);//usewindow.event</li>
	<li>…</li>
	<li>}</li>
	<li>&#60;/script&#62;</li>
	<li>IE&#38;Firefox:</li>
	<li>&#60;inputnameinputname=”Button8_2″type=”button”</li>
	<li>value=”IE”onclick=”javascript:gotoSubmit8_2(event)”/&#62;</li>
	<li>…</li>
	<li>&#60;scriptlanguagescriptlanguage=”javascript”&#62;</li>
	<li>functiongotoSubmit8_2(evt){</li>
	<li>…</li>
	<li>evtevt=evt?evt:(window.event?window.event:null);</li>
	<li>alert(evt);//useevt</li>
	<li>…</li>
	<li>}</li>
	<li>&#60;/script&#62;</li>
</ol>
<strong>9.event.x与event.y问题</strong>

说明:IE下,even对象有x,y属性,但是没有pageX,pageY属性;Firefox下,even对象有pageX,pageY属性,但是没有x,y属性.
解决方法:使用mX(mX=event.x?event.x:event.pageX;)来代替IE下的event.x或者Firefox下的event.pageX.

<strong>10.event.srcElement问题</strong>

说明:IE下,even对象有srcElement属性,但是没有target属性;Firefox下,even对象有target属性,但是没有srcElement属性.
解决方法:使用obj(obj=event.srcElement?event.srcElement:event.target;)来代替IE下的event.srcElement或者Firefox下的event.target.

<strong>11.window.location.href问题</strong>

说明:IE或者Firefox2.0.x下,可以使用window.location或window.location.href;Firefox1.5.x下,只能使用window.location.
解决方法:使用window.location来代替window.location.href.

<strong>12.模态和非模态窗口问题</strong>

说明:IE下,可以通过showModalDialog和showModelessDialog打开模态和非模态窗口;Firefox下则不能.
解决方法:直接使用window.open(pageURL,name,parameters)方式打开新窗口。如果需要将子窗口中的参数传递回父窗口, 可以在子窗口中使用window.opener来访问父窗口.例如：varparWin=window.opener; parWin.document.getElementById(Aqing).value=Aqing;

<strong>13.frame问题</strong>

以下面的frame为例：
<ol>
	<li>&#60;framesrcframesrc=”xxx.html”id=”frameId”name=”frameName”/&#62;</li>
</ol>
(1)访问frame对象:

IE:使用window.frameId或者window.frameName来访问这个frame对象.
Firefox:只能使用window.frameName来访问这个frame对象.
另外，在IE和Firefox中都可以使用window.document.getElementById(frameId)来访问这个frame对象.

(2)切换frame内容:

在IE和Firefox中都可以使用window.document.getElementById(testFrame).src=xxx.html或window.frameName.location=xxx.html来切换frame的内容.
如果需要将frame中的参数传回父窗口，可以在frme中使用parent来访问父窗口。例如：parent.document.form1.filename.value=Aqing;

<strong>14.body问题</strong>

Firefox的body在body标签没有被浏览器完全读入之前就存在；而IE的body则必须在body标签被浏览器完全读入之后才存在.
Firefox：
<ol>
	<li>&#60;body&#62;</li>
	<li>&#60;scripttypescripttype=”text/javascript”&#62;</li>
	<li>document.body.onclick=function(evt){</li>
	<li>evtevt=evt&#124;&#124;window.event;</li>
	<li>alert(evt);</li>
	<li>}</li>
	<li>&#60;/script&#62;</li>
	<li>&#60;/body&#62;</li>
	<li>IE&#38;Firefox：</li>
	<li>&#60;body&#62;</li>
	<li>&#60;/body&#62;</li>
	<li>&#60;scripttypescripttype=”text/javascript”&#62;</li>
	<li>document.body.onclick=function(evt){</li>
	<li>evtevt=evt&#124;&#124;window.event;</li>
	<li>alert(evt);</li>
	<li>}&#60;/script&#62;</li>
</ol>
<strong>15.事件委托方法</strong>

IE：document.body.onload=inject;//Functioninject()在这之前已被实现
Firefox：document.body.onload=inject();
有人说标准是：
document.body.onload=newFunction(‘inject()’);

<strong>16.firefox与IE(parentElement)的父元素的区别</strong>

IE：obj.parentElement
firefox：obj.parentNode
解决方法:因为firefox与IE都支持DOM,因此使用obj.parentNode是不错选择.

<strong>17.cursor:handVScursor:pointer</strong>

firefox不支持hand，但ie支持pointer
解决方法:统一使用pointer

<strong>18.innerText在IE中能正常工作，但是innerText在FireFox中却不行.</strong>

解决方法:
<ol>
	<li>if(navigator.appName.indexOf(Explorer)&#62;-1){</li>
	<li>document.getElementById(‘element’).innerText=mytext;</li>
	<li>}else{</li>
	<li>document.getElementById(‘element’).textContent=mytext;</li>
	<li>}</li>
</ol>
<strong>19.FireFox中类似obj.style.height=imgObj.height的语句无效</strong>

解决方法：
obj.style.height=imgObj.height+’px’;

<strong>20.ie,firefox以及其它浏览器对于table标签的操作都各不相同。</strong>

在ie中不允许对table和tr的innerHTML赋值，使用js增加一个tr时，使用appendChile方法也不管用。

解决方法：
<ol>
	<li>//向table追加一个空行：</li>
	<li>varrow=otable.insertRow(-1);</li>
	<li>varcell=document.createElement(td);</li>
	<li>cell.innerHTML=;</li>
	<li>cell.className=XXXX;</li>
	<li>row.appendChild(cell);</li>
</ol>
<strong>21.padding问题</strong>

padding5px4px3px1pxFireFox无法解释简写,必须改成padding-top:5px;padding-right:4px;padding-bottom:3px;padding-left:1px;

<strong>22.消除ul、ol等列表的缩进时</strong>

样式应写成:list-style:none;margin:0px;padding:0px;
其中margin属性对IE有效，padding属性对FireFox有效

<strong>23.CSS透明</strong>

IE：filter:progid:DXImageTransform.Microsoft.Alpha(style=0,opacity=60)。
FF：opacity:0.6。

<strong>24.CSS圆角</strong>

IE：不支持圆角。
FF：-moz-border-radius:4px，或者-moz-border-radius-topleft:4px;-moz-border- radius-topright:4px;-moz-border-radius-bottomleft:4px;-moz-border- radius-bottomright:4px;。

转自：http://developer.51cto.com/art/201010/229176_3.htm]]></description>
		<wfw:commentRss>http://www.wumain.com/php/blog/archives/563/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>问君能有几多愁，as a boy without a girl [douban]</title>
		<link>http://www.wumain.com/php/blog/archives/559</link>
		<comments>http://www.wumain.com/php/blog/archives/559#comments</comments>
		<pubDate>Thu, 10 Nov 2011 04:27:53 +0000</pubDate>
		<dc:creator>Ryan</dc:creator>
				<category><![CDATA[心情]]></category>
		<category><![CDATA[2b]]></category>
		<category><![CDATA[douban]]></category>
		<category><![CDATA[weibo]]></category>
		<category><![CDATA[幽默]]></category>
		<category><![CDATA[微博]]></category>
		<category><![CDATA[搞笑]]></category>
		<category><![CDATA[豆瓣]]></category>

		<guid isPermaLink="false">http://www.wumain.com/php/blog/?p=559</guid>
		<description><![CDATA[众里寻他千百度，蓦然回首，Hey，how do you do。

云中谁寄锦书来？super high ,suck guy！

人生得意须尽欢，be a man,use your hand

身无彩凤双飞翼，Get away from me！

天生我材必有用，I can play football..

春城無處不飛花，let's go to the cinema

问君能有几多愁，as a boy without a girl (这句好美啊...)

问君能有几多愁，easy come easy go

春眠不觉晓，yo yo check it out

问世间情为何物，what the fuck can I do

曾经沧海难为水，what the fuck did you say

无可奈何花落去，I miss you missing me

此情可待成追忆，let it be

争渡，争渡，惊起一滩鸥鹭，who and who?

林花谢了春红，太匆匆,where is my iphone?

感时花溅泪,Changes is never too late~

满园春色关不住, Friday is coming soon~

床前明月光，there's something wrong~

两只黄鹂鸣翠柳，what place shall we go

空山新雨后 fire in the hole

两情若是长久时，you jump ,I jump

江山如此多娇，you are so small，惜秦皇汉武，too simple；唐宗宋祖，sometime naieve。 一代天骄，成吉思汗，can't play football。俱往矣，数风流, die all]]></description>
		<wfw:commentRss>http://www.wumain.com/php/blog/archives/559/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>一段很有意思的注释</title>
		<link>http://www.wumain.com/php/blog/archives/541</link>
		<comments>http://www.wumain.com/php/blog/archives/541#comments</comments>
		<pubDate>Sun, 22 May 2011 01:36:19 +0000</pubDate>
		<dc:creator>Ryan</dc:creator>
				<category><![CDATA[心情]]></category>
		<category><![CDATA[girl]]></category>
		<category><![CDATA[代码]]></category>
		<category><![CDATA[变量]]></category>
		<category><![CDATA[注释]]></category>
		<category><![CDATA[程序员]]></category>

		<guid isPermaLink="false">http://www.wumain.com/php/blog/?p=541</guid>
		<description><![CDATA[今天看一个代码，里面有一个变量的名字很奇怪，叫lizzy，我完全不知道是为什么。看了作者的头注释，发现有这么一句话：Lizzy, no girls I met can replace you, yet I was replace. Nothing is meaningful without you. 原来是一个失意的程序员啊！]]></description>
		<wfw:commentRss>http://www.wumain.com/php/blog/archives/541/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>一瞬间又以为那个熟悉的DOMO回来了 &#8212; 国产独立游戏《姜太公的小岛》发布</title>
		<link>http://www.wumain.com/php/blog/archives/527</link>
		<comments>http://www.wumain.com/php/blog/archives/527#comments</comments>
		<pubDate>Sun, 24 Apr 2011 08:11:42 +0000</pubDate>
		<dc:creator>Ryan</dc:creator>
				<category><![CDATA[兴趣]]></category>
		<category><![CDATA[游戏]]></category>
		<category><![CDATA[DOMO]]></category>
		<category><![CDATA[GAME]]></category>
		<category><![CDATA[单机]]></category>
		<category><![CDATA[发布]]></category>
		<category><![CDATA[回忆]]></category>
		<category><![CDATA[国产]]></category>
		<category><![CDATA[姜太公的小岛]]></category>
		<category><![CDATA[轩辕剑]]></category>

		<guid isPermaLink="false">http://www.wumain.com/php/blog/?p=527</guid>
		<description><![CDATA[<div id="blogDetailDiv" style="font-size: 14px;">

这是一种全新模式、前所未闻、甚至让你感到匪夷所思的单机独立游戏。这是一个虽然没有华丽的画面，却真正把“游戏”当做艺术创作载体的作品。这是一个没有侠骨柔情、没有霸气外露、却有着自己灵魂的游戏，萦绕着整个游戏全程的，是制作者对我们所生活的时代不羁的戏谑、调侃、反思与展望。

<span style="font-size: 14px; line-height: 22px;">在游戏的世界中，你我都曾见过现代战场的烽火连天，也曾见过架空武侠世界的情深意浓，但你一定未曾见过像《姜太公的小岛》这样，以我们耳熟能详、曾思辨万千却而不敢言说的点点滴滴汇成的游戏。如果用电影来做比喻，《使命召唤》、《古剑奇谭》是高投资的大片，那么《姜太公的小岛》就是带着独立思想的文艺片，而正是这样的独立制作，象征着国产单机游戏正在强势回归。</span>

<span style="font-size: 14px; line-height: 22px;">在两三个小时、一部电影的时间内，《姜太公的小岛》将让你见到以前从未见过的全新世界。</span>

<span style="font-size: 14px; line-height: 22px;"><img class="aligncenter size-medium wp-image-520" title="1" src="http://www.wumain.com/php/blog/wp-content/uploads/2011/04/11.jpg" alt="" /></span>

&#160;

<span style="font-size: 14px; line-height: 22px;">《姜太公的小岛》游戏信息</span>

<span style="font-size: 14px; line-height: 22px;">游戏类型：新式武侠战棋（可在游戏内降级为文字冒险）</span>

<span style="font-size: 14px; line-height: 22px;">运营模式：完整版免费，在完整版中故事已告一段落，并可运行自由模式</span>

<span style="font-size: 14px; line-height: 22px;">发布日期：2011年4月初</span>

<span style="font-size: 14px; line-height: 22px;">官网论坛：Http://bbs.66rpg.com/GD</span>

<span style="font-size: 14px; line-height: 22px;"><span style="line-height: 18px; color: #ff0000;">——————————————————————————————</span></span><span style="line-height: 18px; color: #ff0000; font-size: 14px;">———</span><span style="line-height: 18px; color: #ff0000; font-size: 14px;">——</span>

<span style="font-size: 14px; line-height: 22px;"><span style="color: #ff0000;"><strong>游戏下载：</strong></span></span><a href="http://ftp.66rpg.com/f2011/gd/JTG_0328_CORE_SNS.rar" target="_blank">http://ftp.66rpg.com/f2011/gd/JTG_0328_CORE_SNS.rar</a>

由清莞演唱的游戏主题曲《沉浮》：<a href="http://yc.5sing.com/606639.html" target="_blank">http://yc.5sing.com/606639.html</a>

<span style="color: #ff0000;">————————————————————————————————</span><span style="line-height: 18px; color: #ff0000; font-size: 14px;">———</span>

<span style="font-size: 14px; line-height: 22px;">游戏时长：约2.5小时</span>

<span style="font-size: 14px; line-height: 22px;">适合年龄：已经毕业、离开学校的成年玩家</span>

<span style="font-size: 14px; line-height: 22px;">剧情摘要：元朝末年，倭寇攻打姜太公的小岛，爱国青年张立昆、常遇春等人自发乘船前往姜太公的小岛保卫祖国.在岛上战斗的时期，他们遇到各种让他们感到困惑的事情，也见到了有着不同背景的人：有情有义的狐妖，甘做汉奸的大叔和小萝莉，冷酷无情的剑圣……等在命运前方的究竟是什么呢？这是复兴的盛世时代，这也是一个被华夏子民遗忘了国之四维的时代……</span>

<span style="font-size: 14px; line-height: 22px;">游戏截图：</span>

<span style="font-size: 14px; line-height: 22px;"><a href="http://www.wumain.com/php/blog/wp-content/uploads/2011/04/21.jpg"><a href="http://www.wumain.com/php/blog/wp-content/uploads/2011/04/21.jpg"><img class="aligncenter size-full wp-image-521" title="2" src="http://www.wumain.com/php/blog/wp-content/uploads/2011/04/21.jpg" alt="" width="533" height="800" /></a></a></span>

<span style="font-size: 14px; line-height: 22px;"><a href="http://www.wumain.com/php/blog/wp-content/uploads/2011/04/3.jpg"><a href="http://www.wumain.com/php/blog/wp-content/uploads/2011/04/3.jpg"><img class="aligncenter size-full wp-image-522" title="3" src="http://www.wumain.com/php/blog/wp-content/uploads/2011/04/3.jpg" alt="" width="533" height="800" /></a></a></span>

<span style="font-size: 14px; line-height: 22px;"><a href="http://www.wumain.com/php/blog/wp-content/uploads/2011/04/4.jpg"><a href="http://www.wumain.com/php/blog/wp-content/uploads/2011/04/4.jpg"><img class="aligncenter size-full wp-image-523" title="4" src="http://www.wumain.com/php/blog/wp-content/uploads/2011/04/4.jpg" alt="" width="533" height="800" /></a></a></span>

&#160;

<span style="font-size: 14px; line-height: 22px;">作者的话：</span>

<span style="font-size: 14px; line-height: 22px;">一直到现在，绝大多数的人都还是认为电脑游戏只是一个娱乐性的小玩具，最多也就是能和别人交流的玩具（网游）。就像其他的艺术形式在某个地域刚刚问世的时候一样</span><span style="line-height: 22px; font-size: 14px;">（如现在的</span><span style="line-height: 22px; font-size: 14px;">印度</span><span style="line-height: 22px; font-size: 14px;">电影</span><span style="line-height: 22px; font-size: 14px;">、80年代末的</span><span style="line-height: 22px; font-size: 14px;">日本</span><span style="line-height: 22px; font-size: 14px;">主机游戏等）</span><span style="line-height: 22px; font-size: 14px;">，初期也是只有娱乐功能，而随着产业的进步，这些本来就有着巨大潜力的艺术形式终有一部分会进化，成为表达制作人艺术理念的载体。《姜太公的小岛》就是这样的一个游戏。</span>

<span style="line-height: 22px; font-size: 14px;">现在的我们，生活在一个经济繁荣的好时代，也生活在一个家长不敢让小孩自己上下学的糟糕时代。我们会为了内陆的天灾而落泪捐款，也会冷漠甚至恐惧地躲开路边摔倒的老人。《姜太公的小岛》诞生在这样的环境中，我们这一代年轻人的浮躁与迷惘，也融入在了游戏的剧情中。每个剧情角色的背后，每一段带有隐喻的剧情，都象征着我们社会的一个视角。相信不同年龄段的玩家看到这些剧情，都会有着完全不一样的理解：年轻还没走出学校的玩家可能只看到热血和战斗，而已经在社会上打拼过几年的玩家可能会看到贯穿整个游戏的一声深沉的叹息。</span>

<span style="font-size: 14px; line-height: 22px;">过去，我国从来没有人这么制作游戏，这次之后，可能短时间内也不会有人再这么制作游戏。这不是一个完美的作品，但真的是一个用心的作品，希望我的努力会得到你的肯定。</span>

<span style="font-size: 14px; line-height: 22px;"><a href="http://www.wumain.com/php/blog/wp-content/uploads/2011/04/5.jpg"><a href="http://www.wumain.com/php/blog/wp-content/uploads/2011/04/5.jpg"><img class="aligncenter size-full wp-image-524" title="5" src="http://www.wumain.com/php/blog/wp-content/uploads/2011/04/5.jpg" alt="" width="533" height="800" /></a></a></span>

<span style="font-size: 14px; line-height: 22px;"><a href="http://www.wumain.com/php/blog/wp-content/uploads/2011/04/6.jpg"><a href="http://www.wumain.com/php/blog/wp-content/uploads/2011/04/6.jpg"><img class="aligncenter size-full wp-image-525" title="6" src="http://www.wumain.com/php/blog/wp-content/uploads/2011/04/6.jpg" alt="" width="533" height="800" /></a></a></span>

<span style="font-size: 14px; line-height: 22px;"><a href="http://www.wumain.com/php/blog/wp-content/uploads/2011/04/7.jpg"><a href="http://www.wumain.com/php/blog/wp-content/uploads/2011/04/7.jpg"><img class="aligncenter size-full wp-image-526" title="7" src="http://www.wumain.com/php/blog/wp-content/uploads/2011/04/7.jpg" alt="" width="533" height="800" /></a></a></span>

<span style="font-size: 14px; line-height: 22px;">p.s. </span><span style="line-height: 22px; font-size: 14px;">有玩家说在玩通所有前因后果隐藏剧情后，听着主题曲默默流下了眼泪。我当时还想：一个没有爱情，没有故意煽情，也没有侠骨柔情的游戏，怎么会有人玩到流泪呢？也许一句诗可以代表这种情感吧：“为什么我的眼里含着泪水？因为我对这土地爱得深沉”。我想这位玩家可能在一定程度上代表了《姜太公的小岛》的玩家群吧：睿智、看清社会、却不愿放弃过去的梦想……</span>

</div>]]></description>
		<wfw:commentRss>http://www.wumain.com/php/blog/archives/527/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>笑死偶了，这才是真有才！ 快乐大本营,刘大成</title>
		<link>http://www.wumain.com/php/blog/archives/515</link>
		<comments>http://www.wumain.com/php/blog/archives/515#comments</comments>
		<pubDate>Fri, 22 Apr 2011 16:35:40 +0000</pubDate>
		<dc:creator>Ryan</dc:creator>
				<category><![CDATA[心情]]></category>
		<category><![CDATA[刘大成]]></category>
		<category><![CDATA[幽默]]></category>
		<category><![CDATA[强]]></category>
		<category><![CDATA[快乐大本营]]></category>
		<category><![CDATA[搞笑]]></category>
		<category><![CDATA[无敌]]></category>
		<category><![CDATA[有才]]></category>
		<category><![CDATA[爆笑]]></category>
		<category><![CDATA[牛人]]></category>
		<category><![CDATA[笑]]></category>

		<guid isPermaLink="false">http://www.wumain.com/php/blog/?p=515</guid>
		<description><![CDATA[<embed src="http://player.ku6.com/refer/Q3OuMRVXX7_XFEMv/v.swf" quality="high" width="480" height="400" align="middle" allowScriptAccess="always" allowfullscreen="true" type="application/x-shockwave-flash"></embed>]]></description>
		<wfw:commentRss>http://www.wumain.com/php/blog/archives/515/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>[JQUERY]倒计时插件</title>
		<link>http://www.wumain.com/php/blog/archives/507</link>
		<comments>http://www.wumain.com/php/blog/archives/507#comments</comments>
		<pubDate>Fri, 22 Apr 2011 03:41:17 +0000</pubDate>
		<dc:creator>Ryan</dc:creator>
				<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[技术]]></category>
		<category><![CDATA[jq]]></category>
		<category><![CDATA[jquery]]></category>
		<category><![CDATA[plugin]]></category>
		<category><![CDATA[倒计时]]></category>
		<category><![CDATA[插件]]></category>

		<guid isPermaLink="false">http://www.wumain.com/php/blog/?p=507</guid>
		<description><![CDATA[倒计时业务最近似乎又开始多了，封装个插件方便使用，目前功能比较简单，可以实现纯数字和图片倒计时

要求 Jquery 1.3+ 
包含文件 ：


<blockquote>
http://res.static.sdo.com/jQuery/jquery-1.5.2.min.js
http://res.static.sdo.com/Ryan/CountDown.js
</blockquote>


调用方式：

<blockquote>$(document).ready(function(){
         $.fn.CountDown({
                   bodyContent             : 'showNum',                                                                                                                                                       //显示容器名
                   basicNum                   : 9280,                                                                                                                                                                    //初始基数         
             timeStamp                 : 68,                                                                                                                                                                         //递增数，每分钟递增
             timeInterval              :1000,                                                                                                                                                                     //显示刷新间隔
             startDate                   : new Date('2011/4/15 16:48'),                                                                                                                       //起始时间
             txtFormat                  : '0000000',                                                                                                                                                           //显示长度，有多少0显示多少位
             showZero                   : 1,                                                                                                                                                                           //显示，不足0的是否补0，1补 0不补
             wrap                            : '',                                                                                                                                                                                                                                                      
             modelUrl                    : http://pic.static.sdo.com/Woool/Woool_act/project/201104_4s/no_{1}.jpg',  //显示形态 {1} 会被替换为0-9的数字， img_{1}.jpg被替换成img_0.jpg ... 图片显示倒计时时使用，纯数字则为{1}
             flashModel                : 1                                                                                                                                                                             //是否需要刷新，0为只显示当前最后一次倒计时数据，1则会根据timeStamp，timeInterval 数据不断刷新倒计时
         }); 
});</blockquote>



刚刚完成只在两个应用上使用，发现BUG可以告知我，谢谢


<script src="http://res.static.sdo.com/jQuery/jquery-1.5.2.min.js" type="text/javascript"></script> <script src="http://res.static.sdo.com/Ryan/CountDown.js" type="text/javascript"></script>
<script type="text/javascript">$(document).ready(function(){
		$.fn.CountDown({
			bodyContent	: 'showNum', 																							//显示容器名
			basicNum		: 9280,																										//初始基数	
    	timeStamp		: 68,																											//递增数，每分钟递增
    	timeInterval:	1000,																										//显示刷新间隔
    	startDate		: new Date('2011/4/15 16:48'),														//起始时间
	    txtFormat		: '0000000',																							//显示长度，有多少0显示多少位
	    showZero		: 1,																											//显示，不足0的是否补0，1补 0不补
	    wrap				: '',																											
	    modelUrl		: '&#160;<img src="http://pic.static.sdo.com/Woool/Woool_act/project/201104_4s/no_{1}.jpg" />', //显示形态 {1} 会被自动替换为0-9的数字， img_{1}.jpg 会被替换成 img_0.jpg ... 用在图片显示倒计时时使用，如果纯数字则为{1}
    	flashModel	: 1																												//是否需要刷新，0为只显示当前最后一次倒计时数据，1则会根据timeStamp，timeInterval 数据不断刷新倒计时
		});$.fn.CountDown({
			bodyContent	: 'ActiveNum',
			basicNum		: 9280,
    	timeStamp		: 99,
    	timeInterval:	1000,
    	startDate		: new Date('2011/4/15 16:48'),
	    txtFormat		: '0000000',
	    showZero		: 1,
	    wrap				: '',
	    modelUrl		: '{1}',
    	flashModel	: 1
		});$.fn.CountDown({
			bodyContent	: 'DownloadNum',
			basicNum		: 200000,
    	timeStamp		: 60,
    	timeInterval:	1000,
    	startDate		: new Date('2011/4/19 16:59'),
	    txtFormat		: '0000000',
	    showZero		: 0,
	    wrap				: '',
	    modelUrl		: '{1}',
    	flashModel	: 1
		});
	});
// ]]&#62;</script>
<div>图片: <span id="showNum" class="no"> </span></div>
&#160;
<div>文字倒计时: [<strong><span style="color: red;"><span id="ActiveNum">0</span></span></strong>]</div>
&#160;
<div>文字倒计时: [<strong><span style="color: red;"><span id="DownloadNum">0</span></span></strong>]</div>
&#160;]]></description>
		<wfw:commentRss>http://www.wumain.com/php/blog/archives/507/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>郁闷的三国杀</title>
		<link>http://www.wumain.com/php/blog/archives/503</link>
		<comments>http://www.wumain.com/php/blog/archives/503#comments</comments>
		<pubDate>Mon, 18 Apr 2011 15:31:42 +0000</pubDate>
		<dc:creator>Ryan</dc:creator>
				<category><![CDATA[心情]]></category>
		<category><![CDATA[一手闪]]></category>
		<category><![CDATA[三国杀]]></category>
		<category><![CDATA[郁闷]]></category>

		<guid isPermaLink="false">http://www.wumain.com/php/blog/?p=503</guid>
		<description><![CDATA[<a href="http://www.wumain.com/php/blog/wp-content/uploads/2011/04/1.jpg"><img src="http://www.wumain.com/php/blog/wp-content/uploads/2011/04/1-300x224.jpg" alt="" title="1" width="300" height="224" class="aligncenter size-medium wp-image-504" /></a>

<a href="http://www.wumain.com/php/blog/wp-content/uploads/2011/04/2.jpg"><img src="http://www.wumain.com/php/blog/wp-content/uploads/2011/04/2-300x224.jpg" alt="" title="2" width="300" height="224" class="aligncenter size-medium wp-image-505" /></a>]]></description>
		<wfw:commentRss>http://www.wumain.com/php/blog/archives/503/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>经典FC游戏一命通关</title>
		<link>http://www.wumain.com/php/blog/archives/499</link>
		<comments>http://www.wumain.com/php/blog/archives/499#comments</comments>
		<pubDate>Sun, 17 Apr 2011 07:30:25 +0000</pubDate>
		<dc:creator>Ryan</dc:creator>
				<category><![CDATA[兴趣]]></category>
		<category><![CDATA[游戏]]></category>
		<category><![CDATA[FC]]></category>
		<category><![CDATA[一命]]></category>
		<category><![CDATA[游戏机]]></category>
		<category><![CDATA[经典]]></category>
		<category><![CDATA[通关]]></category>

		<guid isPermaLink="false">http://www.wumain.com/php/blog/?p=499</guid>
		<description><![CDATA[《上尉密令》一命速攻 14：34

<embed src="http://player.youku.com/player.php/sid/XODI3NjE0OTI=/v.swf" quality="high" width="480" height="400" align="middle" allowScriptAccess="sameDomain" type="application/x-shockwave-flash"></embed>

《人间兵器》一命速攻 IN 11：04

<embed src="http://player.youku.com/player.php/sid/XNzU1MTkxOTI=/v.swf" quality="high" width="480" height="400" align="middle" allowScriptAccess="sameDomain" type="application/x-shockwave-flash"></embed>

《鳄鱼先生》一命速攻 IN 17：14

<embed src="http://player.youku.com/player.php/sid/XNzg0NjMzNjA=/v.swf" quality="high" width="480" height="400" align="middle" allowScriptAccess="sameDomain" type="application/x-shockwave-flash"></embed>

《鲁邦三世》一命速攻 IN 12：24

<embed src="http://player.youku.com/player.php/sid/XODI2Mzc3MDA=/v.swf" quality="high" width="480" height="400" align="middle" allowScriptAccess="sameDomain" type="application/x-shockwave-flash"></embed>

《星际魂斗罗》一命速攻 IN 9：32

<embed src="http://player.youku.com/player.php/sid/XODAxNzM2Mjg=/v.swf" quality="high" width="480" height="400" align="middle" allowScriptAccess="sameDomain" type="application/x-shockwave-flash"></embed>]]></description>
		<wfw:commentRss>http://www.wumain.com/php/blog/archives/499/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>这个家搬的很有喜感</title>
		<link>http://www.wumain.com/php/blog/archives/465</link>
		<comments>http://www.wumain.com/php/blog/archives/465#comments</comments>
		<pubDate>Tue, 05 Apr 2011 11:00:06 +0000</pubDate>
		<dc:creator>Ryan</dc:creator>
				<category><![CDATA[心情]]></category>
		<category><![CDATA[喜感]]></category>
		<category><![CDATA[搬家]]></category>
		<category><![CDATA[看看國外學生怎麼搬家]]></category>
		<category><![CDATA[超強搬家]]></category>

		<guid isPermaLink="false">http://www.wumain.com/php/blog/?p=465</guid>
		<description><![CDATA[<embed src="http://player.youku.com/player.php/sid/XMjU0MTYzNzA0/v.swf" quality="high" width="480" height="400" align="middle" allowScriptAccess="sameDomain" type="application/x-shockwave-flash"></embed>]]></description>
		<wfw:commentRss>http://www.wumain.com/php/blog/archives/465/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>吊坠</title>
		<link>http://www.wumain.com/php/blog/archives/459</link>
		<comments>http://www.wumain.com/php/blog/archives/459#comments</comments>
		<pubDate>Tue, 29 Mar 2011 16:25:24 +0000</pubDate>
		<dc:creator>Ryan</dc:creator>
				<category><![CDATA[兴趣]]></category>
		<category><![CDATA[摄影]]></category>
		<category><![CDATA[ED6]]></category>
		<category><![CDATA[Lomo]]></category>
		<category><![CDATA[吊坠]]></category>
		<category><![CDATA[徽章]]></category>
		<category><![CDATA[游击士]]></category>
		<category><![CDATA[空之轨迹]]></category>
		<category><![CDATA[英雄传说]]></category>

		<guid isPermaLink="false">http://www.wumain.com/php/blog/?p=459</guid>
		<description><![CDATA[<a href="http://www.wumain.com/php/blog/wp-content/uploads/2011/03/IMG_0410.jpg"><img src="http://www.wumain.com/php/blog/wp-content/uploads/2011/03/IMG_0410-300x300.jpg" alt="" title="IMG_0410" width="300" height="300" class="aligncenter size-medium wp-image-460" /></a>

<a href="http://www.wumain.com/php/blog/wp-content/uploads/2011/03/IMG_0418.jpg"><img src="http://www.wumain.com/php/blog/wp-content/uploads/2011/03/IMG_0418-300x300.jpg" alt="" title="IMG_0418" width="300" height="300" class="aligncenter size-medium wp-image-461" /></a>]]></description>
		<wfw:commentRss>http://www.wumain.com/php/blog/archives/459/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>神奇的表面移动机 SWITL</title>
		<link>http://www.wumain.com/php/blog/archives/457</link>
		<comments>http://www.wumain.com/php/blog/archives/457#comments</comments>
		<pubDate>Mon, 28 Mar 2011 10:46:21 +0000</pubDate>
		<dc:creator>Ryan</dc:creator>
				<category><![CDATA[心情]]></category>
		<category><![CDATA[SWITL]]></category>
		<category><![CDATA[优酷]]></category>
		<category><![CDATA[表面移动机]]></category>
		<category><![CDATA[视频]]></category>

		<guid isPermaLink="false">http://www.wumain.com/php/blog/?p=457</guid>
		<description><![CDATA[<embed type="application/x-shockwave-flash" width="480" height="400" src="http://player.youku.com/player.php/sid/XMjU0MjYyNDE2/v.swf" quality="high" align="middle" allowscriptaccess="sameDomain"></embed>]]></description>
		<wfw:commentRss>http://www.wumain.com/php/blog/archives/457/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>ADO constants</title>
		<link>http://www.wumain.com/php/blog/archives/455</link>
		<comments>http://www.wumain.com/php/blog/archives/455#comments</comments>
		<pubDate>Mon, 28 Mar 2011 06:57:22 +0000</pubDate>
		<dc:creator>Ryan</dc:creator>
				<category><![CDATA[ASP]]></category>
		<category><![CDATA[SQL]]></category>
		<category><![CDATA[存储过程]]></category>

		<guid isPermaLink="false">http://www.wumain.com/php/blog/?p=455</guid>
		<description><![CDATA['---- DataTypeEnum Values ----
Const adEmpty = 0
Const adTinyInt = 16
Const adSmallInt = 2
Const adInteger = 3
Const adBigInt = 20
Const adUnsignedTinyInt = 17
Const adUnsignedSmallInt = 18
Const adUnsignedInt = 19
Const adUnsignedBigInt = 21
Const adSingle = 4
Const adDouble = 5
Const adCurrency = 6
Const adDecimal = 14
Const adNumeric = 131
Const adBoolean = 11
Const adError = 10
Const adUserDefined = 132
Const adVariant = 12
Const adIDispatch = 9
Const adIUnknown = 13
Const adGUID = 72
Const adDate = 7
Const adDBDate = 133
Const adDBTime = 134
Const adDBTimeStamp = 135
Const adBSTR = 8
Const adChar = 129
Const adVarChar = 200
Const adLongVarChar = 201
Const adWChar = 130
Const adVarWChar = 202
Const adLongVarWChar = 203
Const adBinary = 128
Const adVarBinary = 204
Const adLongVarBinary = 205
Const adChapter = 136
Const adFileTime = 64
Const adPropVariant = 138
Const adVarNumeric = 139
Const adArray = &#38;H2000
Const adUseClient = 3
Const adOpenForwardOnly = 0
Const adLockReadOnly = 1
Const adCmdStoredProc = &#38;H0004
Const adExecuteNoRecords = &#38;H00000080
Const adOpenStatic = 3
Const adCmdText = &#38;H0001
Const adBookmarkCurrent = 0
Const adParamUnknown = &#38;H0000
Const adParamInput = &#38;H0001
Const adParamOutput = &#38;H0002
Const adParamInputOutput = &#38;H0003
Const adParamReturnValue = &#38;H0004]]></description>
		<wfw:commentRss>http://www.wumain.com/php/blog/archives/455/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>再玩次LOMO，老东西</title>
		<link>http://www.wumain.com/php/blog/archives/447</link>
		<comments>http://www.wumain.com/php/blog/archives/447#comments</comments>
		<pubDate>Sun, 27 Mar 2011 07:33:55 +0000</pubDate>
		<dc:creator>Ryan</dc:creator>
				<category><![CDATA[兴趣]]></category>
		<category><![CDATA[摄影]]></category>
		<category><![CDATA[CHH]]></category>
		<category><![CDATA[Chiphell]]></category>
		<category><![CDATA[Iphone]]></category>
		<category><![CDATA[Lomo]]></category>
		<category><![CDATA[Lomolomo]]></category>
		<category><![CDATA[小恶魔]]></category>
		<category><![CDATA[微摄影]]></category>
		<category><![CDATA[拍照]]></category>
		<category><![CDATA[猫]]></category>

		<guid isPermaLink="false">http://www.wumain.com/php/blog/?p=447</guid>
		<description><![CDATA[<a href="http://www.wumain.com/php/blog/wp-content/uploads/2011/03/IMG_0358.jpg"><img class="aligncenter size-medium wp-image-450" title="IMG_0358" src="http://www.wumain.com/php/blog/wp-content/uploads/2011/03/IMG_0358-300x300.jpg" alt="" width="300" height="300" /></a>

<a href="http://www.wumain.com/php/blog/wp-content/uploads/2011/03/IMG_0365.jpg"><img class="aligncenter size-medium wp-image-451" title="IMG_0365" src="http://www.wumain.com/php/blog/wp-content/uploads/2011/03/IMG_0365-300x300.jpg" alt="" width="300" height="300" /></a>

<a href="http://www.wumain.com/php/blog/wp-content/uploads/2011/03/IMG_0357.jpg"><img class="aligncenter size-medium wp-image-449" title="IMG_0357" src="http://www.wumain.com/php/blog/wp-content/uploads/2011/03/IMG_0357-300x300.jpg" alt="" width="300" height="300" /></a>

<a href="http://www.wumain.com/php/blog/wp-content/uploads/2011/03/mao.jpg"><img class="aligncenter size-medium wp-image-452" title="mao" src="http://www.wumain.com/php/blog/wp-content/uploads/2011/03/mao-300x300.jpg" alt="" width="300" height="300" /></a>]]></description>
		<wfw:commentRss>http://www.wumain.com/php/blog/archives/447/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>LOMO也挺好玩</title>
		<link>http://www.wumain.com/php/blog/archives/408</link>
		<comments>http://www.wumain.com/php/blog/archives/408#comments</comments>
		<pubDate>Sat, 26 Mar 2011 14:25:35 +0000</pubDate>
		<dc:creator>Ryan</dc:creator>
				<category><![CDATA[兴趣]]></category>
		<category><![CDATA[摄影]]></category>
		<category><![CDATA[Iphone]]></category>
		<category><![CDATA[Lomo]]></category>
		<category><![CDATA[Lomolomo]]></category>
		<category><![CDATA[微摄影]]></category>
		<category><![CDATA[拍照]]></category>

		<guid isPermaLink="false">http://www.wumain.com/php/blog/?p=408</guid>
		<description><![CDATA[<a href="http://www.wumain.com/php/blog/wp-content/uploads/2011/03/IMG_0315.jpg"><img src="http://www.wumain.com/php/blog/wp-content/uploads/2011/03/IMG_0315-300x300.jpg" alt="" title="IMG_0315" width="300" height="300" class="aligncenter size-medium wp-image-409" /></a><a href="http://www.wumain.com/php/blog/wp-content/uploads/2011/03/IMG_0326.jpg"><img src="http://www.wumain.com/php/blog/wp-content/uploads/2011/03/IMG_0326-300x300.jpg" alt="" title="IMG_0326" width="300" height="300" class="aligncenter size-medium wp-image-410" /></a><a href="http://www.wumain.com/php/blog/wp-content/uploads/2011/03/IMG_0336.jpg"><img src="http://www.wumain.com/php/blog/wp-content/uploads/2011/03/IMG_0336-300x300.jpg" alt="" title="IMG_0336" width="300" height="300" class="aligncenter size-medium wp-image-412" /></a><a href="http://www.wumain.com/php/blog/wp-content/uploads/2011/03/IMG_0332.jpg"><img src="http://www.wumain.com/php/blog/wp-content/uploads/2011/03/IMG_0332-300x300.jpg" alt="" title="IMG_0332" width="300" height="300" class="aligncenter size-medium wp-image-411" /></a><a href="http://www.wumain.com/php/blog/wp-content/uploads/2011/03/IMG_0338.jpg"><img src="http://www.wumain.com/php/blog/wp-content/uploads/2011/03/IMG_0338-300x300.jpg" alt="" title="IMG_0338" width="300" height="300" class="aligncenter size-medium wp-image-413" /></a>]]></description>
		<wfw:commentRss>http://www.wumain.com/php/blog/archives/408/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>80后们，还记得这些【广告】吗？</title>
		<link>http://www.wumain.com/php/blog/archives/401</link>
		<comments>http://www.wumain.com/php/blog/archives/401#comments</comments>
		<pubDate>Wed, 23 Mar 2011 16:14:44 +0000</pubDate>
		<dc:creator>Ryan</dc:creator>
				<category><![CDATA[心情]]></category>
		<category><![CDATA[80后]]></category>
		<category><![CDATA[哇哈哈]]></category>
		<category><![CDATA[太阳神]]></category>
		<category><![CDATA[广告]]></category>
		<category><![CDATA[柯达]]></category>
		<category><![CDATA[燕舞]]></category>
		<category><![CDATA[经典]]></category>

		<guid isPermaLink="false">http://www.wumain.com/php/blog/?p=401</guid>
		<description><![CDATA[<p style="text-align: center;"><embed type="application/x-shockwave-flash" width="414" height="305" src="http://player.ku6.com/refer/drdtBiWKuRkQVj_9/v.swf" allowscriptaccess="always" align="middle" quality="high"></embed></p>]]></description>
		<wfw:commentRss>http://www.wumain.com/php/blog/archives/401/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>曾经的游戏 如今的变化 你还记得吗？</title>
		<link>http://www.wumain.com/php/blog/archives/395</link>
		<comments>http://www.wumain.com/php/blog/archives/395#comments</comments>
		<pubDate>Wed, 23 Mar 2011 06:00:00 +0000</pubDate>
		<dc:creator>Ryan</dc:creator>
				<category><![CDATA[兴趣]]></category>
		<category><![CDATA[游戏]]></category>
		<category><![CDATA[GAME]]></category>
		<category><![CDATA[变化]]></category>
		<category><![CDATA[如今]]></category>
		<category><![CDATA[曾经]]></category>

		<guid isPermaLink="false">http://www.wumain.com/php/blog/?p=395</guid>
		<description><![CDATA[[gallery link="file" columns="1"]]]></description>
		<wfw:commentRss>http://www.wumain.com/php/blog/archives/395/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>克洛斯贝尔自治州</title>
		<link>http://www.wumain.com/php/blog/archives/383</link>
		<comments>http://www.wumain.com/php/blog/archives/383#comments</comments>
		<pubDate>Tue, 22 Mar 2011 15:38:30 +0000</pubDate>
		<dc:creator>Ryan</dc:creator>
				<category><![CDATA[游戏]]></category>
		<category><![CDATA[CROSSBELL]]></category>
		<category><![CDATA[ED7]]></category>
		<category><![CDATA[克洛斯贝尔]]></category>
		<category><![CDATA[英雄传说]]></category>
		<category><![CDATA[零之轨迹]]></category>

		<guid isPermaLink="false">http://www.wumain.com/php/blog/?p=383</guid>
		<description><![CDATA[<a href="http://www.wumain.com/php/blog/wp-content/uploads/2011/03/6c91083bt96cf08605edd690.jpg"><img src="http://www.wumain.com/php/blog/wp-content/uploads/2011/03/6c91083bt96cf08605edd690-300x242.jpg" alt="" title="克洛斯贝尔自治州" width="300" height="242" class="aligncenter size-medium wp-image-384" /></a>]]></description>
		<wfw:commentRss>http://www.wumain.com/php/blog/archives/383/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>终于找到哪儿卖船票了</title>
		<link>http://www.wumain.com/php/blog/archives/367</link>
		<comments>http://www.wumain.com/php/blog/archives/367#comments</comments>
		<pubDate>Sat, 19 Mar 2011 06:03:01 +0000</pubDate>
		<dc:creator>Ryan</dc:creator>
				<category><![CDATA[心情]]></category>
		<category><![CDATA[2012]]></category>
		<category><![CDATA[船票]]></category>
		<category><![CDATA[西藏]]></category>

		<guid isPermaLink="false">http://www.wumain.com/php/blog/?p=367</guid>
		<description><![CDATA[<a href="http://www.wumain.com/php/blog/wp-content/uploads/2011/03/cp.jpg"><img src="http://www.wumain.com/php/blog/wp-content/uploads/2011/03/cp-200x300.jpg" alt="" title="cp" width="200" height="300" class="aligncenter size-medium wp-image-368" /></a>]]></description>
		<wfw:commentRss>http://www.wumain.com/php/blog/archives/367/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>连街头的小偷都不敢呵斥的民族，却有勇气高呼灭了小日本。连活着同胞的苦痛都漠不关心，却有脸说不忘死去的同胞。</title>
		<link>http://www.wumain.com/php/blog/archives/325</link>
		<comments>http://www.wumain.com/php/blog/archives/325#comments</comments>
		<pubDate>Sat, 12 Mar 2011 16:28:36 +0000</pubDate>
		<dc:creator>Ryan</dc:creator>
				<category><![CDATA[心情]]></category>
		<category><![CDATA[人性]]></category>
		<category><![CDATA[地震]]></category>
		<category><![CDATA[日本]]></category>
		<category><![CDATA[民族]]></category>

		<guid isPermaLink="false">http://www.wumain.com/php/blog/?p=325</guid>
		<description><![CDATA[<h1><span style="color: #ff0000;"><strong>连街头的小偷都不敢呵斥的民族，却有勇气高呼灭了小日本。连活着同胞的苦痛都漠不关心，却有脸说不忘死去的同胞。</strong></span></h1>]]></description>
		<wfw:commentRss>http://www.wumain.com/php/blog/archives/325/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>现在的JS动作还真快，CHH邀请注册没几天，这都TB上卖邀请了。</title>
		<link>http://www.wumain.com/php/blog/archives/313</link>
		<comments>http://www.wumain.com/php/blog/archives/313#comments</comments>
		<pubDate>Sun, 06 Mar 2011 16:05:53 +0000</pubDate>
		<dc:creator>Ryan</dc:creator>
				<category><![CDATA[心情]]></category>
		<category><![CDATA[CHH]]></category>
		<category><![CDATA[CHH邀请]]></category>
		<category><![CDATA[Chiphell]]></category>
		<category><![CDATA[chiphell邀请]]></category>
		<category><![CDATA[TB]]></category>
		<category><![CDATA[买卖]]></category>
		<category><![CDATA[好友]]></category>
		<category><![CDATA[开放注册]]></category>
		<category><![CDATA[注册]]></category>
		<category><![CDATA[淘宝]]></category>
		<category><![CDATA[芯域]]></category>
		<category><![CDATA[邀请]]></category>

		<guid isPermaLink="false">http://www.wumain.com/php/blog/?p=313</guid>
		<description><![CDATA[现在的JS动作还真快，CHH邀请注册没几天，这都TB上卖邀请了。

很有冲动去生成两个自己卖- -，想想还是算了。

PS：想要可以给我留言 - -

<a href="http://www.wumain.com/php/blog/wp-content/uploads/2011/03/未命名333.jpg" target="_blank"><img src="http://www.wumain.com/php/blog/wp-content/uploads/2011/03/未命名333-300x140.jpg" alt="" title="未命名333" width="400" height="187" class="aligncenter size-medium wp-image-314" /></a>]]></description>
		<wfw:commentRss>http://www.wumain.com/php/blog/archives/313/feed</wfw:commentRss>
		<slash:comments>43</slash:comments>
		</item>
		<item>
		<title>小意外 &#8212; Iphone4</title>
		<link>http://www.wumain.com/php/blog/archives/296</link>
		<comments>http://www.wumain.com/php/blog/archives/296#comments</comments>
		<pubDate>Sun, 16 Jan 2011 11:56:38 +0000</pubDate>
		<dc:creator>Ryan</dc:creator>
				<category><![CDATA[心情]]></category>
		<category><![CDATA[Apple]]></category>
		<category><![CDATA[Ip]]></category>
		<category><![CDATA[IP4]]></category>
		<category><![CDATA[Iphone4]]></category>
		<category><![CDATA[惊喜]]></category>
		<category><![CDATA[意外]]></category>
		<category><![CDATA[苹果]]></category>
		<category><![CDATA[苹果4]]></category>

		<guid isPermaLink="false">http://www.wumain.com/php/blog/?p=296</guid>
		<description><![CDATA[<a href="http://www.wumain.com/php/blog/wp-content/uploads/2011/01/11.jpg"><img src="http://www.wumain.com/php/blog/wp-content/uploads/2011/01/11-300x225.jpg" alt="" title="11" width="300" height="225" class="aligncenter size-medium wp-image-297" /></a>

<a href="http://www.wumain.com/php/blog/wp-content/uploads/2011/01/22.jpg"><img src="http://www.wumain.com/php/blog/wp-content/uploads/2011/01/22-300x225.jpg" alt="" title="22" width="300" height="225" class="aligncenter size-medium wp-image-298" /></a>

<a href="http://www.wumain.com/php/blog/wp-content/uploads/2011/01/33.jpg"><img src="http://www.wumain.com/php/blog/wp-content/uploads/2011/01/33-300x225.jpg" alt="" title="33" width="300" height="225" class="aligncenter size-medium wp-image-299" /></a>]]></description>
		<wfw:commentRss>http://www.wumain.com/php/blog/archives/296/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>javascript的“反射”机制</title>
		<link>http://www.wumain.com/php/blog/archives/289</link>
		<comments>http://www.wumain.com/php/blog/archives/289#comments</comments>
		<pubDate>Mon, 22 Nov 2010 07:27:27 +0000</pubDate>
		<dc:creator>Ryan</dc:creator>
				<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[技术]]></category>
		<category><![CDATA[js]]></category>
		<category><![CDATA[prototype]]></category>
		<category><![CDATA[反射]]></category>
		<category><![CDATA[机制]]></category>

		<guid isPermaLink="false">http://www.wumain.com/php/blog/?p=289</guid>
		<description><![CDATA[这里用“反射”这个词仅是一种概念上的借用，且不论下面提到的javascript的特性是否可以被称为“反射”，javascript这种获得对象类型（通过typeof运算）、构造函数（通过观察constructor属性）甚至枚举属性和方法的特性确实为我们学习、研究和使用javascript带来了极大的便利。

在javascript中可以利用for...in方法枚举出对象中所有“可列举”的属性和方法，包括通过prototype机制“继承”的属性和方法

例如：


<blockquote>function classA()
{
    classA.prototype.a = function(){return "a";};
}

function classB()
{
    classB.prototype.b = function(){return "b";};
}classB.prototype = new classA();

var msg = new Array();
var b = new classB();

for (idx in b)
{
    msg.push(idx);
}
alert(msg);</blockquote>



上面这个例子列举出了classB的对象b的所有可列举属性和方法（不可列举的属性方法包括大多数javascript内置对象的固有方法，如Object.isPropertyOf等等，但html对象和dom对象的方法都是可列举的），包括a、b两个成员函数。另外由于javascript中通过关联数组引用和通过函数调用引用无参方法等效（即b["a"]和b.a()都返回字符串"a"），所以将上面例子的循环体改成msg.push(b[idx]);就可以遍历执行b中的所有方法并将结果返回给msg。
    
另外一个有趣的话题是关于instanceof运算的。javascript的instanceof运算足够强大，强大到支持“继承”的判别，如上面那个例子，b instance of classA和b instance of classB的结果都是true。instanceof运算的这个能力正是我们使用“多态”所需要的。

相反地，同强大的instanceof运算相比，javascript的typeof运算则显得有些简陋。它只能识别出string、number等基本类型和object与function类型。这样，要判断对象类型的话，typeof就无能为力。一个比较勉强的解决方案是依靠constructor属性来判断，但是，constructor有个很烦人的问题是，它默认返回的是prototype中的构造函数。结果上面的例子中对象b的constructor竟然返回classA，而不是令人期待的classB，于是，只好在每次继承之时手工修改constructor属性，上面的例子中在classB.prototype=new classA();之后添上classB.constructor = classB。

最后谈到dom对象的问题。在javascript中dom对象和普通对象可以通过判断tagName属性来区别，但是这不是非常好的办法，因为你很难禁止他人在普通对象中定义tagName属性。另外一个比较好的方法是dom对象的constructor属性一般为undefined（同时，显然地，instanceof Object将返回false，这是它们区别其他对象的一个明显特征，当然，前提是必须保证javascript的标准在将来不会扩充到给dom对象赋予确定的constructor和严格的继承机制！最后，我想要说的是，javascript的“反射机制”是强大的，但是也是不完善的，所以在使用的时候需要小心，“常识”往往也容易令人犯错。

结束话题之前发一个稍微封装的“反射”管理类，希望它能够给大家带来一些便利：



<blockquote>function Reflector()
{
        Reflector.getType=function(obj)
        {
                if (obj == null)  //null的类型
                {
                        return null; 
                }
                else if (obj instanceof Object)  //普通对象
                {
                        return obj.constructor;
                }
                else if (obj.tagName != null)  //dom对象
                {
                        return obj.tagName;
                }
                else
                {
                        return typeof(obj);
                }
        }
        Reflector.getAttributes=function(obj)
        {
                var methods = new Array();
                for (idx in obj)
                {
                        methods.push(new Type(obj[idx],ClassManager.getType(obj[idx]),idx));
                }
                return methods;
        }
        Reflector.getAttributeNames=function(obj)
        {
                var methods = new Array();
                for (idx in obj)
                {
                        methods.push(idx);
                }
                return methods;
        }
}
//描述类型的类，entity是对象实体，type是对象类型，name是对象名称
function Type(entity, type, name)
{
        this.Entity = entity;
        this.Type = type;
        this.Name = name;
}</blockquote>




作者Blog：http://blog.csdn.net/yanwl/]]></description>
		<wfw:commentRss>http://www.wumain.com/php/blog/archives/289/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>迟到的月饼</title>
		<link>http://www.wumain.com/php/blog/archives/284</link>
		<comments>http://www.wumain.com/php/blog/archives/284#comments</comments>
		<pubDate>Thu, 14 Oct 2010 16:56:20 +0000</pubDate>
		<dc:creator>Ryan</dc:creator>
				<category><![CDATA[Hardware]]></category>
		<category><![CDATA[兴趣]]></category>
		<category><![CDATA[显卡]]></category>
		<category><![CDATA[6350]]></category>
		<category><![CDATA[AMD]]></category>
		<category><![CDATA[ATI]]></category>
		<category><![CDATA[HD]]></category>
		<category><![CDATA[HD6000]]></category>

		<guid isPermaLink="false">http://www.wumain.com/php/blog/?p=284</guid>
		<description><![CDATA[<a href="http://www.wumain.com/php/blog/wp-content/uploads/2010/09/1.jpg"><img src="http://www.wumain.com/php/blog/wp-content/uploads/2010/09/1-300x225.jpg" alt="" title="Camera 360" width="300" height="225" class="aligncenter size-medium wp-image-245" /></a>

<a href="http://www.wumain.com/php/blog/wp-content/uploads/2010/09/2.jpg"><img src="http://www.wumain.com/php/blog/wp-content/uploads/2010/09/2-300x225.jpg" alt="" title="Camera 360" width="300" height="225" class="aligncenter size-medium wp-image-246" /></a>

<a href="http://www.wumain.com/php/blog/wp-content/uploads/2010/09/3.jpg"><img src="http://www.wumain.com/php/blog/wp-content/uploads/2010/09/3-300x225.jpg" alt="" title="Camera 360" width="300" height="225" class="aligncenter size-medium wp-image-247" /></a>]]></description>
		<wfw:commentRss>http://www.wumain.com/php/blog/archives/284/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>每次坏东西，心思都会活络一下</title>
		<link>http://www.wumain.com/php/blog/archives/274</link>
		<comments>http://www.wumain.com/php/blog/archives/274#comments</comments>
		<pubDate>Thu, 07 Oct 2010 06:57:36 +0000</pubDate>
		<dc:creator>Ryan</dc:creator>
				<category><![CDATA[Hardware]]></category>
		<category><![CDATA[兴趣]]></category>
		<category><![CDATA[路由器]]></category>
		<category><![CDATA[300m]]></category>
		<category><![CDATA[buffalo]]></category>
		<category><![CDATA[g300nh]]></category>
		<category><![CDATA[wzr]]></category>
		<category><![CDATA[千兆]]></category>
		<category><![CDATA[路由]]></category>

		<guid isPermaLink="false">http://www.wumain.com/php/blog/?p=274</guid>
		<description><![CDATA[国庆节路由很不给面子的坏了，那很好，给了个理由直接升级了，WRT350N始终没货，那也就难得的买一次行货，之后WZR-HP-G300 NH入手

WZR-HP-G300NH 
hipset       Atheros ar9132@400Mhz   
Wireless    Atheros AR9132+AR9103 3x3 MIMO 802.11b/g/n  2.4Ghz       
USB          2.0x1
RAM         64 MB         
FLASH      32 MB 

<a href="http://www.wumain.com/php/blog/wp-content/uploads/2010/10/C360_2010-10-07-10-44-05.jpg"><img class="aligncenter size-medium wp-image-275" title="Camera 360" src="http://www.wumain.com/php/blog/wp-content/uploads/2010/10/C360_2010-10-07-10-44-05-300x224.jpg" alt="" width="300" height="224" /></a>

<a href="http://www.wumain.com/php/blog/wp-content/uploads/2010/10/C360_2010-10-07-10-46-06.jpg"><img class="aligncenter size-medium wp-image-276" title="Camera 360" src="http://www.wumain.com/php/blog/wp-content/uploads/2010/10/C360_2010-10-07-10-46-06-300x224.jpg" alt="" width="300" height="224" /></a>

<a href="http://www.wumain.com/php/blog/wp-content/uploads/2010/10/C360_2010-10-07-10-48-47.jpg"><img src="http://www.wumain.com/php/blog/wp-content/uploads/2010/10/C360_2010-10-07-10-48-47-300x224.jpg" alt="" title="Camera 360" width="300" height="224" class="aligncenter size-medium wp-image-277" /></a>

<a href="http://www.wumain.com/php/blog/wp-content/uploads/2010/10/C360_2010-10-07-10-51-36.jpg"><img src="http://www.wumain.com/php/blog/wp-content/uploads/2010/10/C360_2010-10-07-10-51-36-224x300.jpg" alt="" title="Camera 360" width="224" height="300" class="aligncenter size-medium wp-image-278" /></a>

<a href="http://www.wumain.com/php/blog/wp-content/uploads/2010/10/C360_2010-10-07-10-53-46.jpg"><img src="http://www.wumain.com/php/blog/wp-content/uploads/2010/10/C360_2010-10-07-10-53-46-300x224.jpg" alt="" title="Camera 360" width="300" height="224" class="aligncenter size-medium wp-image-279" /></a>]]></description>
		<wfw:commentRss>http://www.wumain.com/php/blog/archives/274/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>大扫除后的收获</title>
		<link>http://www.wumain.com/php/blog/archives/269</link>
		<comments>http://www.wumain.com/php/blog/archives/269#comments</comments>
		<pubDate>Thu, 07 Oct 2010 06:37:52 +0000</pubDate>
		<dc:creator>Ryan</dc:creator>
				<category><![CDATA[Hardware]]></category>
		<category><![CDATA[Trident]]></category>
		<category><![CDATA[内存]]></category>
		<category><![CDATA[古董]]></category>
		<category><![CDATA[昆腾]]></category>
		<category><![CDATA[显卡]]></category>
		<category><![CDATA[硬件]]></category>
		<category><![CDATA[硬盘]]></category>

		<guid isPermaLink="false">http://www.wumain.com/php/blog/?p=269</guid>
		<description><![CDATA[<img class="alignnone" src="http://www.chiphell.com/data/attachment/forum/201010/06/1646464cqxoqatie8axnzz.jpg" alt="" width="512" height="384" />

<img class="alignnone" src="http://www.chiphell.com/data/attachment/forum/201010/06/164641s9zjkkd8jrrcc0y7.jpg" alt="" width="512" height="384" />

<img class="alignnone" src="http://www.chiphell.com/data/attachment/forum/201010/06/164652sz1j9a0hfrnszraa.jpg" alt="" width="512" height="384" />

<img class="alignnone" src="http://www.chiphell.com/data/attachment/forum/201010/06/164701a19aqgg657a1g6aa.jpg" alt="" width="512" height="384" />

<img class="alignnone" src="http://www.chiphell.com/data/attachment/forum/201010/06/164709b4ogx8iim8kmkmm4.jpg" alt="" width="512" height="384" />

<img class="alignnone" src="http://www.chiphell.com/data/attachment/forum/201010/06/164717vn2vvgjfg2wnv2rs.jpg" alt="" width="512" height="384" />

<img class="alignnone" src="http://www.chiphell.com/data/attachment/forum/201010/06/16465756huek660lz6fd3h.jpg" alt="" width="512" height="384" />]]></description>
		<wfw:commentRss>http://www.wumain.com/php/blog/archives/269/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>你可能不知道的10个JavaScript小技巧</title>
		<link>http://www.wumain.com/php/blog/archives/265</link>
		<comments>http://www.wumain.com/php/blog/archives/265#comments</comments>
		<pubDate>Sun, 26 Sep 2010 03:47:21 +0000</pubDate>
		<dc:creator>Ryan</dc:creator>
				<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[技术]]></category>
		<category><![CDATA[js]]></category>
		<category><![CDATA[技巧]]></category>
		<category><![CDATA[效率]]></category>

		<guid isPermaLink="false">http://www.wumain.com/php/blog/?p=265</guid>
		<description><![CDATA[<p>尽管我使用Javascript来做开发有很多年了，但它常有一些让我很惊讶的小特性。对于我来说，Javascript是需要持续不断的学习的。在这篇文章中，我将列出10个Javascript使用小技巧，主要面向Javascript新手和中级开发者。希望每个读者都能至少从中学到一个有用的技巧。</p>
<h3>1.变量转换</h3>
<p>看起来很简单，但据我所看到的，使用构造函数，像Array()或者Number()来进行变量转换是常用的做法。始终使用原始数据类型（有时也称为字面量）来转换变量，这种没有任何额外的影响的做法反而效率更高。</p>
<div id="highlighter_540485">
<div>
<blockquote>
<div>  var myVar   = "3.14159", <br />
 str     = ""+ myVar,//  to string <br />
 int     = ~~myVar,  //  to integer <br />
 float   = 1*myVar,  //  to float <br />
 bool    = !!myVar,  /*  to boolean - any string with length <br />
 and any number except 0 are true */<br />
 array   = [myVar];  //  to array</div>
</blockquote>
</div>
</div>
<p>转换日期(new Date(myVar))和正则表达式(new RegExp(myVar))必须使用构造函数，而且创建正则表达式的时候要使用/pattern/flags的形式。</p>
<p><!--more--></p>
<h3>2.十进制转换为十六进制或者八进制，或者反过来</h3>
<p>你是不是写个单独的函数来转换十六进制（或者八进制）呢？马上停下吧！有更容易的现成的函数可以用：</p>
<div id="highlighter_866187">
<div>
<blockquote>
<div>(int).toString(16); // converts int to hex, eg 12 =&#62; "C" <br />
(int).toString(8);  // converts int to octal, eg. 12 =&#62; "14" <br />
parseInt(string,16) // converts hex to int, eg. "FF" =&#62; 255 <br />
parseInt(string,8) // converts octal to int, eg. "20" =&#62; 16 </div>
</blockquote>
</div>
</div>
<h3>3.玩转数字</h3>
<p>除了上一节介绍的之外，这里有更多的处理数字的技巧</p>
<div id="highlighter_275666">
<div>
<blockquote>
<div>0xFF; // Hex declaration, returns 255 <br />
020; // Octal declaration, returns 16 <br />
1e3; // Exponential, same as 1 * Math.pow(10,3), returns 1000 <br />
(1000).toExponential(); // Opposite with previous, returns 1e3 <br />
(3.1415).toFixed(3); // Rounding the number, returns "3.142"</div>
</blockquote>
</div>
</div>
<h3>4.Javascript版本检测</h3>
<p>你知道你的浏览器支持哪一个版本的Javascript吗？如果不知道的话，去维基百科查一下Javascript版本表吧。出于某种原因，Javascript 1.7版本的某些特性是没有得到广泛的支持。不过大部分浏览器都支持了1.8版和1.8.1版的特性。（注：所有的IE浏览器（IE8或者更老的版本）只支持1.5版的Javascript）这里有一个脚本，既能通过检测特征来检测JavaScript版本，它还能检查特定的Javascript版本所支持的特性。</p>
<div id="highlighter_456390">
<div>
<blockquote>
<div>var JS_ver  = []; <br />
(Number.prototype.toFixed)?JS_ver.push("1.5"):false; <br />
([].indexOf &#38;&#38; [].forEach)?JS_ver.push("1.6"):false; <br />
((function(){try {[a,b] = [0,1];return true;}catch(ex) {return false;}})())?JS_ver.push("1.7"):false; <br />
([].reduce &#38;&#38; [].reduceRight &#38;&#38; JSON)?JS_ver.push("1.8"):false; <br />
("".trimLeft)?JS_ver.push("1.8.1"):false; <br />
JS_ver.supports = function() <br />
{ <br />
 if (arguments[0]) <br />
  return (!!~this.join().indexOf(arguments[0] +",") +","); <br />
 else<br />
  return (this[this.length-1]); <br />
} <br />
alert("Latest Javascript version supported: "+ JS_ver.supports()); <br />
alert("Support for version 1.7 : "+ JS_ver.supports("1.7"));</div>
</blockquote>
</div>
</div>
<h3>5.使用window.name进行简单会话处理</h3>
<p>这个是我真的喜欢的东西。您可以为指定一个字符串作为window.name属性的值，直到您关闭该标签或窗口。虽然我没有提供任何脚本，但我强烈建议您如充分利用这个方法。举例来说，在建设一个网站或应用程序的时候，在调试和测试模式之间切换是非常有用的。</p>
<h3>6.判断属性是否存在</h3>
<p>这个问题包含两个方面，既有检查属性时候存在，还要获取属性的类型。但我们总是忽略了这些小事情:</p>
<div id="highlighter_441880">
<div>
<blockquote>
<div>// BAD: This will cause an error in code when foo is undefined <br />
if (foo) { <br />
 doSomething(); <br />
} <br />
// GOOD: This doesn't cause any errors. However, even when <br />
// foo is set to NULL or false, the condition validates as true <br />
if (typeof foo != "undefined") { <br />
 doSomething(); <br />
} <br />
// BETTER: This doesn't cause any errors and in addition <br />
// values NULL or false won't validate as true <br />
if (window.foo) { <br />
 doSomething(); <br />
}</div>
</blockquote>
<div> </div>
<div>但是，有的情况下，我们有更深的结构和需要更合适的检查的时候，可以这样：</div>
</div>
</div>
<div id="highlighter_80796">
<div>
<div> </div>
<blockquote>
<div>// UGLY: we have to proof existence of every <br />
// object before we can be sure property actually exists <br />
if (window.oFoo &#38;&#38; oFoo.oBar &#38;&#38; oFoo.oBar.baz) { <br />
 doSomething(); <br />
}</div>
</blockquote>
</div>
<div>7.给函数传递参数</div>
</div>
<p>当函数既有必选又有可选参数的时候，我们可能是这样做的：</p>
<div id="highlighter_764554">
<div>
<blockquote>
<div>function doSomething(arg0, arg1, arg2, arg3, arg4) { <br />
 ... <br />
} <br />
doSomething('', 'foo', 5, [], false);</div>
</blockquote>
</div>
</div>
<p>而传递一个对象总是比传递一堆的参数更方便：</p>
<div id="highlighter_228103">
<div>
<blockquote>
<div>function doSomething() { <br />
 // Leaves the function if nothing is passed <br />
 if (!arguments[0]) { <br />
  return false; <br />
 } <br />
 var oArgs   = arguments[0] <br />
  arg0    = oArgs.arg0 &#124;&#124; "", <br />
  arg1    = oArgs.arg1 &#124;&#124; "", <br />
  arg2    = oArgs.arg2 &#124;&#124; 0, <br />
  arg3    = oArgs.arg3 &#124;&#124; [], <br />
  arg4    = oArgs.arg4 &#124;&#124; false; <br />
} <br />
doSomething({ <br />
 arg1    : "foo", <br />
 arg2    : 5, <br />
 arg4    : false<br />
});</div>
</blockquote>
</div>
</div>
<p>这只是一个把对象作为参数传递的一个很简单的例子，例如，我们还可以声明一个对象，变量名作为Key，默认值作为Value。</p>
<h3>8.使用document.createDocumentFragment()</h3>
<p>您可能需要动态地追加多个元素到文档中。然而，直接将它们插入到文档中会导致这个文档每次都需要重新布局一个，相反的，你应该使用文档碎片，建成后只追加一次：</p>
<div id="highlighter_789672">
<div>
<blockquote>
<div>function createList() { <br />
 var aLI = ["first item", "second item", "third item", "fourth item", "fith item"]; <br />
 // Creates the fragment <br />
 var oFrag   = document.createDocumentFragment(); <br />
 while (aLI.length) { <br />
  var oLI = document.createElement("li"); <br />
  // Removes the first item from array and appends it <br />
  // as a text node to LI element <br />
  oLI.appendChild(document.createTextNode(aLI.shift())); <br />
  oFrag.appendChild(oLI); <br />
 } <br />
 document.getElementById('myUL').appendChild(oFrag); <br />
}</div>
</blockquote>
</div>
</div>
<h3>9.为replace()方法传递一个函数</h3>
<p>有的时候你想替换字符串的某个部分为其它的值，最好的方法就是给String.replace()传递一个独立的函数。下面是一个简单例子：</p>
<div id="highlighter_845082">
<div>
<blockquote>
<div>var sFlop   = "Flop: [Ah] [Ks] [7c]"; <br />
var aValues = {"A":"Ace","K":"King",7:"Seven"}; <br />
var aSuits  = {"h":"Hearts","s":"Spades","d":"Diamonds","c":"Clubs"}; <br />
sFlop   = sFlop.replace(/\[\w+\]/gi, function(match) { <br />
 match   = match.replace(match[2], aSuits[match[2]]); <br />
 match   = match.replace(match[1], aValues[match[1]] +" of "); <br />
 return match; <br />
}); <br />
// string sFlop now contains: <br />
// "Flop: [Ace of Hearts] [King of Spades] [Seven of Clubs]"</div>
</blockquote>
</div>
</div>
<h3>10.循环中标签的使用</h3>
<p>有的时候，循环中又嵌套了循环，你可能想在循环中退出，则可以用标签：</p>
<div id="highlighter_252869">
<div>
<blockquote>
<div>outerloop: <br />
for (var iI=0;iI&#60;5;iI++) { <br />
 if (somethingIsTrue()) { <br />
  // Breaks the outer loop iteration <br />
  break outerloop; <br />
 }   <br />
 innerloop: <br />
 for (var iA=0;iA&#60;5;iA++) { <br />
  if (somethingElseIsTrue()) { <br />
   // Breaks the inner loop iteration <br />
   break innerloop; <br />
  } <br />
 } <br />
}</div>
</blockquote>
</div>
</div>]]></description>
		<wfw:commentRss>http://www.wumain.com/php/blog/archives/265/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>家里的新成员</title>
		<link>http://www.wumain.com/php/blog/archives/257</link>
		<comments>http://www.wumain.com/php/blog/archives/257#comments</comments>
		<pubDate>Thu, 23 Sep 2010 04:17:27 +0000</pubDate>
		<dc:creator>Ryan</dc:creator>
				<category><![CDATA[心情]]></category>
		<category><![CDATA[Cat]]></category>
		<category><![CDATA[宠物]]></category>
		<category><![CDATA[小家伙]]></category>
		<category><![CDATA[新成员]]></category>
		<category><![CDATA[猫猫]]></category>

		<guid isPermaLink="false">http://www.wumain.com/php/blog/?p=257</guid>
		<description><![CDATA[<p><a href="http://www.wumain.com/php/blog/wp-content/uploads/2010/09/C360_2010-09-23-11-32-57.jpg"><img class="aligncenter size-medium wp-image-259" title="Camera 360" src="http://www.wumain.com/php/blog/wp-content/uploads/2010/09/C360_2010-09-23-11-32-57-300x225.jpg" alt="" width="300" height="225" /></a></p>
<p><a href="http://www.wumain.com/php/blog/wp-content/uploads/2010/09/C360_2010-09-23-11-33-08.jpg"><img class="aligncenter size-medium wp-image-260" title="Camera 360" src="http://www.wumain.com/php/blog/wp-content/uploads/2010/09/C360_2010-09-23-11-33-08-300x225.jpg" alt="" width="300" height="225" /></a></p>
<p><a href="http://www.wumain.com/php/blog/wp-content/uploads/2010/09/C360_2010-09-23-11-33-15.jpg"><img class="aligncenter size-medium wp-image-261" title="Camera 360" src="http://www.wumain.com/php/blog/wp-content/uploads/2010/09/C360_2010-09-23-11-33-15-300x225.jpg" alt="" width="300" height="225" /></a></p>
<p><a href="http://www.wumain.com/php/blog/wp-content/uploads/2010/09/C360_2010-09-23-11-33-26.jpg"><img class="aligncenter size-medium wp-image-262" title="Camera 360" src="http://www.wumain.com/php/blog/wp-content/uploads/2010/09/C360_2010-09-23-11-33-26-300x225.jpg" alt="" width="300" height="225" /></a> </p>
<p><a href="http://www.wumain.com/php/blog/wp-content/uploads/2010/09/C360_2010-09-21-20-25-29.jpg"><img class="aligncenter size-medium wp-image-258" title="Camera 360" src="http://www.wumain.com/php/blog/wp-content/uploads/2010/09/C360_2010-09-21-20-25-29-225x300.jpg" alt="" width="225" height="300" /></a></p>]]></description>
		<wfw:commentRss>http://www.wumain.com/php/blog/archives/257/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>[转]JavaScript 图片3D展示空间（3DRoom）</title>
		<link>http://www.wumain.com/php/blog/archives/253</link>
		<comments>http://www.wumain.com/php/blog/archives/253#comments</comments>
		<pubDate>Mon, 20 Sep 2010 06:37:07 +0000</pubDate>
		<dc:creator>Ryan</dc:creator>
				<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[技术]]></category>
		<category><![CDATA[3D]]></category>
		<category><![CDATA[3DRoom]]></category>
		<category><![CDATA[Image3D]]></category>
		<category><![CDATA[js]]></category>
		<category><![CDATA[msInterpolationMode]]></category>
		<category><![CDATA[transform]]></category>
		<category><![CDATA[Zoom]]></category>
		<category><![CDATA[三维]]></category>
		<category><![CDATA[图片展示]]></category>
		<category><![CDATA[缩放]]></category>

		<guid isPermaLink="false">http://www.wumain.com/php/blog/?p=253</guid>
		<description><![CDATA[一般的平面效果，通过改变水平和垂直坐标就能实现，再加上深度，就能在视觉上的产生3D（三维）的效果。
程序就是模拟这样一个三维空间，里面的图片会根据三维坐标显示在这个空间。
很久以前就看过一个<a title="3DRoom" href="http://www.dhteumeuleu.com/mandatory-upgrade/" target="_blank">3DRoom</a>效果，是用复杂的计算实现的。
在上一篇<a title="图片变换" href="http://www.cnblogs.com/cloudgamer/archive/2010/08/16/ImageTrans.html" target="_blank">图片变换</a>研究过css3的transform之后，就想到一个更简单的方法来实现。

<strong><a title="在线效果预览" href="http://www.cnblogs.com/cloudgamer/archive/2010/09/20/Image3D.html" target="_blank">在线效果预览</a></strong>

<strong><a title="完整实例下载" href="http://files.cnblogs.com/cloudgamer/Image3D.rar" target="_blank">完整实例下载</a></strong>

<strong>程序说明</strong>

<strong>【实现原理】</strong>

3D效果的关键，是深度的实现。
把3D容器看成一个由多个不同深度的层组成的空间，这些层的尺寸默认跟容器一样。
层里面放了该深度的图片，并且各个层会根据深度的变化做缩放变换，从视觉上产生深度差。
缩放变换的比例按照最近点为1，最远点为0，逐渐变化。
关键的地方是层里面图片的尺寸和坐标必须跟着层同时变换，这个通过css3的transform很简单就能实现。
这样图片只需设置好尺寸再相对层定好位就行了，避免了随深度变化要不断调整图片尺寸和定位的麻烦。

<strong>【图片加载】</strong>

在程序初始化之后，就可以调用add方法来添加图片。
add方法有两个参数：图片地址和参数对象，还会返回一个图片操作对象。
操作对象包含以下属性和方法，方便对图片进行操作：
img: 图片元素
src: 图片地址
options: 参数对象
show: 显示图片方法
remove: 移除图片方法
其中options可以设置如下属性：
属性: 默认值//说明
x: 0,//水平位移
y: 0,//垂直位移
z: 0,//深度
width: 0,//宽度
height: 0,//高度
scaleW: 1,//宽度缩放比例
scaleH: 1//高度缩放比例
其中x、y分别是水平和垂直坐标的位移参数，坐标原点在容器底部中间，水平坐标向右，纵坐标向上，单位是px。
而z是深度，用于比例的计算，方向由近点到原点。
坐标系如下图：
<img src="http://images.cnblogs.com/cnblogs_com/cloudgamer/169629/o_coordinate.gif" alt="" />

图片加载成功后，就会执行_load图片加载程序。
首先根据参数设置图片样式：

<dl><dt>JScript code </dt><dd>
<pre>
<div><!--

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

-->img.style.cssText = "position:absolute;border:0;padding:0;margin:0;-ms-interpolation-mode:nearest-neighbor;"
    + "z-index:" + (99999 - z) + ";width:" + width + "px;height:" + height + "px;"
    + "left:" + (((clientWidth - width) / 2 + opt.x) / clientWidth * 100).toFixed(5) + "%;"
    + "top:" + ((clientHeight - height - opt.y) / clientHeight * 100).toFixed(5) + "%;";</div></pre>
</dd></dl>绝对定位是必须的，宽度和高度根据参数设置就行。
left和top根据坐标参数计算，这里需要用百分比的形式表示，后面再详细说明。
还要给图片增加一个_z属性记录深度，方便调用。
最后插入对应z的层，并重新显示该层。

<strong>【层变换】</strong>

图片加载后，会用_insertLayer程序把图片插入到对应的层中。
_insertLayer有两个参数：图片元素和z深度。
程序用_layers对象，以z为关键字记录对应的层元素。
如果在该深度还没有创建层，会自动创建一个：

<dl><dt>JScript code </dt><dd>
<pre>
<div><!--

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

-->layer = document.createElement("div");
layer.style.cssText = "position:absolute;border:0;padding:0;margin:0;left:0;top:0;visibility:hidden;background:transparent;width:" + this._clientWidth + "px;height:" + this._clientHeight + "px;";</div></pre>
</dd></dl>层的坐标和尺寸要跟容器一致，因为插入图片的坐标是相对容器来定义的，这样使用起来比较方便。
还会添加一个_count属性，记录层包含的图片数，最后插入到容器并记录到_layers对象中。
获取层对象后，就把图片插入层中，并把_count计数加1。

接着就可以通过_showLayer程序根据深度显示对应的层。
程序包含三个坐标属性：_x、_y、_z，表示容器的三维坐标的偏移量。
首先通过_getScale获取比例方法得到z深度的缩放比例scale。
比例大于1，说明图片在视觉深度的后面，理论上应该看不到，所以隐藏；小于0，就是小到看不到了也隐藏。

而_x和_y偏移量也需要根据深度来重新计算，程序有两种偏移方式：远点固定和近点固定。
远点固定的意思是平面位移偏移量随着深度逐渐变小，产生以最远点为固定点移动方向的效果，近点固定就刚好相反。
要实现这个效果，只要位移偏移量也跟着比例变化就行了，即远点固定时偏移量跟比例成正比，远点固定时是反比：

<dl><dt>JScript code </dt><dd>
<pre>
<div><!--

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

-->var moveScale = this.fixedFar ? scale : (1 - scale);</div></pre>
</dd></dl>然后把这些参数交给_show程序来处理，并显示效果。

为了最大限度地利用层元素，程序会在_remove图片移除程序中，把没有图片的层放到_invalid废弃层集合中，在需要插入层时，优先从_invalid中获取。

<strong>【缩放比例】</strong>

上面已经说了，缩放比例应该按照最近点为1，最远点为0，逐渐变化。
程序默认是通过下面的公式计算：

<dl><dt>JScript code </dt><dd>
<pre>
<div><!--

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

-->function(z){ return 1 - z / 1000; }</div></pre>
</dd></dl>但用这个公式实现3DRoom效果的时候，会发现比例变化太急速，并不像这个<a title="3DRoom" href="http://www.dhteumeuleu.com/mandatory-upgrade/" target="_blank">3DRoom</a>那样平稳。

研究代码后发现，原来它用的公式是这样的：

<dl><dt>JScript code </dt><dd>
<pre>
<div><!--

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

-->this.r = FL / (FL + (z * Z));</div></pre>
</dd></dl>其中FL和Z是一个常量来的，即公式可表示成：

<dl><dt>JScript code </dt><dd>
<pre>
<div><!--

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

-->function(z){ return 1/(1+z/常量); }</div></pre>
</dd></dl>那按照这个公式，深度为0时比例为1，深度为常量时比例为0.5，深度为无穷大时比例为0。

变化效果可以参考这里的<a title="公式演示程序" href="http://www.cnblogs.com/cloudgamer/archive/2010/09/20/Image3D.html" target="_blank">公式演示程序</a>。
可以看出，缩放比例在默认公式是均匀变化的，而3DRoom公式是先快后慢，而且是逐渐变慢，所以有那种平稳的感觉。
那按照实际，还可以自己设计适合的公式，只要符合从1到0变化就行。

<strong>【css3模式】</strong>

程序中有三种缩放变换方式：css3、zoom和base，模式的程序结构跟上一篇<a title="图片变换" href="http://www.cnblogs.com/cloudgamer/archive/2010/08/16/ImageTrans.html" target="_blank">图片变换</a>类似。
缩放变换的目的是根据传递过来的比例和位置偏移量，把缩放效果显示出来，实现最终的3D效果。

css3模式使用的是css3的transform，在上一篇已经介绍过用transform的matrix做缩放和旋转，这次还需要后面两个参数做位置变换。
后面两个参数要注意单位的设置，在MDC的<a title="-moz-transform" href="https://developer.mozilla.org/en/CSS/-moz-transform" target="_blank">-moz-transform</a>有说明：
Gecko (Firefox) accepts a &#60;length&#62; value for tx and ty.
Safari (WebKit) and Opera currently support a unitless &#60;number&#62; for tx and ty.
意思是位移参数tx和ty，在Firefox需要带单位，而WebKit和Opera只需要数字（不带单位，默认px）。
程序会根据浏览器设置单位。

使用css3模式，还可以通过修改_r弧度属性进行旋转。
最后设置matrix实现变换：

<dl><dt>JScript code </dt><dd>
<pre>
<div><!--

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

-->layer.style[ css3Transform ] = "matrix("
    + ( Cos * scale).toFixed(5) + "," + (Sin * scale).toFixed(5) + ","
    + (-Sin * scale).toFixed(5) + "," + (Cos * scale).toFixed(5) + ", "
    + Math.round(x) + unit + ", " + Math.round(y) + unit + ")";</div></pre>
</dd></dl>这里还要注意一个问题，计算得到的比例可能是一个很长的小数，在拼字符时会出问题。
例如执行：alert(0.0000001)，会得到“1e-7”，js会用这个结果来拼字符，得到错误的结果。
所以在做数字和字符的拼接时，能用整数的应该先转成整数，小数的话也要用toFixed转换一下。

<strong>【zoom模式】</strong>

ie还不支持transform，但有一个zoom样式能实现类似的效果。
由于zoom后，尺寸会发生变化，所以需要修正left和top移动到正确的位置。

除了ie，webkit(chrome/safari)也支持zoom，不过ie6/7、ie8和webkit的实现并不完全相同。
测试以下代码：

<dl><dt>JScript code </dt><dd>
<pre>
<div><!--

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

-->&#60;style&#62;
.inner{ width:100px; height:100px; position:absolute; background:#0CF; zoom:0.5; top:50px; left:50px;}
.inner div{ width:50px; height:50px;position:absolute; left:25px;background:#CCC;}
&#60;/style&#62;
&#60;div style="width:150px;height:150px; border:1px solid #000; position:relative;"&#62;
&#60;div class="inner" id="t"&#62;&#60;div&#62;test&#60;/div&#62;&#60;/div&#62;
&#60;/div&#62;</div></pre>
</dd></dl>在ie6/7实现了想要的效果，但在webkit显示的位置错了。
原因是使用zoom后，元素的left和top也会随着缩放，那只要按比例重新计算就行。
像上面的例子，只要把left和top改成50/0.5，即100就正确了。

ie8就更麻烦，里面的内容是按zoom缩放了，但left和top还是原来的大小。
被这个问题困扰了很久，最后发现通过用百分比定位就可以解决，在图片加载时left和top要用百分比就是这个原因。
例如在例子中，修正left和top，并把最里面的div的left改成25%就可以了。
在ie8还看到一个问题，在zoom后，内容是缩小了，容器和内部元素的尺寸却没有变化，还好这不会影响到图片的显示，定位也要用left和top，免得麻烦。
还有，如果zoom的元素的尺寸用百分比设置，那元素的尺寸就不会根据zoom缩放了。

在计算时还要注意一个问题，上面提到在webkit和ie8，left和top都需要除以scale来修正，当scale接近0到一定程度，结果会变成Infinity(无穷大)。
用Infinity进行运算会出错，需要修正这个问题：

<dl><dt>JScript code </dt><dd>
<pre>
<div><!--

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

-->left = Math.min(MAX, Math.max( -MAX, left )) &#124; 0;
top = Math.min(MAX, Math.max( -MAX, top )) &#124; 0;</div></pre>
</dd></dl>其中MAX是Number.MAX_VALUE(js能表达的最大数)。

<strong>【base模式】</strong>

还有兼容全部浏览器的base模式，用的是传统的方法，即根据缩放比例，计算并设置每个图片的尺寸和位置。
每次显示时，历遍层里面的图片，再逐个计算设置。
计算需要图片的原始位置和尺寸，在第一次计算时会把数据保存在_original属性中：

<dl><dt>JScript code </dt><dd>
<pre>
<div><!--

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

-->var original = img._original = img._original &#124;&#124; {
    width: img.offsetWidth,    height: img.offsetHeight,
    left: img.offsetLeft,     top: img.offsetTop
};</div></pre>
</dd></dl>尺寸只要根据比例缩放就行，位置除了计算相对层的缩放还要加上相对容器的位移，这个跟zoom模式的计算是一样的。
理解了层变换的方式后，再理解这个就不难了。

<strong>【zIndex】</strong>

深度除了要缩放和定位，还需要合理的前后遮盖。
前后遮盖需要用[url=http://www.w3.org/TR/WD-positioning-970131#'z-index']zIndex[/url]来实现，可以在图片或层上设置。

首先最简单的方法是在层上设置：

<dl><dt>JScript code </dt><dd>
<pre>
<div><!--

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

-->&#60;style&#62;
div,img{width:200px;height:200px;position:absolute;left:0;top:0;}
img{width:150px;height:150px;}
&#60;/style&#62;
&#60;div style="z-index:300;"&#62;
    &#60;img style="background:#0C9;" alt="300" onclick="alert(300)"&#62;
&#60;/div&#62;
&#60;div style="z-index:100;"&#62;
    &#60;img style="background:#396;left:50px;top:50px;" alt="100" onclick="alert(100)"&#62;
&#60;/div&#62;</div></pre>
</dd></dl>实现一般的3D效果可以这样设置。
但点击测试，在ff和webkit前面的能触发后面的不能触发，而ie和opera就前后都可以触发。
ps：如果img换成div，那么ie和opera后面的元素也不能触发，原因还不清楚。
这样要想像3DRoom那样触发图片事件的话就不能在层设置zIndex。

还可以在图片上设置：

<dl><dt>JScript code </dt><dd>
<pre>
<div><!--

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

-->&#60;style&#62;
div,img{width:200px;height:200px;position:absolute;left:0;top:0;}
img{width:150px;height:150px;}
&#60;/style&#62;
&#60;div&#62;
    &#60;img style="background:#0C9;z-index:300;" alt="300" onclick="alert(300)"&#62;
&#60;/div&#62;
&#60;div&#62;
    &#60;img style="background:#396;left:50px;top:50px;z-index:100;" alt="100" onclick="alert(100)"&#62;
&#60;/div&#62;</div></pre>
</dd></dl>这样图片在所有浏览器都能正常触发，但在ie6/7层叠的效果失效了,看来在ie6/7只能在层用zIndex。
还有一个问题，如果给div加上变换效果：

<dl><dt>JScript code </dt><dd>
<pre>
<div><!--

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

-->div{-moz-transform:scale(1);-webkit-transform:scale(1);-o-transform:scale(1);}</div></pre>
</dd></dl>那图片上的zIndex就会失效，那css3模式就只能在层设置zIndex了。

总结一下：
在css3模式肯定要在层设置zIndex，但图片也不能触发事件。
在zoom和base模式，应该在图片设置zIndex，但在ie6/7就要在层设置。
这样至少在base模式层叠和图片触发事件都是正常的。

<strong>【msInterpolationMode】</strong>

开始做的时候，效果在ie8下会很卡，但这个<a title="3DRoom" href="http://www.dhteumeuleu.com/mandatory-upgrade/" target="_blank">3DRoom</a>却不会卡，最后发现是使用了-ms-interpolation-mode。
这个东西在<a title="aoao" href="http://www.aoao.org.cn/blog/2009/03/img-ms-interpolation-mode/" target="_blank">aoao</a>的文章中看过，但没想到可以用在这里。

在MSDN有<a title="msInterpolationMode" href="http://msdn.microsoft.com/en-us/library/ms530822(VS.85).aspx" target="_blank">msInterpolationMode</a>的介绍：
Gets or sets the interpolation (resampling) method used to stretch images.
即获取或设置用于拉伸图像的插值（重采样）方法。
它有两个值：
nearest-neighbor：使用近邻插值模式。
bicubic：使用高品质的双三次插值模式。
这些名词比较专业，我们只要知道使用nearest-neighbor效率高但效果差，而bicubic效果好效率低就够了。
程序把它设为nearest-neighbor提高效率，这样在ie8中也不会卡了。

<strong>【拖动方向变换/滚轮深度变换】</strong>

程序扩展了拖动视觉变换和滚轮深度变换。
拖动和滚动的做法跟上一个的做法差不多，这里拖动是实现方向的变换，滚轮是实现深度的变换。
移动是通过修改_x和_y属性来实现，缩放是通过修改_z来实现。
修改属性之后再调用show方法显示效果。

<strong>使用技巧</strong>

<strong>【3DRoom】</strong>

在3DRoom效果中，因为要实现图片的触发事件，所以不能用css3模式，原因是上面提到的层叠问题。
上面也提到在ie8被zoom的元素尺寸不会改变，导致触发范围错误，所以也不用zoom模式。
使用base模式就不会有问题了。

在点击图片时，视觉会移动到图片上面，这个通过点击图片后根据本身的三维参数修改_x/_y/_z来实现：

<dl><dt>JScript code </dt><dd>
<pre>
<div><!--

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

-->img.onclick = function(){
    i3D._z = -options.z &#124; 0;
    i3D._x = -options.x &#124; 0;
    i3D._y = options.y &#124; 0;
    i3D.show();
}</div></pre>
</dd></dl>图片在mouseover时会显示一个边框，为了让图片加边框后不发生位移，加了一个"-1px"的margin，mouseout时再去掉。
这里3DRoom跟参考的效果还是有差距，本文主要还是对3D效果的实现和研究。

<strong>【模式选择】</strong>

css3模式稳定，大部分浏览器都支持，除了ie。
zoom模式兼容性不好，但ie支持。
base最慢，但兼容性好，而且没有bug。
一般情况下应优先使用css3模式，然后是zoom，最后base，但像3DRoom那样的情况就要按实际选择了。
设计的时候，ie是打算用Matrix滤镜的，但开发中发现一些问题，效率又太低，就不考虑了。

<strong>使用说明</strong>

实例化时，必须有容器作为参数：

<dl><dt>JScript code </dt><dd>
<pre>
<div><!--

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

-->var i3D = new Image3D( container, options );</div></pre>
</dd></dl>然后调用i3D方法添加图片：

<dl><dt>JScript code </dt><dd>
<pre>
<div><!--

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

-->i3D.add( src, options );</div></pre>
</dd></dl>可选参数用来设置系统的默认属性，包括：
属性: 默认值//说明
mode: "css3&#124;zoom&#124;base",//模式
x: 0,//水平偏移值
y: 0,//垂直偏移值
z: 0,//深度偏移值
r: 0,//旋转角度(css3支持)
fixedFar: false,//是否远点固定
getScale: function(z){ return 1 - z / 1000; },//获取比例方法
onError: function(err){}//出错时执行

add方法的可选参数在图片加载中已经说明。

还提供了以下方法：
add：添加图片；
show：显示效果；
reset：重置默认状态；
dispose：销毁程序。

加入拖动方向变换或滚轮深度变换扩展后，可通过设置相关参数定义变换范围。<span id="_marker"> </span><strong>程序说明</strong>

【实现原理】

3D效果的关键，是深度的实现。
把3D容器看成一个由多个不同深度的层组成的空间，这些层的尺寸默认跟容器一样。
层里面放了该深度的图片，并且各个层会根据深度的变化做缩放变换，从视觉上产生深度差。
缩放变换的比例按照最近点为1，最远点为0，逐渐变化。
关键的地方是层里面图片的尺寸和坐标必须跟着层同时变换，这个通过css3的transform很简单就能实现。
这样图片只需设置好尺寸再相对层定好位就行了，避免了随深度变化要不断调整图片尺寸和定位的麻烦。

<strong>【图片加载】</strong>

在程序初始化之后，就可以调用add方法来添加图片。
add方法有两个参数：图片地址和参数对象，还会返回一个图片操作对象。
操作对象包含以下属性和方法，方便对图片进行操作：
img: 图片元素
src: 图片地址
options: 参数对象
show: 显示图片方法
remove: 移除图片方法
其中options可以设置如下属性：
属性: 默认值//说明
x: 0,//水平位移
y: 0,//垂直位移
z: 0,//深度
width: 0,//宽度
height: 0,//高度
scaleW: 1,//宽度缩放比例
scaleH: 1//高度缩放比例
其中x、y分别是水平和垂直坐标的位移参数，坐标原点在容器底部中间，水平坐标向右，纵坐标向上，单位是px。
而z是深度，用于比例的计算，方向由近点到原点。
坐标系如下图：
<img src="http://images.cnblogs.com/cnblogs_com/cloudgamer/169629/o_coordinate.gif" alt="" />

图片加载成功后，就会执行_load图片加载程序。
首先根据参数设置图片样式：

<dl class="code"><dt>JScript code </dt><dd>
<pre>
<div><!--

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

--><span style="color: #000000;">img.style.cssText </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #000000;">"</span><span style="color: #000000;">position:absolute;border:0;padding:0;margin:0;-ms-interpolation-mode:nearest-neighbor;</span><span style="color: #000000;">"</span><span style="color: #000000;">
    </span><span style="color: #000000;">+</span><span style="color: #000000;"> </span><span style="color: #000000;">"</span><span style="color: #000000;">z-index:</span><span style="color: #000000;">"</span><span style="color: #000000;"> </span><span style="color: #000000;">+</span><span style="color: #000000;"> (</span><span style="color: #000000;">99999</span><span style="color: #000000;"> </span><span style="color: #000000;">-</span><span style="color: #000000;"> z) </span><span style="color: #000000;">+</span><span style="color: #000000;"> </span><span style="color: #000000;">"</span><span style="color: #000000;">;width:</span><span style="color: #000000;">"</span><span style="color: #000000;"> </span><span style="color: #000000;">+</span><span style="color: #000000;"> width </span><span style="color: #000000;">+</span><span style="color: #000000;"> </span><span style="color: #000000;">"</span><span style="color: #000000;">px;height:</span><span style="color: #000000;">"</span><span style="color: #000000;"> </span><span style="color: #000000;">+</span><span style="color: #000000;"> height </span><span style="color: #000000;">+</span><span style="color: #000000;"> </span><span style="color: #000000;">"</span><span style="color: #000000;">px;</span><span style="color: #000000;">"</span><span style="color: #000000;">
    </span><span style="color: #000000;">+</span><span style="color: #000000;"> </span><span style="color: #000000;">"</span><span style="color: #000000;">left:</span><span style="color: #000000;">"</span><span style="color: #000000;"> </span><span style="color: #000000;">+</span><span style="color: #000000;"> (((clientWidth </span><span style="color: #000000;">-</span><span style="color: #000000;"> width) </span><span style="color: #000000;">/</span><span style="color: #000000;"> </span><span style="color: #000000;">2</span><span style="color: #000000;"> </span><span style="color: #000000;">+</span><span style="color: #000000;"> opt.x) </span><span style="color: #000000;">/</span><span style="color: #000000;"> clientWidth </span><span style="color: #000000;">*</span><span style="color: #000000;"> </span><span style="color: #000000;">100</span><span style="color: #000000;">).toFixed(</span><span style="color: #000000;">5</span><span style="color: #000000;">) </span><span style="color: #000000;">+</span><span style="color: #000000;"> </span><span style="color: #000000;">"</span><span style="color: #000000;">%;</span><span style="color: #000000;">"</span><span style="color: #000000;">
    </span><span style="color: #000000;">+</span><span style="color: #000000;"> </span><span style="color: #000000;">"</span><span style="color: #000000;">top:</span><span style="color: #000000;">"</span><span style="color: #000000;"> </span><span style="color: #000000;">+</span><span style="color: #000000;"> ((clientHeight </span><span style="color: #000000;">-</span><span style="color: #000000;"> height </span><span style="color: #000000;">-</span><span style="color: #000000;"> opt.y) </span><span style="color: #000000;">/</span><span style="color: #000000;"> clientHeight </span><span style="color: #000000;">*</span><span style="color: #000000;"> </span><span style="color: #000000;">100</span><span style="color: #000000;">).toFixed(</span><span style="color: #000000;">5</span><span style="color: #000000;">) </span><span style="color: #000000;">+</span><span style="color: #000000;"> </span><span style="color: #000000;">"</span><span style="color: #000000;">%;</span><span style="color: #000000;">"</span><span style="color: #000000;">;</span></div></pre>
</dd></dl>绝对定位是必须的，宽度和高度根据参数设置就行。
left和top根据坐标参数计算，这里需要用百分比的形式表示，后面再详细说明。
还要给图片增加一个_z属性记录深度，方便调用。
最后插入对应z的层，并重新显示该层。

<strong>【层变换】</strong>

图片加载后，会用_insertLayer程序把图片插入到对应的层中。
_insertLayer有两个参数：图片元素和z深度。
程序用_layers对象，以z为关键字记录对应的层元素。
如果在该深度还没有创建层，会自动创建一个：

<dl class="code"><dt>JScript code </dt><dd>
<pre>
<div><!--

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

--><span style="color: #000000;">layer </span><span style="color: #000000;">=</span><span style="color: #000000;"> document.createElement(</span><span style="color: #000000;">"</span><span style="color: #000000;">div</span><span style="color: #000000;">"</span><span style="color: #000000;">);
layer.style.cssText </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #000000;">"</span><span style="color: #000000;">position:absolute;border:0;padding:0;margin:0;left:0;top:0;visibility:hidden;background:transparent;width:</span><span style="color: #000000;">"</span><span style="color: #000000;"> </span><span style="color: #000000;">+</span><span style="color: #000000;"> </span><span style="color: #0000ff;">this</span><span style="color: #000000;">._clientWidth </span><span style="color: #000000;">+</span><span style="color: #000000;"> </span><span style="color: #000000;">"</span><span style="color: #000000;">px;height:</span><span style="color: #000000;">"</span><span style="color: #000000;"> </span><span style="color: #000000;">+</span><span style="color: #000000;"> </span><span style="color: #0000ff;">this</span><span style="color: #000000;">._clientHeight </span><span style="color: #000000;">+</span><span style="color: #000000;"> </span><span style="color: #000000;">"</span><span style="color: #000000;">px;</span><span style="color: #000000;">"</span><span style="color: #000000;">;</span></div></pre>
</dd></dl>层的坐标和尺寸要跟容器一致，因为插入图片的坐标是相对容器来定义的，这样使用起来比较方便。
还会添加一个_count属性，记录层包含的图片数，最后插入到容器并记录到_layers对象中。
获取层对象后，就把图片插入层中，并把_count计数加1。

接着就可以通过_showLayer程序根据深度显示对应的层。
程序包含三个坐标属性：_x、_y、_z，表示容器的三维坐标的偏移量。
首先通过_getScale获取比例方法得到z深度的缩放比例scale。
比例大于1，说明图片在视觉深度的后面，理论上应该看不到，所以隐藏；小于0，就是小到看不到了也隐藏。

而_x和_y偏移量也需要根据深度来重新计算，程序有两种偏移方式：远点固定和近点固定。
远点固定的意思是平面位移偏移量随着深度逐渐变小，产生以最远点为固定点移动方向的效果，近点固定就刚好相反。
要实现这个效果，只要位移偏移量也跟着比例变化就行了，即远点固定时偏移量跟比例成正比，远点固定时是反比：

<dl class="code"><dt>JScript code </dt><dd>
<pre>
<div><!--

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

--><span style="color: #0000ff;">var</span><span style="color: #000000;"> moveScale </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #0000ff;">this</span><span style="color: #000000;">.fixedFar </span><span style="color: #000000;">?</span><span style="color: #000000;"> scale : (</span><span style="color: #000000;">1</span><span style="color: #000000;"> </span><span style="color: #000000;">-</span><span style="color: #000000;"> scale);</span></div></pre>
</dd></dl>然后把这些参数交给_show程序来处理，并显示效果。

为了最大限度地利用层元素，程序会在_remove图片移除程序中，把没有图片的层放到_invalid废弃层集合中，在需要插入层时，优先从_invalid中获取。

<strong>【缩放比例】</strong>

上面已经说了，缩放比例应该按照最近点为1，最远点为0，逐渐变化。
程序默认是通过下面的公式计算：

<dl class="code"><dt>JScript code </dt><dd>
<pre>
<div><!--

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

--><span style="color: #0000ff;">function</span><span style="color: #000000;">(z){ </span><span style="color: #0000ff;">return</span><span style="color: #000000;"> </span><span style="color: #000000;">1</span><span style="color: #000000;"> </span><span style="color: #000000;">-</span><span style="color: #000000;"> z </span><span style="color: #000000;">/</span><span style="color: #000000;"> </span><span style="color: #000000;">1000</span><span style="color: #000000;">; }</span></div></pre>
</dd></dl>但用这个公式实现3DRoom效果的时候，会发现比例变化太急速，并不像这个<a title="3DRoom" href="http://www.dhteumeuleu.com/mandatory-upgrade/" target="_blank"><span style="color: #002d93;">3DRoom</span></a>那样平稳。

研究代码后发现，原来它用的公式是这样的：

<dl class="code"><dt>JScript code </dt><dd>
<pre>
<div><!--

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

--><span style="color: #0000ff;">this</span><span style="color: #000000;">.r </span><span style="color: #000000;">=</span><span style="color: #000000;"> FL </span><span style="color: #000000;">/</span><span style="color: #000000;"> (FL </span><span style="color: #000000;">+</span><span style="color: #000000;"> (z </span><span style="color: #000000;">*</span><span style="color: #000000;"> Z));</span></div></pre>
</dd></dl>其中FL和Z是一个常量来的，即公式可表示成：

<dl class="code"><dt>JScript code </dt><dd>
<pre>
<div><!--

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

--><span style="color: #0000ff;">function</span><span style="color: #000000;">(z){ </span><span style="color: #0000ff;">return</span><span style="color: #000000;"> </span><span style="color: #000000;">1</span><span style="color: #000000;">/</span><span style="color: #000000;">(1+z</span><span style="color: #000000;">/</span><span style="color: #000000;">常量); }</span></div></pre>
</dd></dl>那按照这个公式，深度为0时比例为1，深度为常量时比例为0.5，深度为无穷大时比例为0。

变化效果可以参考这里的<a title="公式演示程序" href="http://www.cnblogs.com/cloudgamer/archive/2010/09/20/Image3D.html" target="_blank"><span style="color: #002d93;">公式演示程序</span></a>。
可以看出，缩放比例在默认公式是均匀变化的，而3DRoom公式是先快后慢，而且是逐渐变慢，所以有那种平稳的感觉。
那按照实际，还可以自己设计适合的公式，只要符合从1到0变化就行。

<strong>【css3模式】</strong>

程序中有三种缩放变换方式：css3、zoom和base，模式的程序结构跟上一篇<a title="图片变换" href="http://www.cnblogs.com/cloudgamer/archive/2010/08/16/ImageTrans.html" target="_blank"><span style="color: #002d93;">图片变换</span></a>类似。
缩放变换的目的是根据传递过来的比例和位置偏移量，把缩放效果显示出来，实现最终的3D效果。

css3模式使用的是css3的transform，在上一篇已经介绍过用transform的matrix做缩放和旋转，这次还需要后面两个参数做位置变换。
后面两个参数要注意单位的设置，在MDC的<a title="-moz-transform" href="https://developer.mozilla.org/en/CSS/-moz-transform" target="_blank"><span style="color: #002d93;">-moz-transform</span></a>有说明：
Gecko (Firefox) accepts a &#60;length&#62; value for tx and ty.
Safari (WebKit) and Opera currently support a unitless &#60;number&#62; for tx and ty.
意思是位移参数tx和ty，在Firefox需要带单位，而WebKit和Opera只需要数字（不带单位，默认px）。
程序会根据浏览器设置单位。

使用css3模式，还可以通过修改_r弧度属性进行旋转。
最后设置matrix实现变换：

<dl class="code"><dt>JScript code </dt><dd>
<pre>
<div><!--

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

--><span style="color: #000000;">layer.style[ css3Transform ] </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #000000;">"</span><span style="color: #000000;">matrix(</span><span style="color: #000000;">"</span><span style="color: #000000;">
    </span><span style="color: #000000;">+</span><span style="color: #000000;"> ( Cos </span><span style="color: #000000;">*</span><span style="color: #000000;"> scale).toFixed(</span><span style="color: #000000;">5</span><span style="color: #000000;">) </span><span style="color: #000000;">+</span><span style="color: #000000;"> </span><span style="color: #000000;">"</span><span style="color: #000000;">,</span><span style="color: #000000;">"</span><span style="color: #000000;"> </span><span style="color: #000000;">+</span><span style="color: #000000;"> (Sin </span><span style="color: #000000;">*</span><span style="color: #000000;"> scale).toFixed(</span><span style="color: #000000;">5</span><span style="color: #000000;">) </span><span style="color: #000000;">+</span><span style="color: #000000;"> </span><span style="color: #000000;">"</span><span style="color: #000000;">,</span><span style="color: #000000;">"</span><span style="color: #000000;">
    </span><span style="color: #000000;">+</span><span style="color: #000000;"> (</span><span style="color: #000000;">-</span><span style="color: #000000;">Sin </span><span style="color: #000000;">*</span><span style="color: #000000;"> scale).toFixed(</span><span style="color: #000000;">5</span><span style="color: #000000;">) </span><span style="color: #000000;">+</span><span style="color: #000000;"> </span><span style="color: #000000;">"</span><span style="color: #000000;">,</span><span style="color: #000000;">"</span><span style="color: #000000;"> </span><span style="color: #000000;">+</span><span style="color: #000000;"> (Cos </span><span style="color: #000000;">*</span><span style="color: #000000;"> scale).toFixed(</span><span style="color: #000000;">5</span><span style="color: #000000;">) </span><span style="color: #000000;">+</span><span style="color: #000000;"> </span><span style="color: #000000;">"</span><span style="color: #000000;">, </span><span style="color: #000000;">"</span><span style="color: #000000;">
    </span><span style="color: #000000;">+</span><span style="color: #000000;"> Math.round(x) </span><span style="color: #000000;">+</span><span style="color: #000000;"> unit </span><span style="color: #000000;">+</span><span style="color: #000000;"> </span><span style="color: #000000;">"</span><span style="color: #000000;">, </span><span style="color: #000000;">"</span><span style="color: #000000;"> </span><span style="color: #000000;">+</span><span style="color: #000000;"> Math.round(y) </span><span style="color: #000000;">+</span><span style="color: #000000;"> unit </span><span style="color: #000000;">+</span><span style="color: #000000;"> </span><span style="color: #000000;">"</span><span style="color: #000000;">)</span><span style="color: #000000;">"</span><span style="color: #000000;">;</span></div></pre>
</dd></dl>这里还要注意一个问题，计算得到的比例可能是一个很长的小数，在拼字符时会出问题。
例如执行：alert(0.0000001)，会得到“1e-7”，js会用这个结果来拼字符，得到错误的结果。
所以在做数字和字符的拼接时，能用整数的应该先转成整数，小数的话也要用toFixed转换一下。

<strong>【zoom模式】</strong>

ie还不支持transform，但有一个zoom样式能实现类似的效果。
由于zoom后，尺寸会发生变化，所以需要修正left和top移动到正确的位置。

除了ie，webkit(chrome/safari)也支持zoom，不过ie6/7、ie8和webkit的实现并不完全相同。
测试以下代码：

<dl class="code"><dt>JScript code </dt><dd>
<pre>
<div><!--

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

--><span style="color: #000000;">&#60;</span><span style="color: #000000;">style</span><span style="color: #000000;">&#62;</span><span style="color: #000000;">
.inner{ width:100px; height:100px; position:absolute; background:#0CF; zoom:</span><span style="color: #000000;">0.5</span><span style="color: #000000;">; top:50px; left:50px;}
.inner div{ width:50px; height:50px;position:absolute; left:25px;background:#CCC;}
</span><span style="color: #000000;">&#60;</span><span style="color: #000000;">/</span><span style="color: #000000;">style&#62;</span><span style="color: #000000;">
</span><span style="color: #000000;">&#60;</span><span style="color: #000000;">div style</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">width:150px;height:150px; border:1px solid #000; position:relative;</span><span style="color: #000000;">"</span><span style="color: #000000;">&#62;</span><span style="color: #000000;">
</span><span style="color: #000000;">&#60;</span><span style="color: #000000;">div class</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">inner</span><span style="color: #000000;">"</span><span style="color: #000000;"> id</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">t</span><span style="color: #000000;">"</span><span style="color: #000000;">&#62;&#60;</span><span style="color: #000000;">div</span><span style="color: #000000;">&#62;</span><span style="color: #000000;">test</span><span style="color: #000000;">&#60;</span><span style="color: #000000;">/</span><span style="color: #000000;">div&#62;&#60;</span><span style="color: #000000;">/</span><span style="color: #000000;">div</span><span style="color: #000000;">&#62;</span><span style="color: #000000;">
</span><span style="color: #000000;">&#60;</span><span style="color: #000000;">/</span><span style="color: #000000;">div&#62;</span></div></pre>
</dd></dl>在ie6/7实现了想要的效果，但在webkit显示的位置错了。
原因是使用zoom后，元素的left和top也会随着缩放，那只要按比例重新计算就行。
像上面的例子，只要把left和top改成50/0.5，即100就正确了。

ie8就更麻烦，里面的内容是按zoom缩放了，但left和top还是原来的大小。
被这个问题困扰了很久，最后发现通过用百分比定位就可以解决，在图片加载时left和top要用百分比就是这个原因。
例如在例子中，修正left和top，并把最里面的div的left改成25%就可以了。
在ie8还看到一个问题，在zoom后，内容是缩小了，容器和内部元素的尺寸却没有变化，还好这不会影响到图片的显示，定位也要用left和top，免得麻烦。
还有，如果zoom的元素的尺寸用百分比设置，那元素的尺寸就不会根据zoom缩放了。

在计算时还要注意一个问题，上面提到在webkit和ie8，left和top都需要除以scale来修正，当scale接近0到一定程度，结果会变成Infinity(无穷大)。
用Infinity进行运算会出错，需要修正这个问题：

<dl class="code"><dt>JScript code </dt><dd>
<pre>
<div><!--

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

--><span style="color: #000000;">left </span><span style="color: #000000;">=</span><span style="color: #000000;"> Math.min(MAX, Math.max( </span><span style="color: #000000;">-</span><span style="color: #000000;">MAX, left )) </span><span style="color: #000000;">&#124;</span><span style="color: #000000;"> </span><span style="color: #000000;">0</span><span style="color: #000000;">;
top </span><span style="color: #000000;">=</span><span style="color: #000000;"> Math.min(MAX, Math.max( </span><span style="color: #000000;">-</span><span style="color: #000000;">MAX, top )) </span><span style="color: #000000;">&#124;</span><span style="color: #000000;"> </span><span style="color: #000000;">0</span><span style="color: #000000;">;</span></div></pre>
</dd></dl>其中MAX是Number.MAX_VALUE(js能表达的最大数)。

<strong>【base模式】</strong>

还有兼容全部浏览器的base模式，用的是传统的方法，即根据缩放比例，计算并设置每个图片的尺寸和位置。
每次显示时，历遍层里面的图片，再逐个计算设置。
计算需要图片的原始位置和尺寸，在第一次计算时会把数据保存在_original属性中：

<dl class="code"><dt>JScript code </dt><dd>
<pre>
<div><!--

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

--><span style="color: #0000ff;">var</span><span style="color: #000000;"> original </span><span style="color: #000000;">=</span><span style="color: #000000;"> img._original </span><span style="color: #000000;">=</span><span style="color: #000000;"> img._original </span><span style="color: #000000;">&#124;&#124;</span><span style="color: #000000;"> {
    width: img.offsetWidth,    height: img.offsetHeight,
    left: img.offsetLeft,     top: img.offsetTop
};</span></div></pre>
</dd></dl>尺寸只要根据比例缩放就行，位置除了计算相对层的缩放还要加上相对容器的位移，这个跟zoom模式的计算是一样的。
理解了层变换的方式后，再理解这个就不难了。

<strong>【zIndex】</strong>

深度除了要缩放和定位，还需要合理的前后遮盖。
前后遮盖需要用[url=http://www.w3.org/TR/WD-positioning-970131#'z-index']zIndex[/url]来实现，可以在图片或层上设置。

首先最简单的方法是在层上设置：

<dl class="code"><dt>JScript code </dt><dd>
<pre>
<div><!--

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

--><span style="color: #000000;">&#60;</span><span style="color: #000000;">style</span><span style="color: #000000;">&#62;</span><span style="color: #000000;">
div,img{width:200px;height:200px;position:absolute;left:</span><span style="color: #000000;">0</span><span style="color: #000000;">;top:</span><span style="color: #000000;">0</span><span style="color: #000000;">;}
img{width:150px;height:150px;}
</span><span style="color: #000000;">&#60;</span><span style="color: #000000;">/</span><span style="color: #000000;">style&#62;</span><span style="color: #000000;">
</span><span style="color: #000000;">&#60;</span><span style="color: #000000;">div style</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">z-index:300;</span><span style="color: #000000;">"</span><span style="color: #000000;">&#62;</span><span style="color: #000000;">
    </span><span style="color: #000000;">&#60;</span><span style="color: #000000;">img style</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">background:#0C9;</span><span style="color: #000000;">"</span><span style="color: #000000;"> alt</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">300</span><span style="color: #000000;">"</span><span style="color: #000000;"> onclick</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">alert(300)</span><span style="color: #000000;">"</span><span style="color: #000000;">&#62;</span><span style="color: #000000;">
</span><span style="color: #000000;">&#60;</span><span style="color: #000000;">/</span><span style="color: #000000;">div&#62;</span><span style="color: #000000;">
</span><span style="color: #000000;">&#60;</span><span style="color: #000000;">div style</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">z-index:100;</span><span style="color: #000000;">"</span><span style="color: #000000;">&#62;</span><span style="color: #000000;">
    </span><span style="color: #000000;">&#60;</span><span style="color: #000000;">img style</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">background:#396;left:50px;top:50px;</span><span style="color: #000000;">"</span><span style="color: #000000;"> alt</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">100</span><span style="color: #000000;">"</span><span style="color: #000000;"> onclick</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">alert(100)</span><span style="color: #000000;">"</span><span style="color: #000000;">&#62;</span><span style="color: #000000;">
</span><span style="color: #000000;">&#60;</span><span style="color: #000000;">/</span><span style="color: #000000;">div&#62;</span></div></pre>
</dd></dl>实现一般的3D效果可以这样设置。
但点击测试，在ff和webkit前面的能触发后面的不能触发，而ie和opera就前后都可以触发。
ps：如果img换成div，那么ie和opera后面的元素也不能触发，原因还不清楚。
这样要想像3DRoom那样触发图片事件的话就不能在层设置zIndex。

还可以在图片上设置：

<dl class="code"><dt>JScript code </dt><dd>
<pre>
<div><!--

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

--><span style="color: #000000;">&#60;</span><span style="color: #000000;">style</span><span style="color: #000000;">&#62;</span><span style="color: #000000;">
div,img{width:200px;height:200px;position:absolute;left:</span><span style="color: #000000;">0</span><span style="color: #000000;">;top:</span><span style="color: #000000;">0</span><span style="color: #000000;">;}
img{width:150px;height:150px;}
</span><span style="color: #000000;">&#60;</span><span style="color: #000000;">/</span><span style="color: #000000;">style&#62;</span><span style="color: #000000;">
</span><span style="color: #000000;">&#60;</span><span style="color: #000000;">div</span><span style="color: #000000;">&#62;</span><span style="color: #000000;">
    </span><span style="color: #000000;">&#60;</span><span style="color: #000000;">img style</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">background:#0C9;z-index:300;</span><span style="color: #000000;">"</span><span style="color: #000000;"> alt</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">300</span><span style="color: #000000;">"</span><span style="color: #000000;"> onclick</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">alert(300)</span><span style="color: #000000;">"</span><span style="color: #000000;">&#62;</span><span style="color: #000000;">
</span><span style="color: #000000;">&#60;</span><span style="color: #000000;">/</span><span style="color: #000000;">div&#62;</span><span style="color: #000000;">
</span><span style="color: #000000;">&#60;</span><span style="color: #000000;">div</span><span style="color: #000000;">&#62;</span><span style="color: #000000;">
    </span><span style="color: #000000;">&#60;</span><span style="color: #000000;">img style</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">background:#396;left:50px;top:50px;z-index:100;</span><span style="color: #000000;">"</span><span style="color: #000000;"> alt</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">100</span><span style="color: #000000;">"</span><span style="color: #000000;"> onclick</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">alert(100)</span><span style="color: #000000;">"</span><span style="color: #000000;">&#62;</span><span style="color: #000000;">
</span><span style="color: #000000;">&#60;</span><span style="color: #000000;">/</span><span style="color: #000000;">div&#62;</span></div></pre>
</dd></dl>这样图片在所有浏览器都能正常触发，但在ie6/7层叠的效果失效了,看来在ie6/7只能在层用zIndex。
还有一个问题，如果给div加上变换效果：

<dl class="code"><dt>JScript code </dt><dd>
<pre>
<div><!--

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

--><span style="color: #000000;">div{</span><span style="color: #000000;">-</span><span style="color: #000000;">moz</span><span style="color: #000000;">-</span><span style="color: #000000;">transform:scale(</span><span style="color: #000000;">1</span><span style="color: #000000;">);</span><span style="color: #000000;">-</span><span style="color: #000000;">webkit</span><span style="color: #000000;">-</span><span style="color: #000000;">transform:scale(</span><span style="color: #000000;">1</span><span style="color: #000000;">);</span><span style="color: #000000;">-</span><span style="color: #000000;">o</span><span style="color: #000000;">-</span><span style="color: #000000;">transform:scale(</span><span style="color: #000000;">1</span><span style="color: #000000;">);}</span></div></pre>
</dd></dl>那图片上的zIndex就会失效，那css3模式就只能在层设置zIndex了。

总结一下：
在css3模式肯定要在层设置zIndex，但图片也不能触发事件。
在zoom和base模式，应该在图片设置zIndex，但在ie6/7就要在层设置。
这样至少在base模式层叠和图片触发事件都是正常的。

<strong>【msInterpolationMode】</strong>

开始做的时候，效果在ie8下会很卡，但这个<a title="3DRoom" href="http://www.dhteumeuleu.com/mandatory-upgrade/" target="_blank"><span style="color: #002d93;">3DRoom</span></a>却不会卡，最后发现是使用了-ms-interpolation-mode。
这个东西在<a title="aoao" href="http://www.aoao.org.cn/blog/2009/03/img-ms-interpolation-mode/" target="_blank"><span style="color: #002d93;">aoao</span></a>的文章中看过，但没想到可以用在这里。

在MSDN有<a title="msInterpolationMode" href="http://msdn.microsoft.com/en-us/library/ms530822(VS.85).aspx" target="_blank"><span style="color: #002d93;">msInterpolationMode</span></a>的介绍：
Gets or sets the interpolation (resampling) method used to stretch images.
即获取或设置用于拉伸图像的插值（重采样）方法。
它有两个值：
nearest-neighbor：使用近邻插值模式。
bicubic：使用高品质的双三次插值模式。
这些名词比较专业，我们只要知道使用nearest-neighbor效率高但效果差，而bicubic效果好效率低就够了。
程序把它设为nearest-neighbor提高效率，这样在ie8中也不会卡了。

<strong>【拖动方向变换/滚轮深度变换】</strong>

程序扩展了拖动视觉变换和滚轮深度变换。
拖动和滚动的做法跟上一个的做法差不多，这里拖动是实现方向的变换，滚轮是实现深度的变换。
移动是通过修改_x和_y属性来实现，缩放是通过修改_z来实现。
修改属性之后再调用show方法显示效果。

<strong>使用技巧</strong>

<strong>【3DRoom】</strong>

在3DRoom效果中，因为要实现图片的触发事件，所以不能用css3模式，原因是上面提到的层叠问题。
上面也提到在ie8被zoom的元素尺寸不会改变，导致触发范围错误，所以也不用zoom模式。
使用base模式就不会有问题了。

在点击图片时，视觉会移动到图片上面，这个通过点击图片后根据本身的三维参数修改_x/_y/_z来实现：

<dl class="code"><dt>JScript code </dt><dd>
<pre>
<div><!--

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

--><span style="color: #000000;">img.onclick </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #0000ff;">function</span><span style="color: #000000;">(){
    i3D._z </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #000000;">-</span><span style="color: #000000;">options.z </span><span style="color: #000000;">&#124;</span><span style="color: #000000;"> </span><span style="color: #000000;">0</span><span style="color: #000000;">;
    i3D._x </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #000000;">-</span><span style="color: #000000;">options.x </span><span style="color: #000000;">&#124;</span><span style="color: #000000;"> </span><span style="color: #000000;">0</span><span style="color: #000000;">;
    i3D._y </span><span style="color: #000000;">=</span><span style="color: #000000;"> options.y </span><span style="color: #000000;">&#124;</span><span style="color: #000000;"> </span><span style="color: #000000;">0</span><span style="color: #000000;">;
    i3D.show();
}</span></div></pre>
</dd></dl>图片在mouseover时会显示一个边框，为了让图片加边框后不发生位移，加了一个"-1px"的margin，mouseout时再去掉。
这里3DRoom跟参考的效果还是有差距，本文主要还是对3D效果的实现和研究。

<strong>【模式选择】</strong>

css3模式稳定，大部分浏览器都支持，除了ie。
zoom模式兼容性不好，但ie支持。
base最慢，但兼容性好，而且没有bug。
一般情况下应优先使用css3模式，然后是zoom，最后base，但像3DRoom那样的情况就要按实际选择了。
设计的时候，ie是打算用Matrix滤镜的，但开发中发现一些问题，效率又太低，就不考虑了。

<strong>使用说明</strong>

实例化时，必须有容器作为参数：

<dl class="code"><dt>JScript code </dt><dd>
<pre>
<div><!--

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

--><span style="color: #0000ff;">var</span><span style="color: #000000;"> i3D </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #0000ff;">new</span><span style="color: #000000;"> Image3D( container, options );</span></div></pre>
</dd></dl>然后调用i3D方法添加图片：

<dl class="code"><dt>JScript code </dt><dd>
<pre>
<div><!--

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

--><span style="color: #000000;">i3D.add( src, options );</span></div></pre>
</dd></dl>可选参数用来设置系统的默认属性，包括：
属性: 默认值//说明
mode: "css3&#124;zoom&#124;base",//模式
x: 0,//水平偏移值
y: 0,//垂直偏移值
z: 0,//深度偏移值
r: 0,//旋转角度(css3支持)
fixedFar: false,//是否远点固定
getScale: function(z){ return 1 - z / 1000; },//获取比例方法
onError: function(err){}//出错时执行

add方法的可选参数在图片加载中已经说明。

还提供了以下方法：
add：添加图片；
show：显示效果；
reset：重置默认状态；
dispose：销毁程序。

加入拖动方向变换或滚轮深度变换扩展后，可通过设置相关参数定义变换范围。]]></description>
		<wfw:commentRss>http://www.wumain.com/php/blog/archives/253/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>[ZT]—请给一位站着死的老兵，保留最后的一点尊严！</title>
		<link>http://www.wumain.com/php/blog/archives/241</link>
		<comments>http://www.wumain.com/php/blog/archives/241#comments</comments>
		<pubDate>Sun, 05 Sep 2010 11:45:38 +0000</pubDate>
		<dc:creator>Ryan</dc:creator>
				<category><![CDATA[心情]]></category>
		<category><![CDATA[中国]]></category>
		<category><![CDATA[刘炜]]></category>
		<category><![CDATA[刘玮]]></category>
		<category><![CDATA[尊严]]></category>
		<category><![CDATA[男篮]]></category>
		<category><![CDATA[老兵]]></category>

		<guid isPermaLink="false">http://www.wumain.com/php/blog/?p=241</guid>
		<description><![CDATA[<div>请给一位站着死的老兵，保留最后的一点尊严！  由 andrelding 发表在<a href="http://www.hoopchina.com/">HoopChina</a>·<a href="http://bbs.hoopchina.com/cba">中国篮球</a> <a href="http://bbs.hoopchina.com/cba">http://bbs.hoopchina.com/cba</a></div>
<!---->回到和毛子的那场，下半时打了3，4分钟，我对一起看球的朋友说，刘玮快不行了。最基本的防守脚步也都快跟不上了。对位的毛子并非特别出色，但刘5还是崩掉了，从他的最强项，防守开始崩掉。  

我从小打球断断续续到30岁停掉，20岁出国读书，工作至今。 和黑的，白的，不黑不白的各色人种打过各种性质的无数比 赛。  

从10多年前知道有刘玮这个球员开始，就一直有个既定的印象，技术一般。

 CBA出国后就没看了，但几届大赛基本没漏。 每次刘5都让我感觉有点小不同。  

丫左手控球不错啊，小抛投挺有谱了，那个给大姚突破后的高点吊球每次都很到位，身板子越来越健壮，出手速  度还变快了。。。。    

慢慢的这个听说是从中锋改打后卫的球员，赢得了我的尊重，他没有天赋，但有自知之明，动作不华丽，但还算  扎实。  

2届世锦赛，2届奥运会，无论是数据，还是场上的气场，这个刘5绝对排的进我心中的前3名。 

在国外，很多中国的比赛，我看的都是英语解说。 刘5   tough Defence, answer ball, nice pass,除大姚外，  出现在解说口中频率最多的名字，他还被误认为是在NBDL打球的。 

与此同时，我又从国内媒体，门户网站上，不断听闻，好像与我眼中看到的事实，截然不同的事情。 

无数朋友骂他是loser,刘萎，独瘤，或很有礼貌的和他家中的女性亲属打招呼。  不解。 

今年碰巧看了上海男篮的几场比赛，不错看得。　于是看了和辽宁，广东的季后赛，爽到爆了。刘５的实力基本是准外援水准的，特别是在客场和辽宁，广东对抗的几场，往往他是拼命从防守做起，硬生生地把比赛从开始就  定性的现象级球员。　噢，这个不容易的。　 

终于到了本次世锦赛，８年内的第５个大赛。大姚不在了，各个球员都很给力，阿联进步明显，猴子终于有了与  他天赋相当的表现，大致丫进攻太吊了，王科比化了。。。　

 嗨，刘５好像有些平淡了，速度上有些慢了，原来大赛中，总有那么几次一条龙，好像也绝迹了。  但关键的得分，防守，还是很到位，但他呆在场上的时间也太长了吧，３０的人，平均３６分钟，５天４场？  这个不妥吧。 

回到本文开始，刘５失误了，在该死的最后５分钟，２次被断球。　刘５掩面倒地的景象我到现在都没有忘记。。。

好戏开始了，各大媒体，网站，有话语权的名嘴，纷纷表示对刘５的强烈不满，拖了这只要震惊世界球队的后腿  。　 

他们以专业人士自居，　无视刘５，最长的上场时间（可能是各国参赛所有队员）　　　　　　　　　　　                                      无视刘５，强悍的球队外线防守。　　　　　　　　　　　
                                      无视刘５，队中年龄第３大。　　　　　　　　　　　
                                      无视刘５，多次僵持阶段弥足珍贵的得分。　　　　　　　　　　　
                                      无视刘５，这个中国１０年老兵最后的尊严。 

他们以专业人士自居，　宽容的看着司克拉，笔录普斯，等等好手在关键时刻的连续失误，出手打铁。　　　　　　　　　　　
                                     高瞻远瞩的指出他们是由于上场时间过长，年龄过大，以老带新，责任过重。 

但却没有写过一篇文章，说过一句，同样善解人意的话，对我们自己的，１０年中，唯一，一个没有替补的，
老兵。　 

没有，根本没有，残酷到令人发指。  

老兵不会死，他只会消然而逝。
 
从此我也叫他刘大，他的大和篮球无关。   

（这篇文章我是写给自己的，或许还是给那些与我此刻同思同想的兄弟们。

    从15年前高考后，就没有连续写过100个字的人。

    刘大可能永远不会看到，但我希望哪一天，大家都老了，我能拍拍他的肩，
    
     说句，哥们当年挺你  ）　]]></description>
		<wfw:commentRss>http://www.wumain.com/php/blog/archives/241/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Javascript 关键字高亮</title>
		<link>http://www.wumain.com/php/blog/archives/235</link>
		<comments>http://www.wumain.com/php/blog/archives/235#comments</comments>
		<pubDate>Mon, 16 Aug 2010 02:48:21 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[技术]]></category>
		<category><![CDATA[findText]]></category>
		<category><![CDATA[getSelection]]></category>
		<category><![CDATA[js]]></category>
		<category><![CDATA[关键字]]></category>
		<category><![CDATA[高亮]]></category>

		<guid isPermaLink="false">http://www.wumain.com/php/blog/?p=235</guid>
		<description><![CDATA[<blockquote>&#60;!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "<a href="http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd</a>"&#62;
&#60;html xmlns="<a href="http://www.w3.org/1999/xhtml">http://www.w3.org/1999/xhtml</a>"&#62;
&#60;head&#62;
&#60;meta http-equiv="Content-Type" content="text/html; charset=utf-8" /&#62;
&#60;title&#62;Untitled Document&#60;/title&#62;
&#60;style type="text/css"&#62;
&#60;!--
.adKeyword {
 color: #FF0000;
}
--&#62;
&#60;/style&#62;
&#60;/head&#62;
&#60;body&#62;
&#60;p&#62;　　一个和尚挑水吃、两个和尚抬水吃、三个和尚没水吃。总寺的方丈大人得知情况后，就派来了一名主持和一名书记，共同负责解决这一问题。主持上任后，发现问题的关键是管理不到位，于是就招聘一些和尚成立了寺庙管理部来制定分工流程。为了更好地借鉴国外的先进经验，寺庙选派唐僧等领导干部出国学习取经；此外，他们还专门花钱请了天主教、基督教的神父传授MBA。神父呆了不久留下几个东东就走了，一个叫BPR，一个叫ERP。&#60;/p&#62;
&#60;p&#62; &#60;/p&#62;
&#60;p&#62;　　书记也没闲着，他认为问题的关键在于人才没有充分利用、寺庙文化没有建设好，于是就成立了人力资源部和寺庙工会等等，并认认真真地走起了竞聘上岗和定岗定编的过场。&#60;/p&#62;
&#60;p&#62; &#60;/p&#62;
&#60;p&#62;　　几天后成效出来了，三个和尚开始拼命地挑水了，可问题是怎么挑也不够喝。不仅如此，小和尚都忙着挑水、寺庙里没人念经了，日子一长，来烧香的客人越来越少，香火钱也变得拮据起来。为了解决收入问题，寺庙管理部、人力资源部等连续召开了几天的会，最后决定，成立专门的挑水部负责后勤和专门的烧香部负责市场前台。同时，为了更好地开展工作，寺庙提拔了十几名和尚分别担任副主持、主持助理，并在每个部门任命了部门小主持、副小主持、小主持助理。&#60;/p&#62;
&#60;p&#62; &#60;/p&#62;
&#60;p&#62;　　老问题终于得到缓解了，可新的问题跟着又来了。前台负责念经的和尚总抱怨口渴水不够喝，后台挑水的和尚也抱怨人手不足、水的需求量太大而且没个准儿，不好伺候。&#60;/p&#62;
&#60;p&#62; &#60;/p&#62;
&#60;p&#62;　　为了更好地解决这一矛盾，经开会研究决定，成立一个新的部门：喝水响应部，专门负责协调前后台矛盾。为了便于沟通、协调，每个部门都设立了对口的联系和尚。   协调虽然有了，但效果却不理想，仔细一研究，原来是由于水的需求量不准、水井数量不足等原因造成的。于是各部门又召开了几次会，决定加强前台念经和尚对饮用水的预测和念经和尚对挑水和尚满意度测评等，让前后台签署协定、相互打分，健全考核机制。为了便于打分考核，寺院特意购买了几个计算机系统，包括挑水统计系统、烧香统计系统、普通香客捐款分析系统、大香客捐款分析系统、挨上必死系统（简称IBS系统）、马上就死系统（简称MS系统）等，同时成立香火钱管理部、香火钱出账部、打井策略研究部、打井建设部、打井维护部等等。由于各个系统出来的数总不准确、都不一致，于是又成立了技术开发中心，负责各个系统的维护、二次开发。由于部门太多、办公场地不足，寺院专门成立了综合部来解决这一问题，最后决定把寺院整个变成办公区，香客烧香只许在山门外烧。 &#60;/p&#62;
&#60;p&#62; &#60;/p&#62;
&#60;p&#62;　　部门多、当官的多档和开会自然就多，为了减少文山会海，综合办牵头召开了N次关于减少开会的会，并下达了“关于减少档的档”。同时，为了精简机构、提高效率，寺院还成立了精简机构办公室、机构改革研究部等部门。 &#60;/p&#62;
&#60;p&#62; &#60;/p&#62;
&#60;p&#62;　　一切似乎都合情合理，但香火钱和喝水的问题还是迟迟不能解决。问题在哪呢？有的和尚提出来每月应该开一次分析会，于是经营分析部就应运而生了。分析需要很多数据和报表，可系统总是做不到，于是每个部门都指派了一些和尚手工统计、填写报表、给系统打工。&#60;/p&#62;
&#60;p&#62; &#60;/p&#62;
&#60;p&#62;　　寺院空前地热闹起来，有的和尚在拼命挑水、有的和尚在拼命念经、有的和尚在拼命协调、有的和尚在拼命分析……忙来忙去，水还是不够喝、香火钱还是不够用。什么原因呢？这个和尚说流程不顺、那个和尚说任务分解不合理，这个和尚说部门界面不清、那个和尚说考核力度不够。只有三个人最清楚问题之关键所在，那三个人就是最早的那三个和尚。说来说去，就是***闲人太多了！他们说：“整天瞎分析个屁！什么***流程问题、职责问题、接口问题、考核问题，明明就是机构臃肿问题！早知今日，还不如当初咱们仨自觉自律一点算了！如今倒好，招来了这么一大帮傻B，一个个不干正经事还***人五人六的，跟屎盆子一样甩都甩不掉！”&#60;/p&#62;
&#60;p&#62; &#60;/p&#62;
&#60;p&#62;　　又过了一年，寺院黄了，和尚们也都死了。人们在水井边发现了几具尸体，是累死的；在寺院里发现了几千具尸体，是渴死的。&#60;/p&#62;
&#60;/body&#62;
&#60;/html&#62;
&#60;script language="JavaScript" type="text/javascript"&#62;&#60;!--

if(document.createRange){
 var range = document.createRange();
}else
 var range = document.body.createTextRange();

if(range.findText){
 while(range.findText("和尚")){
  range.pasteHTML(range.text.fontcolor("#4499ee"));
  range.collapse(true);
 }
}else{
 var s,n;
 s = window.getSelection();
 while(window.find("和尚")){
 
  var n = document.createElement("SPAN");
  n.style.color="#ff0000"

  s.getRangeAt(0).surroundContents(n);
 }
}

//--&#62;&#60;/script&#62;</blockquote>]]></description>
		<wfw:commentRss>http://www.wumain.com/php/blog/archives/235/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>[怀念]湘北十佳球</title>
		<link>http://www.wumain.com/php/blog/archives/232</link>
		<comments>http://www.wumain.com/php/blog/archives/232#comments</comments>
		<pubDate>Sat, 10 Jul 2010 03:56:25 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[心情]]></category>
		<category><![CDATA[Slam Dunk]]></category>
		<category><![CDATA[十佳]]></category>
		<category><![CDATA[湘北]]></category>
		<category><![CDATA[灌篮高手]]></category>

		<guid isPermaLink="false">http://www.wumain.com/php/blog/?p=232</guid>
		<description><![CDATA[<object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="480" height="400" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="src" value="http://www.tudou.com/v/mf6kG5V7gXA/v.swf" /><param name="wmode" value="opaque" /><param name="allowfullscreen" value="true" /><embed type="application/x-shockwave-flash" width="480" height="400" src="http://www.tudou.com/v/mf6kG5V7gXA/v.swf" allowfullscreen="true" wmode="opaque"></embed></object>

<a href="http://www.tudou.com/programs/view/mf6kG5V7gXA/">http://www.tudou.com/programs/view/mf6kG5V7gXA/</a>]]></description>
		<wfw:commentRss>http://www.wumain.com/php/blog/archives/232/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>各大浏览器内核（Rendering Engine）</title>
		<link>http://www.wumain.com/php/blog/archives/225</link>
		<comments>http://www.wumain.com/php/blog/archives/225#comments</comments>
		<pubDate>Mon, 05 Jul 2010 08:52:43 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[技术]]></category>
		<category><![CDATA[浏览器]]></category>
		<category><![CDATA[Chrome]]></category>
		<category><![CDATA[FF]]></category>
		<category><![CDATA[FireFox]]></category>
		<category><![CDATA[Gecko]]></category>
		<category><![CDATA[IE]]></category>
		<category><![CDATA[Layout engine]]></category>
		<category><![CDATA[Maxthon]]></category>
		<category><![CDATA[Opera]]></category>
		<category><![CDATA[Rendering Engine]]></category>
		<category><![CDATA[Safari]]></category>
		<category><![CDATA[Trident]]></category>
		<category><![CDATA[兼容]]></category>
		<category><![CDATA[内核]]></category>
		<category><![CDATA[引擎]]></category>

		<guid isPermaLink="false">http://www.wumain.com/php/blog/?p=225</guid>
		<description><![CDATA[记得刚开始写网页的时候，听童鞋们说各大浏览器的内核，也是懵懵懂懂的，知一不知其二，今天特地查一下：

内核只是一个通俗的说法，其英文名称为“Layout engine”，翻译过来就是“排版引擎”，也被称为“页面渲染引擎”（下文中各种说法通用）。它负责取得网页的内容（HTML、XML、图像等等）、整 理信息（例如加入CSS等），以及计算网页的显示方式，然后会输出至显示器或打印机。所有网页浏览器、电子邮件客户端以及其它需要编辑、显示网络内容的应 用程序都需要排版引擎。

浏览器最重要或者说核心的部分是“Rendering Engine”，可大概译为“解释引擎”，不过我们一般习惯将之称为“浏览器内核”。负责对网页语法的解释（如HTML、JavaScript）并渲染（显示）网页。

所以，通常所谓的浏览器内核也就是浏览器所采用的渲染引擎，渲染引擎决定了浏览器如何显示网页 的内容以及页面的格式信息。不同的浏览器内核对网页编写语法的解释也有不同，因此同一网页在不同的内核的浏览器里的渲染（显示）效果也可能不同，这也是网 页编写者需要在不同内核的浏览器中测试网页显示效果的原因。

浏览器内核很多，如果加上所有的几乎没有什么人在用的非商业的免费内核，那么可能大约有10款以上甚至更多，不过通常我们比较常见的大约只有以下四种，下面先简单介绍一下。
<h2>Trident</h2>
<strong>Trident</strong>： IE浏览器使用的内核,该内核程序在1997年的IE4中首次被采用，是微软在Mosaic代码的基础之上修改而来的，并沿用到目前的IE8。 Trident实际上是一款开放的内核，其接口内核设计的相当成熟，因此才有许多采用IE内核而非IE的浏览器涌现（如 Maxthon、The World 、TT、GreenBrowser、AvantBrowser等）。此外，为了方便也有很多人直接简称其为IE内核（当然也不排除有部分人是因为不知道内 核名称而只好如此说）。

由于IE本身的“垄断性”（虽然名义上IE并非垄断，但实际上，特别是从Windows 95年代一直到XP初期，就市场占有率来说IE的确借助Windows的东风处于“垄断”的地位）而使得Trident内核的长期一家独大，微软很长时间 都并没有更新Trident内核，这导致了两个后果——一是Trident内核曾经几乎与W3C标准脱节（2005年），二是Trident内核的大量 Bug等安全性问题没有得到及时解决，然后加上一些致力于开源的开发者和一些学者们公开自己认为IE浏览器不安全的观点，也有很多用户转向了其他浏览 器，Firefox和Opera就是这个时候兴起的。非Trident内核浏览器的市场占有率大幅提高也致使许多网页开发人员开始注意网页标准和非IE浏 览器的浏览效果问题。

<span style="color: #333399;">代表浏览器：IE4，IE5，IE6，IE7，IE8，IE9，Maxthon，The World，GreenBrowser，腾讯TT等。</span>
<h2>Gecko</h2>
<strong>Gecko</strong>： Netscape6开始采用的内核，后来的Mozilla FireFox也采用了该内核，Gecko的特点是代码完全公开，因此，其可开发程度很高，全世界的程序员都可以为其编写代码，增加功能。因为这是个开源 内核，因此受到许多人的青睐，Gecko内核的浏览器也很多，这也是Geckos内核虽然年轻但市场占有率能够迅速提高的重要原因。

事实上，Gecko引擎的由来跟IE不无关系，前面说过IE没有使用W3C的标准，这导致了微 软内部一些开发人员的不满；他们与当时已经停止更新了的 Netscape的一些员工一起创办了Mozilla，以当时的Mosaic内核为基础重新编写内核，于是开发出了Geckos。不过事实上，Gecko 内核的浏览器仍然还是Firefox用户最多，所以有时也会被称为Firefox内核。此外Gecko也是一个跨平台内核，可以在Windows、 BSD、Linux和Mac OS X中使用。

<span style="color: #333399;">代表浏览器：Netscape，Mazilla Firefox；</span>
<h2>Presto</h2>
<strong>Presto</strong>： 目前Opera采用的内核，该内核在2003年的Opera7中首次被使用，该款引擎的特点就是渲染速度的优化达到了极致，也是目前公认网页浏览速度最快的浏览器内核，然而代价是牺牲了网页的兼容性。

实际上这是一个动态内核，与前面几个内核的最大的区别就在脚本处理上，Presto有着天生的 优势，页面的全部或者部分都能够在回应脚本事件时等情况下被重新解析。此外该内核在执行Javascrīpt的时候有着最快的速度，根据在同等条件下的测 试，Presto内核执行同等Javascrīpt所需的时间仅有Trident和Gecko内核的约1/3（Trident内核最慢，不过两者相差没有 多大）。只可惜Presto是商业引擎，使用Presto的 除开Opera以外，只剩下NDSBrowser、Wii Internet Channle、Nokia 770网络浏览器等，这很大程度上限制了Presto的发展。

<span style="color: #333399;">代表浏览器：Opera，NDSBrowser，Wii Internet Channle，Nokia 770；</span>
<h2>Webkit</h2>
<strong>Webkit</strong>：苹果公司自己的内核，也是苹果的Safari浏览器使用的内核。 Webkit引擎包含WebCore排版引擎及JavaScriptCore解析引擎，均是从KDE的KHTML及KJS引擎衍生而来，它们都是自由软 件，在GPL条约下授权，同时支持BSD系统的开发。所以Webkit也是自由软件，同时开放源代码。在安全方面不受IE、Firefox的制约，所以 Safari浏览器在国内还是很安全的。

限于Mac OS X的使用不广泛和Safari浏览器曾经只是Mac OS X的专属浏览器，这个内核本身应该说市场范围并不大；但似乎根据最新的浏览器调查表明，该浏览器的市场甚至已经超过了Opera的Presto了——当然 这一方面得益于苹果转到x86架构之后的人气暴涨，另外也是因为Safari 3终于推出了Windows版的缘故吧。Mac下还有OmniWeb、Shiira等人气很高的浏览器。

google的chrome也使用webkit作为内核。

WebKit 内核在手机上的应用也十分广泛，例如 Google 的手机 Gphone、 Apple 的 iPhone, Nokia’s Series 60 browser 等所使用的 Browser 内核引擎，都是基于 WebKit。

2010年4月8日最新的搜狗浏览器也是采用了webkit内核，号称双引擎内核，呼声很高，期待其发展。

<span style="color: #333399;">代表浏览器：Safari，Chrome；</span>]]></description>
		<wfw:commentRss>http://www.wumain.com/php/blog/archives/225/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>暂时折腾完了，新的3A平台</title>
		<link>http://www.wumain.com/php/blog/archives/215</link>
		<comments>http://www.wumain.com/php/blog/archives/215#comments</comments>
		<pubDate>Sat, 29 May 2010 07:49:09 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[心情]]></category>
		<category><![CDATA[1095T]]></category>
		<category><![CDATA[3A]]></category>
		<category><![CDATA[5870]]></category>
		<category><![CDATA[890]]></category>
		<category><![CDATA[890FX]]></category>
		<category><![CDATA[AMD]]></category>
		<category><![CDATA[ASUS]]></category>
		<category><![CDATA[ATI]]></category>
		<category><![CDATA[C4F]]></category>
		<category><![CDATA[华硕]]></category>
		<category><![CDATA[平台]]></category>

		<guid isPermaLink="false">http://www.wumain.com/php/blog/?p=215</guid>
		<description><![CDATA[<a href="http://www.wumain.com/php/blog/wp-content/uploads/2010/05/无标题.jpg" target="_blank"><img src="http://www.wumain.com/php/blog/wp-content/uploads/2010/05/无标题.jpg" alt="" title="无标题" width="600" height="336" class="aligncenter size-medium wp-image-216" /></a>]]></description>
		<wfw:commentRss>http://www.wumain.com/php/blog/archives/215/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>ASUS Crosshaur IV Forumula 入手</title>
		<link>http://www.wumain.com/php/blog/archives/208</link>
		<comments>http://www.wumain.com/php/blog/archives/208#comments</comments>
		<pubDate>Mon, 24 May 2010 14:27:27 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[心情]]></category>
		<category><![CDATA[ASUS]]></category>
		<category><![CDATA[C4F]]></category>
		<category><![CDATA[Crosshaur IV Forumula]]></category>
		<category><![CDATA[ROG]]></category>

		<guid isPermaLink="false">http://www.wumain.com/php/blog/?p=208</guid>
		<description><![CDATA[<a href="http://www.wumain.com/php/blog/wp-content/uploads/2010/05/2010-05-24_21-30-55_85.jpg"><img class="aligncenter size-full wp-image-209" title="2010-05-24_21-30-55_85" src="http://www.wumain.com/php/blog/wp-content/uploads/2010/05/2010-05-24_21-30-55_85.jpg" alt="" width="575" height="616" /></a>

<a href="http://www.wumain.com/php/blog/wp-content/uploads/2010/05/2010-05-24_21-44-17_552.jpg"><img class="aligncenter size-full wp-image-210" title="2010-05-24_21-44-17_552" src="http://www.wumain.com/php/blog/wp-content/uploads/2010/05/2010-05-24_21-44-17_552.jpg" alt="" width="585" height="653" /></a>]]></description>
		<wfw:commentRss>http://www.wumain.com/php/blog/archives/208/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>超赞 Special Guest Animation Crew[Showcase]</title>
		<link>http://www.wumain.com/php/blog/archives/205</link>
		<comments>http://www.wumain.com/php/blog/archives/205#comments</comments>
		<pubDate>Fri, 30 Apr 2010 16:09:59 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[心情]]></category>
		<category><![CDATA[Showcase]]></category>
		<category><![CDATA[Special Guest Animation Crew]]></category>

		<guid isPermaLink="false">http://www.wumain.com/php/blog/?p=205</guid>
		<description><![CDATA[<embed src="http://player.youku.com/player.php/sid/XMTY3MjkwMjEy/v.swf" quality="high" width="480" height="400" align="middle" allowScriptAccess="sameDomain" type="application/x-shockwave-flash"></embed>]]></description>
		<wfw:commentRss>http://www.wumain.com/php/blog/archives/205/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>［东亚四强赛］于海郜林建功 中国3：0完胜韩国 打破32年A级赛不胜韩纪录</title>
		<link>http://www.wumain.com/php/blog/archives/201</link>
		<comments>http://www.wumain.com/php/blog/archives/201#comments</comments>
		<pubDate>Wed, 10 Feb 2010 14:20:23 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[心情]]></category>
		<category><![CDATA[32年]]></category>
		<category><![CDATA[国足]]></category>
		<category><![CDATA[恐韩]]></category>
		<category><![CDATA[韩国]]></category>

		<guid isPermaLink="false">http://www.wumain.com/php/blog/?p=201</guid>
		<description><![CDATA[<embed src="http://player.youku.com/player.php/sid/XMTUxNTE4NDMy/v.swf" quality="high" width="480" height="400" align="middle" allowScriptAccess="sameDomain" type="application/x-shockwave-flash"></embed>]]></description>
		<wfw:commentRss>http://www.wumain.com/php/blog/archives/201/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>短短48秒，说出了几亿人的心声</title>
		<link>http://www.wumain.com/php/blog/archives/196</link>
		<comments>http://www.wumain.com/php/blog/archives/196#comments</comments>
		<pubDate>Tue, 09 Feb 2010 04:59:04 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[心情]]></category>
		<category><![CDATA[心声]]></category>
		<category><![CDATA[房价]]></category>
		<category><![CDATA[房子]]></category>
		<category><![CDATA[许文彪]]></category>

		<guid isPermaLink="false">http://www.wumain.com/php/blog/?p=196</guid>
		<description><![CDATA[<object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="420" height="363" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="allowFullScreen" value="true" /><param name="allowscriptaccess" value="always" /><param name="wmode" value="opaque" /><param name="src" value="http://www.tudou.com/v/MuSgfo48-X8" /><param name="allowfullscreen" value="true" /><embed type="application/x-shockwave-flash" width="420" height="363" src="http://www.tudou.com/v/MuSgfo48-X8" allowfullscreen="true" allowscriptaccess="always" wmode="opaque"></embed></object>]]></description>
		<wfw:commentRss>http://www.wumain.com/php/blog/archives/196/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>jQuery 1.4正式发布：一起来看有哪些新变化（下篇）</title>
		<link>http://www.wumain.com/php/blog/archives/192</link>
		<comments>http://www.wumain.com/php/blog/archives/192#comments</comments>
		<pubDate>Sun, 07 Feb 2010 11:55:58 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[技术]]></category>
		<category><![CDATA[1.4]]></category>
		<category><![CDATA[jquery]]></category>
		<category><![CDATA[js]]></category>
		<category><![CDATA[发布]]></category>
		<category><![CDATA[变化]]></category>

		<guid isPermaLink="false">http://www.wumain.com/php/blog/?p=192</guid>
		<description><![CDATA[距<a href="http://css9.net/jquery-1-4-released-new-features-1/">jQuery 1.4系列上篇</a>发布已经有半个多月了（<a onclick="pageTracker._trackPageview('/outbound/article/jquery14.com');" href="http://jquery14.com/day-12/jquery-141-released">jQuery 1.4.1</a>已经发布），由于年底比较忙，下篇的书写一直拖沓至今，实在是对不住各位读者。在上篇中总体介绍了jQuery 1.4版本的相关使用及更新，本打算下篇中构造一些代码实例，既要实用又要把函数特点体现出来，后来写起来才发现蛮难的。加之jQuery 1.4发布了有一段时间了，不少人已经写了这方面的文章，我准备把这一篇作为jQuery 1.4的资源汇总篇。

<strong>【官方资源】</strong>
<ul>
	<li>jQuery官方网站：<a onclick="pageTracker._trackPageview('/outbound/article/jquery.com');" href="http://jquery.com/">http://jquery.com/</a></li>
	<li>jQuery官方为全面介绍jQuery 1.4建立的网站，希望人们能用14天来了解它：<a onclick="pageTracker._trackPageview('/outbound/article/jquery14.com');" href="http://jquery14.com/">http://jquery14.com/</a></li>
	<li>jQuery 1.4 官方API文档（包括1.4版本中新添加的和更改的函数）：<a onclick="pageTracker._trackPageview('/outbound/article/api.jquery.com');" href="http://api.jquery.com/category/version/1.4/">http://api.jquery.com/category/version/1.4/</a></li>
</ul>
<strong>【相关文档及手册】</strong>
<ul>
	<li>jQuery 1.4 API Cheat Sheet（在线版、pdf版、png版）：<a onclick="pageTracker._trackPageview('/outbound/article/futurecolors.ru');" href="http://futurecolors.ru/jquery/">http://futurecolors.ru/jquery/</a></li>
	<li>jQuery 1.4中文API文档（chm版）：<a onclick="pageTracker._trackPageview('/outbound/article/www.cnblogs.com');" href="http://www.cnblogs.com/kuku-1/archive/2010/01/22/1654318.html">http://www.cnblogs.com/kuku-1/archive/2010/01/22/1654318.html</a></li>
	<li><a onclick="pageTracker._trackPageview('/outbound/article/www.mrspeaker.net');" href="http://www.mrspeaker.net/dev/jq/ref/#home">jquery 1.4手持设备版手册</a>（如在IPhone上看）</li>
</ul>
<strong>【相关教程】</strong>
<ul>
	<li><a onclick="pageTracker._trackPageview('/outbound/article/net.tutsplus.com');" href="http://net.tutsplus.com/tutorials/javascript-ajax/jquery-1-4-released-the-15-new-features-you-must-know/">jQuery 1.4 Released: The 15 New Features you Must Know</a>
中文译文：<a onclick="pageTracker._trackPageview('/outbound/article/ktmud.com');" href="http://ktmud.com/javascript/jquery-1-4-new-features/">jQuery 1.4 发布：15个新特性实例精讲 </a></li>
	<li><a onclick="pageTracker._trackPageview('/outbound/article/www.uxd2.com');" href="http://www.uxd2.com/">coolnalu</a>翻译的<a onclick="pageTracker._trackPageview('/outbound/article/www.uxd2.com');" href="http://www.uxd2.com/2010/01/%E7%BF%BB%E8%AF%91-jquery1-4%E5%AE%98%E6%96%B9%E6%96%87%E6%A1%A3/">jQuery 1.4官方文档中文版</a></li>
	<li><a onclick="pageTracker._trackPageview('/outbound/article/james.padolsey.com');" href="http://james.padolsey.com/jquery/">jQuery源码在线查看（可按方法搜索）</a>（英文）</li>
	<li><a onclick="pageTracker._trackPageview('/outbound/article/codylindley.com');" href="http://codylindley.com/jqueryselectors/">jQuery 1.4 选择器在线测试</a>（英文）</li>
	<li><a href="http://css9.net/jquery-1-4-released-new-features-2/Understanding%20jQuery%201.4's%20$.proxy()%20method">理解jQuery 1.4中的$.proxy()函数</a>（英文）</li>
	<li><a onclick="pageTracker._trackPageview('/outbound/article/benalman.com');" href="http://benalman.com/news/2009/12/jquery-14-param-demystified/">深入浅出地解释jQuery 1.4中的$.param()函数</a>（英文）</li>
	<li><a onclick="pageTracker._trackPageview('/outbound/article/james.padolsey.com');" href="http://james.padolsey.com/javascript/easing-in-jquery-1-4a2/">理解jQuery 1.4中的easing函数</a>（英文）</li>
	<li><a onclick="pageTracker._trackPageview('/outbound/article/ejohn.org');" href="http://ejohn.org/blog/closestarray-in-jquery-14/">理解jQuery 1.4中的.closest(Array)函数</a>（英文）</li>
	<li><a onclick="pageTracker._trackPageview('/outbound/article/www.mrspeaker.net');" href="http://www.mrspeaker.net/2009/12/05/index-in-jquery/">在jQuery 1.4中index()函数更酷了</a>（英文）</li>
	<li><a onclick="pageTracker._trackPageview('/outbound/article/www.learningjquery.com');" href="http://www.learningjquery.com/2009/09/working-with-events-part-3-more-event-delegation-with-jquery">jQuery中的事件委托</a>（英文）</li>
	<li><a onclick="pageTracker._trackPageview('/outbound/article/www.bennadel.com');" href="http://www.bennadel.com/blog/1805-jQuery-Events-MouseOver-MouseOut-vs-MouseEnter-MouseLeave.htm">jQuery事件：MouseOver / MouseOut vs. MouseEnter / MouseLeave</a>（英文）</li>
</ul>
原文地址 <a href="http://css9.net/jquery-1-4-released-new-features-2/">http://css9.net/jquery-1-4-released-new-features-2/</a>]]></description>
		<wfw:commentRss>http://www.wumain.com/php/blog/archives/192/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>jQuery 1.4正式发布：一起来看有哪些新变化（上篇）</title>
		<link>http://www.wumain.com/php/blog/archives/185</link>
		<comments>http://www.wumain.com/php/blog/archives/185#comments</comments>
		<pubDate>Sun, 07 Feb 2010 11:35:53 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[技术]]></category>
		<category><![CDATA[jquery]]></category>
		<category><![CDATA[js]]></category>

		<guid isPermaLink="false">http://www.wumain.com/php/blog/?p=185</guid>
		<description><![CDATA[为庆祝jQuery的四周年生日，<a onclick="pageTracker._trackPageview('/outbound/article/jquery.com');" href="http://jquery.com/">jQuery</a>官方团队<a onclick="pageTracker._trackPageview('/outbound/article/jquery14.com');" href="http://jquery14.com/day-01/jquery-14">正式发布</a>了jQuery的1.4版本。在这个版本中，jQuery官方团队做了大量的编码、测试和文档工作，相对之前版本自然改进不少，让我们一起来看看有那些新变化吧。

本文分上下两篇，上篇主要总体介绍jQuery 1.4版本的相关使用及更新，下篇通过一些代码示例来展示更新的方法及新添加的方法。

<strong>【下载及调用】</strong>

像以往一样，官方提供了jQuery的两份拷贝，一份是压缩版本（使用<a onclick="pageTracker._trackPageview('/outbound/article/code.google.com');" href="http://code.google.com/closure/compiler/">Google Closure Compiler</a>压缩，之前使用的是YUI），另一份是未压缩版本（用来调试和阅读）。
<ul>
	<li><a onclick="pageTracker._trackPageview('/outbound/article/code.jquery.com');" href="http://code.jquery.com/jquery-1.4.min.js">jQuery压缩版本</a>（23kb，gzip压缩后）</li>
	<li><a onclick="pageTracker._trackPageview('/outbound/article/code.jquery.com');" href="http://code.jquery.com/jquery-1.4.js">jQuery未压缩版本</a>（154kb）</li>
</ul>
<a onclick="pageTracker._trackPageview('/outbound/article/css.net');" href="http://css.net/">本博</a>之前曾提议过<a href="http://css9.net/use-google-host-jquery/">通过google服务器加载jQuery，提高加载速度</a>。现在，我们依然可以通过Google的服务器调用压缩后的jQuery 1.4版本文件，如下：
<div>
<div>
<blockquote><strong> </strong>

<strong>【新特性及变化】</strong>

在jQuery 1.4中，许多常用的jQuery方法被重写，这些改进不仅更易用，也带来了性能的显著提升。</blockquote>
<pre>&#60;script src="http://ajax.googleapis.com/ajax/libs/jquery/1.4/jquery.min.js"&#62;&#60;/script&#62;</pre>
</div>
</div>
注：以下为概述，不详之处参见下篇的代码解释。
<ol>
	<li><strong>为一些方法添加设置函数（Setter Functions）</strong>在之前版本中，我们可以给attr()方法传入一个函数，将函数的返回值赋予某个属性。1.4中，这个功能被添加到了更多的方法中：.css()、 .attr()、 .val()、 .html()、 .text()、 .append()、.prepend()、 .before()、 .after()、.replaceWith(), .wrap()、 .wrapInner()、 .offset()、 .addClass()、 .removeClass()、 .toggleClass()。此外，在下面方法中，还可以传入当前值作为设置函数的第二个参数，供设置函数使用：.css()、.attr()、.val()、.html()、.text()、.append()、.prepend()、.offset()、.addClass()、.removeClass()、和 .toggleClass()。例如：
<div>
<div>
<blockquote>
<pre>jQuery('&#60;img src="enter.png" alt="enter your name" /&#62;')
.attr("alt", function(index, value) {
    return "Please, " + value;
});</pre>
</blockquote>
</div>
</div></li>
	<li><strong>更新了jQuery中序列化的核心方法<a onclick="pageTracker._trackPageview('/outbound/article/api.jquery.com');" href="http://api.jquery.com/jQuery.param/">jQuery.param()</a></strong>之前对于{foo: ["bar", "baz"]}序列化后的结果是“foo=bar&#38;foo=baz”，现在为“foo[]=bar&#38;foo[]=baz”。
这样更改的目的主要是告诉接收端，传入的是一个数组对象。</li>
	<li><strong>在<a onclick="pageTracker._trackPageview('/outbound/article/api.jquery.com');" href="http://api.jquery.com/jQuery.ajax/">jQuery.ajax</a></strong>中可在不指定dataType属性时，会根据response的content-type自动识别。
例如：ajax请求返回的对象是json类型（application/json），则dataType会自动指定为”json”（不指定的情况下）。</li>
	<li><strong>在<a onclick="pageTracker._trackPageview('/outbound/article/api.jquery.com');" href="http://api.jquery.com/jQuery.ajax/">jQuery.ajax</a>请求中，添加对Etag的支持。</strong>之前jQuery在ajax请求中是在header中不发送If-None-Match值的（也就是不支持Etag），也就默认忽略了浏览器缓存。现在可以通过指定ifModified属性开启它。提示：如果您不了解http header的相关知识，推荐阅读<a title="了解http header" href="http://css9.net/all-about-http-headers/">这篇文章</a>。</li>
	<li><strong>使用原生的JSON.parse，对json进行严格解析</strong>在1.3及更早版本中，jQuery通过javascript的eval方法来解析json对象。在1.4中，如果你用的浏览器支持，则会使用原生的JSON.parse进行json对象解析，这样对json对象的书写验证则更为严格。如：{foo: “bar”}的写法将不会被验证为合法的json对象，必须写成{”foo”: “bar”}。如果你的程序打算升级到1.4版本，那么这一点要尤其注意了。</li>
	<li><strong>在使用<a onclick="pageTracker._trackPageview('/outbound/article/api.jquery.com');" href="http://api.jquery.com/serialize">.serialize()</a> 序列化时，添加对HTML5元素的支持</strong></li>
	<li><strong>为ajax请求添加上下文支持，参考<a onclick="pageTracker._trackPageview('/outbound/article/api.jquery.com');" href="http://api.jquery.com/jQuery.ajax/">jQuery.ajax()</a></strong>
<div>
<div>
<blockquote>
<pre>jQuery.ajax({
    url: "test.html",
    context: document.body,
    success: function(){
        jQuery(this).addClass("done");
    }
});</pre>
</blockquote>
</div>
</div></li>
	<li><strong>在<a onclick="pageTracker._trackPageview('/outbound/article/api.jquery.com');" href="http://api.jquery.com/jQuery.ajax/">jQuery.ajax()</a>请求时，接收XMLHttpRequest对象作为success的第三个参数</strong></li>
	<li><strong>在ajax请求时，总是设定Content-Type属性</strong>在1.3版本中，如果ajax发送的数据为空时，则不发送Content-Type属性值，1.4中则总是显式设定Content-Type值。这是因为有些程序后端通过Content-Type值判断如何响应。</li>
	<li><strong>当用jsonp方式进行ajax请求时，可以显式指定callback的名称</strong>之前jsonp的callback名称是由jQuery生成的随机名称，现在可以通过jsonpCallback参数显式指定</li>
	<li><strong>部分CSS相关方法被重写。其中，.css()方法效率有两倍的提升， .addClass()、.removeClass()和.hasClass()效率有三倍的提升。.toggleClass() 方法可以一次切换多个class</strong>
<div>
<div>
<blockquote>
<pre>$("div").toggleClass("current active");</pre>
</blockquote>
</div>
</div></li>
	<li><strong>在jQuery 1.4中，许多dom操作相关方法在性能上大幅提升</strong>其中.append()、 .prepend()、.before()、和 .after() 的性能被改善，
.html() 的性能提升了近3倍。
.remove() 和 .empty()的性能提升了近4倍。</li>
	<li><strong>jQuery(”tag”)效率有所提升</strong>当传入一个tag名称进行寻找时，搜索算法有所改进 。</li>
	<li>使用id开始的选择器获取元素的速度进一步提升类似于jQuery(’#id p’)这样以id开始的选择器获取元素的速度有所优化，速度是最快的。</li>
	<li><strong>jQuery()（或$()）将返回jQuery空对象</strong>在之前当调用jQuery()时，默认返回的是document的jQuery对象，也就是等价于jQuery(’document’)。在1.4版本中将不再做这样的转换，直接返回jQuery空对象。在1.4中，之前jQuery().ready()的写法不建议使用（虽然仍然可以用），应当写作jQuery(document).ready()或jQuery(function(){})</li>
	<li><strong>添加了新事件.focusin()和.focusout()</strong>.focusin()和.focusout()方法等价于focus()和blur()方法，不同的是支持事件冒泡。需要注意的是focus()和blur()事件依然不可以通过live()方法绑定。</li>
	<li><strong>几乎所有事件都支持live()绑定</strong>除了ready、focus（用focusin替代）、blur（用focusout替代）事件外的所有事件都支持live绑定</li>
	<li><strong>jQuery 1.4对内部结构重新组织，并开始建立代码风格规范</strong>之前的core.js被划分为attribute.js, css.js, data.js, manipulation.js, traversing.js和queue.js。ready事件被移至core.js中。jQuery 1.4开始建立了<a onclick="pageTracker._trackPageview('/outbound/article/docs.jquery.com');" href="http://docs.jquery.com/JQuery_Core_Style_Guidelines">代码风格规范</a>，大多数核心代码符合这一规范。虽然这个规范仅有几条，但我相信这是一个良好的开端。</li>
</ol>
<strong>【相关测试】</strong>

在jQuery 1.4中解决了<a onclick="pageTracker._trackPageview('/outbound/article/dev.jquery.com');" href="http://dev.jquery.com/report/34">207个bug</a>（相比之下，1.3解决了97个bug）。

此外，测试用例从1.3.2的1504个增加了1.4版本的3060个。这些测试100%通过当下主流浏览器（Safari 3.2, Safari 4, Firefox 2, Firefox 3, Firefox 3.5, IE 6, IE 7, IE 8, Opera 10.10, 和 Chrome）。

<strong>【版本兼容性处理】</strong>

从上面还是可以看出1.4是做了相当多的更新，为了保证当前版本的向后兼容（也就是希望你之前使用jQuery 1.3版本的程序平稳过渡到1.4版本上），官方特意提供了兼容性脚本补丁，如下使用：
<div>
<div>
<blockquote>
<pre>     &#60;script src="http://code.jquery.com/jquery.js"&#62;&#60;/script&#62;
     &#60;script src="http://code.jquery.com/jquery.compat-1.3.js"&#62;&#60;/script&#62;</pre>
</blockquote>
</div>
</div>
注：以上内容以<a onclick="pageTracker._trackPageview('/outbound/article/jquery14.com');" href="http://jquery14.com/day-01/jquery-14">jQuery官方文档</a>为依据撰写而成，更加详细内容可直接访问官方说明页面。

本文地址：<a href="http://css9.net/jquery-1-4-released-new-features-1/jquery-1-4-released-new-features-1">jQuery 1.4正式发布：一起来看有哪些新变化（上篇）</a>]]></description>
		<wfw:commentRss>http://www.wumain.com/php/blog/archives/185/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>[转]和我一批去年毕业的的同学基本都辞职了</title>
		<link>http://www.wumain.com/php/blog/archives/180</link>
		<comments>http://www.wumain.com/php/blog/archives/180#comments</comments>
		<pubDate>Sun, 24 Jan 2010 10:21:43 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[心情]]></category>
		<category><![CDATA[毕业]]></category>
		<category><![CDATA[职场]]></category>
		<category><![CDATA[辞职]]></category>

		<guid isPermaLink="false">http://www.wumain.com/php/blog/?p=180</guid>
		<description><![CDATA[当时公司招了大批应届本科和研究生毕业的新新人类。平均年龄25岁。那个新的助理，是经过多次面试后，我亲自招回来的一个女孩。名牌大学本科毕业，聪明，性格活泼。私下里我得承认，我招她的一个很重要的原因，除了她在大学里优秀的表现之外，还因为她写了一手漂亮的字。女孩能写一手好字的不多，尤其像她，看起来长发飘飘，多么女性化的一个姑娘，一手字却写的铿锵倜傥，让我对她不由多了很多好感。 ­　　 ­
　　手把手的教。从工作流程到待人接物。她也学的快。很多工作一教就上手。一上手就熟练。跟各位同事也相处的颇融洽。我开始慢慢的给她一些协调的工作，各部门之间以及各分公司之间的业务联系和沟通让她尝试着去处理。 ­
　　 ­
　　开始经常出错。她很紧张，来找我谈。我告诉她：错了没关系，你且放心按照你的想法去做。遇到问题了，来问我，我会告诉你该怎么办。仍然错。又来找我，这次谈的比较深入，她的困惑是，为什么总是让她做这些琐碎的事情？我当时问她：什么叫做不琐碎的工作呢？ ­
　　她答不上来，想了半天，跟我说：我总觉得，我的能力不仅仅能做这些，我还能做一些更加重要的事情。那次谈话，进行了1小时。我知道，我说的话，她没听进去多少。后来我说，先把手头的工作做好，先避免常识性错误的发生。然后循序渐进罢。 ­
　　 ­
　　半年以后，她来找我，第一次提出辞职。我推掉了约会，跟她谈辞职的问题。问起辞职的原因，她跟我直言：本科四年，功课优秀，没想到毕业后找到了工作，却每天处理的都是些琐碎的事情。没有成就感。我又问她：你觉得，在你现在所有的工作中，最没有意义的最浪费你的时间精力的工作，是什么？她马上答我：帮您贴发票，然后报销，然后到财务去走流程，然后把现金拿回来给您。 ­
　　 ­
　　我笑着问她：你帮我贴发票报销有半年了吧？通过这件事儿，你总结出了一些什么信息？ ­
　　 ­
　　她呆了半天，答我：贴发票就是贴发票，只要财务上不出错，不就行了呗，能有什么信息？ ­
　　 ­
　　我说，我来跟你讲讲，当年我的做法吧：９８年的时候，我从财务被调到了总经理办公室，担任总经理助理的工作。其中有一项工作，就是跟你现在做的一样，帮总经理报销他所有的票据。本来这个工作就像你你刚才说的，把票据贴好，然后完成财务上的流程，就可以了。 ­
　　其实票据是一种数据记录，它记录了和总经理乃至整个公司营运有关的费用情况。看起来没有意义的一堆数据，其实它们涉及到了公司各方面的经营和运作。于是我建立了一个表格，将所有总经理在我这里报销的数据按照时间，数额，消费场所，联系人，电话等等记录下来。 ­
　　我起初建立这个表格的目的很简单，我是想在财务上有据可循，同时万一我的上司有情况来询问我的时候，我会有准确的数据告诉他。通过这样的一份数据统计，渐渐的我发现了一些上级在商务活动中的规律，比如，哪一类的商务活动，经常在什么样的场合，费用预算大概是多少；总经理的公共关系常规和非常规的处理方式。等等等等。 ­
　　当我的上级发现，他布置工作给我的时候，我会处理的很妥贴。有一些信息是他根本没有告诉我的，我也能及时准确的处理。他问我为什么，我告诉了他我的工作方法和信息来源。 ­
　　　　渐渐的，他基于这种良性积累，越来越多的交待更加重要的工作。再渐渐的，一种信任和默契就此产生，我升职的时候，他说我是他用过的最好用的助理。 ­
　　 ­
　　说完这些长篇大论，我看着这个姑娘，她愣愣的看着我。我跟她直言：我觉得你最大的问题，是你没有用心。在看似简单不动脑子就能完成的工作里，你没有把你的心沉下去，所以，半年了，你觉得自己没有进步。她不出声。但是收回了辞职报告。 ­
　　 ­
　　又坚持了３个月，她还是辞职了。这次我没有留她。让她走了。 ­
　　后来她经常在ＭＳＮ上跟我聊天。告诉我她的新工作的情况。一年内，她换了三份工作。每一次都坚持不了多久。每一次她都说新的工作不是她想要的工作。０５年的时候，她又一次辞职了。很苦恼，跑来找我，要跟我吃饭。我请她去写字楼后面的商场吃日本料理。吃到中途，忽然跟我说：我有些明白你以前说的话是什么意思了。 ­
　　 ­
　　所谓的职业生涯，其实你很难预测到你将来真正要从事什么工作，将来所要从事的工作，是否跟你在大学里学的专业有关。大多数人，很有可能将来所作的工作，跟他当初所学的专业一点关系都没有。从22岁大学毕业在26岁之间这四年，重要的不是你做了什么，重要的是你在工作中养成了怎么样的良好的工作习惯。这个良好的工作习惯，指的是：认真，踏实的工作作风，以及是否学会了如何用最快的时间接受新的事物，发现新事物的内在规律，比别人更短时间内掌握这些规律并且处理好它们。具备了以上的要素，你就成长为一个被人信任的工作的人。 ­
　　 ­
　　人都有惰性，也都愿意用那些用起来顺手的人。当你具备了被人信任的基础，并且在日常的工作中逐渐表现出你的踏实，聪明，和细致的时候，越来越多的工作机会就会提供到你面前。原因很简单，用一句话就能交代清楚并且能被你顺利完成的工作，谁愿意说三句话甚至半小时交待一个怎么都不明白的人呢？沟通也是一种成本，沟通的时间越少，内耗越少，这是作为管理者最清楚的一件事。 ­
　　 ­
　　当你有比别人更多的工作机会去接触那些你没有接触过的工作的时候，你就有了比别人多的学习机会，人人都喜欢聪明勤奋的学生，作为管理者，大概更是如此。 ­
　　 ­
　　一个新手，大多数新手，在这四年里，是看不出太大的差距的。但是这四年的经历，为以后的职业生涯的发展奠定的基础，是至关重要的。很多人不在乎年轻时走弯路，很多人觉得日常的工作人人都能做好没什么了不起。然而就是这些简单的工作，循序渐进的、隐约的，成为今后发展的分水岭。 ­
　　 ­
　　漫不经心的对待基层工作的最大的损失，就是将看似简单的事物性处理方式，分界成为长远发展的能力问题。 ­
　　 ­
　　聪明的人，总是不认为自己的能力有问题。时间长了，他会抱怨自己运气不好，抱怨那些看起来资质普通的人，总能比自己更能走狗屎运。抱怨她容貌比自己好，或者他更会讨领导欢心。等等等等。慢慢的，影响心态。所谓的怀才不遇，有时是这种情况。 ­
　　 ­
　　工作需要一个聪明人，工作其实更需要一个踏实的人。在聪明和踏实之间，我更愿意选择后者。 ­
　　 ­
　　而踏实，是人人都能做到的。和先天条件没有太大关系。 ­
   这是无意间在同学空间看到的一篇文章，觉得说的很好。就COPY 了过来。描述的都是现代社会新人对工作的态度，或者心理。包括我自己在内，看着看着孔乙己的感觉就出来了。如果想向前迈进，不要觉得是大才小用了自己，也不要去计较，更不要去嫉妒。请放下心里的疙瘩，用心的做吧！！]]></description>
		<wfw:commentRss>http://www.wumain.com/php/blog/archives/180/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>10个精彩的智力问题</title>
		<link>http://www.wumain.com/php/blog/archives/177</link>
		<comments>http://www.wumain.com/php/blog/archives/177#comments</comments>
		<pubDate>Fri, 01 Jan 2010 17:18:11 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[心情]]></category>
		<category><![CDATA[智力]]></category>

		<guid isPermaLink="false">http://www.wumain.com/php/blog/?p=177</guid>
		<description><![CDATA[1. 给一个瞎子52张扑克牌，并告诉他里面恰好有10张牌是正面朝上的。要求这个瞎子把牌分成两堆，使得每堆牌里正面朝上的牌的张数一样多。瞎子应该怎么做？
答案：把扑克牌分成两堆，一堆10张，一堆42张。然后，把小的那一堆里的所有牌全部翻过来。

2. 如何用一枚硬币等概率地产生一个1到3之间的随机整数？如果这枚硬币是不公正的呢？
答案：如果是公正的硬币，则投掷两次，“正反”为1，“反正”为2，“正正”为3，“反反”重来。
如果是不公正的硬币，注意到出现“正反”和“反正”的概率一样，因此令“正反反正”、“反正正反”、“正反正反”分别为1、2、3，其余情况重来。另一种更妙的办法是，投掷三次硬币，“正反反”为1，“反正反”为2，“反反正”为3，其余情况重来。

3. 30枚面值不全相同的硬币摆成一排，甲、乙两个人轮流选择这排硬币的其中一端，并取走最外边的那枚硬币。如果你先取硬币，能保证得到的钱不会比对手少吗？
答案：先取者可以让自己总是取奇数位置上的硬币或者总是取偶数位置上的硬币。数一数是奇数位置上的面值总和多还是偶数位置上的面值总和多，然后总是取这些位置上的硬币就可以了。
4. 一个环形轨道上有n个加油站，所有加油站的油量总和正好够车跑一圈。证明，总能找到其中一个加油站，使得初始时油箱为空的汽车从这里出发，能够顺利环行一圈回到起点。
答案：总存在一个加油站，仅用它的油就足够跑到下一个加油站（否则所有加油站的油量加起来将不够全程）。把下一个加油站的所有油都提前搬到这个加油站来，并把油已被搬走的加油站无视掉。在剩下的加油站中继续寻找油量足以到达下个加油站的地方，不断合并加油站，直到只剩一个加油站为止。显然从这里出发就能顺利跑完全程。
另一种证明方法：先让汽车油箱里装好足够多的油，随便从哪个加油站出发试跑一圈。车每到一个加油站时，记录此时油箱里剩下的油量，然后把那个加油站的油全部装上。试跑完一圈后，检查刚才路上到哪个加油站时剩的油量最少，那么空着油箱从那里出发显然一定能跑完全程。

5. 初始时，两个口袋里各有一个球。把后面的n-2个球依次放入口袋，放进哪个口袋其概率与各口袋已有的球数成正比。这样下来，球数较少的那个口袋平均期望有多少个球？
答案：先考虑一个看似无关的问题——怎样产生一个1到n的随机排列。首先，在纸上写下数字1；然后，把2写在1的左边或者右边；然后，把3写在最左边，最右边，或者插进1和2之间……总之，把数字i等概率地放进由前面i-1个数产生的（包括最左端和最右端在内的）共i个空位中的一个。这样生成的显然是一个完全随机的排列。
我们换一个角度来看题目描述的过程：假想用一根绳子把两个球拴在一起，把这根绳子标号为1。接下来，把其中一个小球分裂成两个小球，这两个小球用标号为2的绳子相连。总之，把“放进第i个球”的操作想象成把其中一个球分裂成两个用标有i-1的绳子相连的小球。联想我们前面的讨论，这些绳子的标号事实上是一个随机的全排列，也就是说最开始绳子1的位置最后等可能地出现在每个地方。也就是说，它两边的小球个数(1,n-1)、(2,n-2)、(3,n-3)、……、(n-1,1)这n-1种情况等可能地发生。因此，小袋子里的球数大约为n/4个。准确地说，当n为奇数时，小袋子里的球数为(n+1)/4；当n为偶数时，小袋子里的球数为n^2/(4n-4)。

6. 考虑一个n*n的棋盘，把有公共边的两个格子叫做相邻的格子。初始时，有些格子里有病毒。每一秒钟后，只要一个格子至少有两个相邻格子染上了病毒，那么他自己也会被感染。为了让所有的格子都被感染，初始时最少需要有几个带病毒的格子？给出一种方案并证明最优性。
答案：至少要n个，比如一条对角线上的n个格子。n个格子也是必需的。当一个新的格子被感染后，全体被感染的格子所组成的图形的周长将减少0个、2个或4个单位（具体减少了多少要看它周围被感染的格子有多少个）。又因为当所有格子都被感染后，图形的周长为4n，因此初始时至少要有n个被感染的格子。

7. 在一个m*n的棋盘上，有k个格子里放有棋子。是否总能对所有棋子进行红蓝二染色，使得每行每列的红色棋子和蓝色棋子最多差一个？
答案：可以。建一个二分图G(X,Y)，其中X有m个顶点代表了棋盘的m个行，Y有n个顶点代表了棋盘的n个列。第i行第j列有棋子就在X(i)和Y(j)之间连一条边。先找出图G里的所有环（由于是二分图，环的长度一定是偶数），把环里的边红蓝交替染色。剩下的没染色的图一定是一些树。对每棵树递归地进行操作：去掉一个叶子节点和对应边，把剩下的树进行合法的红蓝二染色，再把刚才去掉的顶点和边加回去，给这个边适当的颜色以满足要求。

8. 任意给一个8*8的01矩阵，你每次只能选一个3*3或者4*4的子矩阵并把里面的元素全部取反。是否总有办法把矩阵里的所有数全部变为1？
答案：不能。大矩阵中有36个3*3的小矩阵和25个4*4的小矩阵，因此总共有61种可能的操作。显然，给定一个操作序列，这些操作的先后顺序是无关紧要的；另外，在一个操作序列中使用两种或两种以上相同的操作也是无用的。因此，实质不同的操作序列只有2^61种。但8*8的01矩阵一共有2^64种，因此不是每种情况都有办法达到目的。

9. 五个洞排成一排，其中一个洞里藏有一只狐狸。每个夜晚，狐狸都会跳到一个相邻的洞里；每个白天，你都只允许检查其中一个洞。怎样才能保证狐狸最终会被抓住？
答案：按照2, 3, 4, 2, 3, 4的顺序检查狐狸洞可以保证抓住狐狸。为了说明这个方案是可行的，用集合F表示狐狸可能出现的位置，初始时F = {1, 2, 3, 4, 5}。如果它不在2号洞，则第二天狐狸已经跑到了F = {2, 3, 4, 5}。如果此时它不在3号洞，则第三天狐狸一定跑到了F = {1, 3, 4, 5}。如果此时它不在4号洞，则再过一晚后F = {2, 4}。如果此时它不在2号洞，则再过一天F = {3, 5}。如果此时它不在3号洞，再过一天它就一定跑到4号洞了。
方案不是唯一的，下面这些方案都是可行的：
2, 3, 4, 4, 3, 2
4, 3, 2, 2, 3, 4
4, 3, 2, 4, 3, 2

10. 一个经典老题是说，把一个3*3*3的立方体切成27个单位立方体，若每一刀切完后都允许重新摆放各个小块的位置，最少可以用几刀？答案仍然是6刀，因为正中间那个单位立方体的6个面都是后来才切出来的，因此怎么也需要6刀。考虑这个问题：若把一个n*n*n的立方体切成一个个单位立方体，最少需要几刀？
答案：事实上，从一个更强的命题出发反而能使问题变得更简单。对于一个a*b*c的长方体，我们需要f(a)+f(b)+f(c)刀，其中f(x)=⌈log(x)/log(2)⌉。只需要注意到，在整个过程中的任何一步，切完当前最大的块所需要的刀数也就等于整个过程还需要的刀数，因为其它小块需要的刀数都不会超过最大块所需刀数，它们都可以与最大块一道并行处理。这表明，我们的最优决策即是让当前的最大块尽可能的小，也就是说要把当前的最大块尽可能相等地切成两半。利用数学归纳法，我们可以很快得到本段开头的结论。

 
如果你还没过瘾的话，很早以前我还整理过一些智力题合集，感兴趣的话请移步这里：
<a href="http://www.matrix67.com/blog/archives/501">http://www.matrix67.com/blog/archives/501</a>
<a href="http://www.matrix67.com/blog/archives/502">http://www.matrix67.com/blog/archives/502</a>]]></description>
		<wfw:commentRss>http://www.wumain.com/php/blog/archives/177/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>无聊一下，入了部单车，不知道会热情多久</title>
		<link>http://www.wumain.com/php/blog/archives/172</link>
		<comments>http://www.wumain.com/php/blog/archives/172#comments</comments>
		<pubDate>Sun, 20 Dec 2009 14:31:27 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[心情]]></category>
		<category><![CDATA[Shimano]]></category>
		<category><![CDATA[单车]]></category>
		<category><![CDATA[无聊]]></category>
		<category><![CDATA[起点]]></category>

		<guid isPermaLink="false">http://www.wumain.com/php/blog/?p=172</guid>
		<description><![CDATA[SPINNER GRINDOS1山地前叉
VP普通外置碗组
TRUVATIV 铝合金普通把立
TNT 各色把套
ASIA（亚州机械） 普通直把
ASIA（亚州机械） 普通座杆
BIKEHOME标座杆夹
AVID-FR5刹把
SHIAMANO DEORE M530/511分体指拨
SHIMANO-DEORE-M510前拨
SHIAMNO DEORE M592后拨
SHIMANO M432山地V刹车
SHIMANO ALIVIO M411山地牙盘
QH 113mm中轴
SHIMANO SLX HG80-9飞轮
KMC DX/9S链条
TURNER ATB220 V刹 32H山地圈
255/257/267/258MM等胜利银色辐条
久钰-D751SB/D802SB两陪林V刹花鼓

拍照技术一如既往的差 --

<a href="http://www.wumain.com/php/blog/wp-content/uploads/2009/12/1.jpg"><img src="http://www.wumain.com/php/blog/wp-content/uploads/2009/12/1-300x225.jpg" alt="" title="1" width="300" height="225" class="aligncenter size-medium wp-image-378" /></a><a href="http://www.wumain.com/php/blog/wp-content/uploads/2009/12/2.jpg"><img src="http://www.wumain.com/php/blog/wp-content/uploads/2009/12/2-300x225.jpg" alt="" title="2" width="300" height="225" class="aligncenter size-medium wp-image-379" /></a><a href="http://www.wumain.com/php/blog/wp-content/uploads/2009/12/3.jpg"><img src="http://www.wumain.com/php/blog/wp-content/uploads/2009/12/3-300x225.jpg" alt="" title="3" width="300" height="225" class="aligncenter size-medium wp-image-380" /></a><a href="http://www.wumain.com/php/blog/wp-content/uploads/2009/12/4.jpg"><img src="http://www.wumain.com/php/blog/wp-content/uploads/2009/12/4-300x225.jpg" alt="" title="4" width="300" height="225" class="aligncenter size-medium wp-image-381" /></a><a href="http://www.wumain.com/php/blog/wp-content/uploads/2009/12/5.jpg"><img src="http://www.wumain.com/php/blog/wp-content/uploads/2009/12/5-300x225.jpg" alt="" title="5" width="300" height="225" class="aligncenter size-medium wp-image-377" /></a>]]></description>
		<wfw:commentRss>http://www.wumain.com/php/blog/archives/172/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>郭台銘說__員工一定要看，會心一笑 ~~</title>
		<link>http://www.wumain.com/php/blog/archives/168</link>
		<comments>http://www.wumain.com/php/blog/archives/168#comments</comments>
		<pubDate>Fri, 18 Dec 2009 04:40:59 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[心情]]></category>
		<category><![CDATA[员工]]></category>
		<category><![CDATA[郭台銘]]></category>
		<category><![CDATA[面试]]></category>

		<guid isPermaLink="false">http://www.wumain.com/php/blog/?p=168</guid>
		<description><![CDATA[一家公司的大老板死后被送上天堂，看门的天使却查不到他的纪录，因为之前很少有 大老板会上天堂的， 于是天使要他自己选择要到天堂，还是去地狱，并且可以让他先到两个地方都度过二十四小时之后再做决定。 

一开始，大老板先被送到地狱去，他一进门发现是一个狂欢派对，所有他以前的同事跟朋友都在里面，大家疯狂庆祝，享受美食、名酒、俊男与美女。 

二十四小时之后大家跟他道别，并希望很快再见到他。  

紧接着他被送到天堂去，那边有安宁的环境跟无尽的美景，同样舒舒服服地过了二十四小时。  

抉择的时间到了，大老板对天使说：「天堂固然很好，但是地狱看起来比较吸引我」  
于是他被送往地狱。 

然而，才一进地狱的门，眼前的景物却让他大吃一惊。 
他的眼前竟然是一片荒原，所有他的朋友不是在上刀山，就是下油锅。 

他惊恐地问地狱的守门人：「怎么会这样？上一次我来的时候不是这样的啊？」 
地狱的守门人讲了一句关键的话：
 
 

「上一次，你是来面试的，现在你已经是员工了。」]]></description>
		<wfw:commentRss>http://www.wumain.com/php/blog/archives/168/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>上海话 Nobody</title>
		<link>http://www.wumain.com/php/blog/archives/165</link>
		<comments>http://www.wumain.com/php/blog/archives/165#comments</comments>
		<pubDate>Fri, 04 Dec 2009 12:28:18 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[心情]]></category>
		<category><![CDATA[Nobody]]></category>
		<category><![CDATA[上海话]]></category>

		<guid isPermaLink="false">http://www.wumain.com/php/blog/?p=165</guid>
		<description><![CDATA[<p><object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="420" height="363" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="allowFullScreen" value="true" /><param name="allowscriptaccess" value="always" /><param name="wmode" value="opaque" /><param name="src" value="http://www.tudou.com/v/RKO9MZVfmRw" /><param name="allowfullscreen" value="true" /><embed type="application/x-shockwave-flash" width="420" height="363" src="http://www.tudou.com/v/RKO9MZVfmRw" allowfullscreen="true" allowscriptaccess="always" wmode="opaque"></embed></object></p>]]></description>
		<wfw:commentRss>http://www.wumain.com/php/blog/archives/165/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>2009我为财狂周立波理财语录精选</title>
		<link>http://www.wumain.com/php/blog/archives/162</link>
		<comments>http://www.wumain.com/php/blog/archives/162#comments</comments>
		<pubDate>Fri, 04 Dec 2009 02:03:03 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[心情]]></category>
		<category><![CDATA[周立波]]></category>
		<category><![CDATA[我为财狂]]></category>
		<category><![CDATA[精选]]></category>
		<category><![CDATA[语录]]></category>

		<guid isPermaLink="false">http://www.wumain.com/php/blog/?p=162</guid>
		<description><![CDATA[<p>一直都很喜欢周立波，以轻松诙谐的方式诠释了海派文化、以犀利睿智的语言道出了深度思想。昨天晚上去美琪大戏院看了他的“2009我为财狂”，记下了几句堪称经典的理财语录，和大家分享，希望给大家带来一天的好心情！ </p>
<p>    1、奥巴马来中国，一共4天上海就占了1天。上海，在外国人眼里是中国，在中国人眼里是外国。有网友说“如果让周立波接见奥巴马会怎么样？”我说，奥巴马会掏出一张拉登的照片给我，然后说“拿伊组特！” </p>
<p>    2、什么是和谐？和，禾木旁代表粮食，口就是嘴巴，代表人人有饭吃；谐，言字旁就是说话，皆就是大家，代表人人都可以说话。和谐就是人人有饭吃、人人能说话。 </p>
<p>    3、中国是美国最大的债权国，持有8000亿美国国债，穷人借钱给富人，所以大家马路上看到美国人跟你挥手打招呼“Hi”的时候，跟他说“Hi什么Hi、还钱还钱！” </p>
<p>    4、很多北京人喜欢我，想请我去北京演出，我不去，我说你们要是喜欢我就坐飞机来上海看我，这样还能拉动上海的GDP。 </p>
<p>    5、房价，成为老百姓心中永远的痛。汤臣一品几年前卖10万一平方，没人买，今年涨到16万一平方还卖出去好几套。为什么说跟老百姓没关系？16万打个对折8万一平方，你会去买吗？照样买不起，再在8万上面打个骨折价，4万一平米，还是买不起。这样的房子送给我我也不要，因为付不起物业管理费。 </p>
<p>    6、白领是什么意思？就是领来工资全部用掉，全部“白领”。无欲则刚，在单位里卑躬屈膝的人都是有按揭贷款要还的人。日本人为什么那么有礼貌，因为他们都是有贷款的。 </p>
<p>    7、帮领导做100件好事不如和领导一起做1件坏事。 </p>
<p>    8、春晚的主流观众是9亿农民，如果说周立波是上海人民的小菜，那么赵本山就是全国人民的北方水饺。 </p>
<p>    9、40岁前，财务没有实现充分自由前不要买房。在上海滩买一套300万的房子，都买不到什么好地方，手机信号都不清楚。首付150万，自己出100万，剩下50万问父母要就是啃老族，向朋友借就连朋友也做不了了，如果你不想和一个人交朋友那就问他借钱，如果你不再把一个朋友当作兄弟那就叫他还钱。还有150万问银行借款，就算利率打7折，每个月也要还给银行7,298.53元，30年一共要还给银行利息2,627,470.80元。262万多！银行是侬爷？有这个钞票侬还不如给爷娘。 </p>
<p>    10、什么是按揭？按揭就是把你按在地上一层层揭你的皮，有一种残忍是用温柔的方式表达的。 </p>
<p>    11、我敢断言，但我绝不负责，上海的房子5年内一定翻一番，但这个和老百姓没关系。 </p>
<p>    12、钞票只有用掉了以后才是你的，打开皮夹子，看看没有用掉的钞票，上面印的是“中国人民银行”，跟你没关系。 </p>
<p>    13、当你有了人生第一个100万的时候，这些钱都是你的；当你有了人生第一个1000万的时候，其中有20%被这个社会所控股，因为你要承担社会责任；当你拥有资产过亿了之后，这些钱是你的吗？不是你的了！你只是帮这个社会在管理资产，管得不好你就是黄光裕。 </p>
<p>    14、中国人爱什么什么就遭殃，爱孩子孩子就要吃家什。 </p>
<p>    15、当教育和金钱挂钩的时候，老师变成了老板，学生变成了学徒，而家长就变成了ATM提款机。 </p>
<p>    16、保姆比大学生好就业，可以在10分钟内给自己涨3次工资。陈国庆家里要找个保姆，开始说好价钱每个月1800元，后来保姆一进小区，看到小区又大又漂亮，提出工资涨到2000一个月，再随后进了陈国庆的家门，一看到墙上挂的陈国庆巨幅照片，马上又涨到3000一个月。 </p>
<p>    17、有些基金在宣传的时候说，去年收益30%，什么什么排名第一。但是一年变化有多大？一年前阿扁还是台湾一哥，现在他吃伟哥也没有用了。 </p>
<p>    18、不管是什么人，睡觉只需要半张床的位置就够了，如果睡相差一点一张床也足够了，不会因为你是李嘉诚就要睡2000张床，都可以在上面打滚了。 </p>
<p>    19、现在南汇那里人把猫全送走了，当地老鼠过马路看到红绿灯都不停的，直接窜过去，逢人就说“阿拉外国亲眷要来啦！” </p>
<p>    20、中国的股市已经不是股市，是事故。股市应该不是战斗机，而是民航机，理论上出事的概率应该比中国足球冲出亚洲的概率还要低。 </p>
<p>    21、股民赚钱都是听到的，亏钱都是自己碰到的。牛市来的时候不相信，熊市来的时候不承认。 </p>
<p>    22、创业板变成了闯祸板，已经走得太远太远了，叫也叫不回来了，叫回来也废掉了。 </p>
<p>    23、从6124点往下看，我们都是熊的传人。 </p>
<p>    24、股市点位和离婚率有关，2000点以下时离婚率正常，到了3000点以上离婚率有所上升，到了6000点以上离婚率创新高。 </p>
<p>    25、当你失败了，就把它作为人生财富；成功了，就是财富人生。 </p>
<p>    支持正版，抵制盗版，喜欢波波的话，那就去看他的演出或是买他的书吧！</p>]]></description>
		<wfw:commentRss>http://www.wumain.com/php/blog/archives/162/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>妙趣视频 《半条命2》引擎重现《魂斗罗》</title>
		<link>http://www.wumain.com/php/blog/archives/158</link>
		<comments>http://www.wumain.com/php/blog/archives/158#comments</comments>
		<pubDate>Sat, 28 Nov 2009 03:07:04 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[心情]]></category>
		<category><![CDATA[半条命]]></category>
		<category><![CDATA[魂斗罗]]></category>

		<guid isPermaLink="false">http://www.wumain.com/php/blog/?p=158</guid>
		<description><![CDATA[游戏年龄15岁以上的老资格玩家们一定还记得当年FC任天堂红白机上的经典《魂斗罗》(Contra)。这款横版卷轴射击游戏恐怕是当时绝大多数玩家的游戏启蒙之作，相信至今还有不少玩家能对其关卡、窍门如数家珍。

日前，一位名叫M0rtanius游戏Mod开发玩家就帮我们回顾了一下儿时的幸福时光。他使用《半条命2》的Source引擎，惟妙惟肖的重新制作了《魂斗罗》第一关。把当年的横版第三人称视角转化为现在的第一人称FPS，可谓别有一番趣味。

相信看过之后，不少玩家都会和笔者一样认为，如果真有人做出了这样一款Mod游戏作品，愿意尝试支持一下的玩家肯定不在少数。

<object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="550" height="310" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="quality" value="high" /><param name="FlashVars" value="vcastr_file=/img/flash/20091127/04581615.flv" /><param name="src" value="http://news.mydrivers.com/images/flv_player.swf" /><param name="flashvars" value="vcastr_file=/img/flash/20091127/04581615.flv" /><embed type="application/x-shockwave-flash" width="550" height="310" src="http://news.mydrivers.com/images/flv_player.swf" flashvars="vcastr_file=/img/flash/20091127/04581615.flv" quality="high"></embed></object>]]></description>
		<wfw:commentRss>http://www.wumain.com/php/blog/archives/158/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>programmers系列漫画 神秘的程序员们</title>
		<link>http://www.wumain.com/php/blog/archives/145</link>
		<comments>http://www.wumain.com/php/blog/archives/145#comments</comments>
		<pubDate>Mon, 23 Nov 2009 01:59:05 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[心情]]></category>
		<category><![CDATA[programmers]]></category>
		<category><![CDATA[漫画]]></category>
		<category><![CDATA[神秘的程序员]]></category>
		<category><![CDATA[程序员]]></category>

		<guid isPermaLink="false">http://www.wumain.com/php/blog/?p=145</guid>
		<description><![CDATA[<a href="http://www.wumain.com/php/blog/wp-content/uploads/2009/11/12.jpg"><img class="aligncenter size-full wp-image-147" title="1" src="http://www.wumain.com/php/blog/wp-content/uploads/2009/11/12.jpg" alt="1" width="580" height="1306" /></a>

<a href="http://www.wumain.com/php/blog/wp-content/uploads/2009/11/22.jpg"><img class="aligncenter size-full wp-image-148" title="2" src="http://www.wumain.com/php/blog/wp-content/uploads/2009/11/22.jpg" alt="2" width="580" height="1298" /></a>

<a href="http://www.wumain.com/php/blog/wp-content/uploads/2009/11/32.jpg"><img class="aligncenter size-full wp-image-149" title="3" src="http://www.wumain.com/php/blog/wp-content/uploads/2009/11/32.jpg" alt="3" width="600" height="1436" /></a>

<a href="http://www.wumain.com/php/blog/wp-content/uploads/2009/11/42.jpg"><img class="aligncenter size-full wp-image-150" title="4" src="http://www.wumain.com/php/blog/wp-content/uploads/2009/11/42.jpg" alt="4" width="600" height="1215" /></a>

<a href="http://www.wumain.com/php/blog/wp-content/uploads/2009/11/5.gif"><img class="aligncenter size-full wp-image-151" title="5" src="http://www.wumain.com/php/blog/wp-content/uploads/2009/11/5.gif" alt="5" width="600" height="1251" /></a>

<a href="http://www.wumain.com/php/blog/wp-content/uploads/2009/11/6.jpg"><img src="http://www.wumain.com/php/blog/wp-content/uploads/2009/11/6.jpg" alt="6" title="6" width="600" height="1251" class="aligncenter size-full wp-image-146" /></a>

<a href="http://www.wumain.com/php/blog/wp-content/uploads/2009/11/6.gif"><img src="http://www.wumain.com/php/blog/wp-content/uploads/2009/11/6.gif" alt="6" title="6" width="597" height="1208" class="aligncenter size-full wp-image-152" /></a>]]></description>
		<wfw:commentRss>http://www.wumain.com/php/blog/archives/145/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>最流行俏皮语</title>
		<link>http://www.wumain.com/php/blog/archives/142</link>
		<comments>http://www.wumain.com/php/blog/archives/142#comments</comments>
		<pubDate>Thu, 19 Nov 2009 04:55:10 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[心情]]></category>
		<category><![CDATA[俏皮]]></category>
		<category><![CDATA[流行]]></category>

		<guid isPermaLink="false">http://www.wumain.com/php/blog/?p=142</guid>
		<description><![CDATA[1、总有一天你的名字会出现在我家的户口本上! 　　     
2、将薪比薪的想一下，算了，不想活了。 
3、活了二十多年，没能为祖国、为人民做点什么，每思及此，伤心欲绝。
4、我和脂肪做斗争，差点没牺牲 
5、生活嘛，就是生下来，活下去~~  
6、再丑也要谈恋爱，谈到世界充满爱。
7、船撞桥头自然沉~~ 
8、当你披上了婚纱 我也披上了袈裟~~  
9、我跟耶稣祈求踏实稳定的生活，他想了想说，咱们还是先谈谈世界和平的事吧... 
10、爱我就大声地说出来吧!恨我就一辈子藏在心里吧!  
11、趁着年轻把能干的坏事都干了吧，没几年了。 
12、我在春天种下一堆男朋友，现在秋天到了，啧啧，居然颗粒无收~~
13、你曾经对我说，会永远爱着我，爱情这东西我明白，但永远是什么? 
14、七岁的小男孩是地球上最可怕的生物，他们有好奇心、行动力、破坏力以及《未成年人保护法》 
15、人贵在言而有信——我说不还钱就不还钱! 
16、夏天就是不好，穷的时候连西北风都没得喝，幸亏现在是秋天了。 
17、我虽然相信海誓山盟，但是未必相信你啊~~ 
18、 凡我放不下的，必是因为我拥有不了的~~ 
19、特别的人从来不说自己特别，比如说我。 
20、我人生只会两件事 1 这也不会 2 那也不会 
21、成人不自在，自在不成人~~
22、我知道,天下无不散宴席,可是,至少,宴席上我要吃得爽!
23、解释就是掩饰，掩饰就是讲故事~~ 
24、人和人不是客客气气就能相处的! 
25、每当困难的时候我就念藏经：“噢嘛呢哞嘛哄”， 翻译成英文就是:All money go my home! 
26、善良就是别人挨饿的时候，我吃肉不bia ji 嘴~~ 
27、我曾想成为一个问题少年，然而我却循规蹈矩地活了这么多年。
28.如果心情不好， 就去超市捏捏方便面。 捏捏族
29.谁耽误我一阵子，我让他后悔一辈子 。 
30.关门一个月，不要叫我，因为一叫我我就会出来…… 
31.出租车司机，司机中的战斗机，噢耶! 
32.思想有多远，你就给我滚多远! 
33.诸葛亮出山前也没带过兵啊，你们凭啥要我有工作经验!!! 
34.工作的最高境界就是看着别人上班，领着别人的工资。 
35.胖并憔悴着~~ 
36.康夫你辞职的时候有没有考虑过哆啦A梦的感受!(去年日本首相宣布辞职时写的) 
37.我风情又果敢,远目且踏实,品味上乘却又勤奋自省,缺点虽多，还望大家海涵!38.你给我滚，马不停蹄的滚…… 
39.做人一定要做一个蹦蹦跳跳的人。
40.我走我的阳光道，你过你的奈何桥。
41.人生最大的悲哀是青春不在,青春痘却还在。 
42.世界是我们的，也是孩子们的，但最终是那帮孙子们的! 
43.我们的宗旨是：为人民币服务! 
44.好久没有人把牛皮吹的这么清新脱俗了! 
45.最简单的长寿秘决--------------保持呼吸，不要断气~~ 
46.钱对你真的就那么重要吗?讲了3个多小时了一分钱都不降。 
47.打死我也不说，你们还没使美人计呢! 
48.等我有钱了，我就买一辆公交车，专门走公交专用车道，专门停在公交车站，等有人想上车了，我就说：对不起，这是私家车~~
49.甲：人家十全十美，你怎么说也是十全八美~~ 乙：那我是缺哪两美？甲：内在美和外在美…… 乙：…………]]></description>
		<wfw:commentRss>http://www.wumain.com/php/blog/archives/142/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>【10.26.09】《无主之地（Borderlands）》[EN]</title>
		<link>http://www.wumain.com/php/blog/archives/130</link>
		<comments>http://www.wumain.com/php/blog/archives/130#comments</comments>
		<pubDate>Sun, 08 Nov 2009 15:18:53 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[心情]]></category>
		<category><![CDATA[Borderlands]]></category>
		<category><![CDATA[Gearbox Software]]></category>
		<category><![CDATA[无主之地]]></category>

		<guid isPermaLink="false">http://www.wumain.com/php/blog/?p=130</guid>
		<description><![CDATA[<strong><a rel="attachment wp-att-131" href="http://www.wumain.com/php/blog/archives/130/1-3"><img class="aligncenter size-medium wp-image-131" title="1" src="http://www.wumain.com/php/blog/wp-content/uploads/2009/11/11-211x300.jpg" alt="1" width="211" height="300" /></a></strong>

<strong>中文名称：</strong>无主之地
<strong>英文名称：</strong>Borderlands
<strong>发行时间：</strong>2009年10月26日
<strong>游戏类型：</strong>角色扮演
<strong>游戏语言：</strong>英文
<strong>开发厂商：</strong>Gearbox Software
<strong>发行厂商：</strong>2K Games
<strong>官方网站：</strong><a href="http://www.borderlands.com/" target="_blank">http://www.borderlands.com/</a>

<strong>游戏介绍：</strong>

虽然Gearbox是要带给我们一个传奇冒险，但是游戏中也充满了幽默的部分。比如可以在抽水马桶和动物屎堆里发现道具，往水里扔手雷可以收获大堆死鱼。Borderlands故事发生的星球叫做Pandora，故事是围绕着星球枯竭的资源和新发现的外星科技展开的。游戏中将会有20~30主线剧情，130～140个支线任务。并有大量的场景可以探索。游戏中的宝物掉落种类非常丰富，而且有着非常强大的枪械和载具组装系统。据Gearbox称，如果不算上改造的话，游戏中将会有五十万到六十万中武器可以选择。算上改造的话，可以有一千七百万种的组合。(卫星太大了吧，我觉得是说像大菠萝那种的吧)特殊的高级武器将会使用绿色，紫色武器等等常见的武器稀有度设定。游戏设计初期内定了三种传统的职业:Soldier，Hunter，Siren。最近的公布加上了Berserker。

该作具备暗黑系列的主要特色，比如技能树、情节驱动模式、可即时加入或跳出的四人通关模式：

·掉落的每一只枪都有随机属性，比如射速、装弹时间、弹匣容量等
·武器属性直接影响其外观，比如发着绿光的枪肯定被淬了毒
·就像暗黑一样，每次开宝箱都无法预料会掉落哪些物品，开箱者总在试图获得更丰厚的掉落
·技能可升级，技能类别分为装备和体格等，比如玩家可将天赋点数加在手雷携带量上，或是分配给装弹时间
·设置有武器专精技能，比如“突击步枪专精”，每增加一级都将强化这方面的能力
·游戏提供了可驾驶的载具，演示中的沙滩车有异乎寻常的腾空能力，就像《战地》里的轻型攻击车或是《光晕》中的疣猪车。
·所有载具都考虑到了多人合作模式，行驶途中可互换乘坐位置
·动态背景音乐
·超乎寻常的肢解画面，残肢漫天飞舞，爆炸物能让敌人一飞冲天
·50万支枪是远远不够的，准确地说，该作内置了65万3千种枪械

<strong>配置需求：</strong>

操作系统 Windows XP/Vista
处理器 2.4 Ghz or equivalent processor
内存 1GB 系统内存 (2GB Vista)
显卡 256mb 以上显存 (GeForce 8 系列以上产品/Radeon R8xx 系列)
硬盘空间 8 GB 以上空间
声卡 Windows 兼容声卡

<strong>安装信息：</strong>

1. 解压缩
2. 载入镜象
3. 安装游戏
4. 将Crack目录中的文件复制到游戏安装目录下
4. 运行游戏

<strong>游戏截图：</strong>

<a rel="attachment wp-att-132" href="http://www.wumain.com/php/blog/archives/130/2-3"><img class="aligncenter size-medium wp-image-132" title="2" src="http://www.wumain.com/php/blog/wp-content/uploads/2009/11/21-300x168.jpg" alt="2" width="300" height="168" /></a>

<a rel="attachment wp-att-133" href="http://www.wumain.com/php/blog/archives/130/3-3"><img class="aligncenter size-medium wp-image-133" title="3" src="http://www.wumain.com/php/blog/wp-content/uploads/2009/11/31-300x168.jpg" alt="3" width="300" height="168" /></a>

<a rel="attachment wp-att-134" href="http://www.wumain.com/php/blog/archives/130/4-3"><img class="aligncenter size-medium wp-image-134" title="4" src="http://www.wumain.com/php/blog/wp-content/uploads/2009/11/41-300x187.jpg" alt="4" width="300" height="187" /></a>

<a rel="attachment wp-att-135" href="http://www.wumain.com/php/blog/archives/130/attachment/5"><img class="aligncenter size-medium wp-image-135" title="5" src="http://www.wumain.com/php/blog/wp-content/uploads/2009/11/5-300x187.jpg" alt="5" width="300" height="187" /></a>
<strong>游戏下载:</strong>
<a href="http://www.wumain.com/php/blog/wp-content/uploads/2009/11/33349285912334.torrent">种子下载</a>]]></description>
		<wfw:commentRss>http://www.wumain.com/php/blog/archives/130/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>javascript函数作用域与闭包</title>
		<link>http://www.wumain.com/php/blog/archives/125</link>
		<comments>http://www.wumain.com/php/blog/archives/125#comments</comments>
		<pubDate>Fri, 06 Nov 2009 05:35:03 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[js]]></category>
		<category><![CDATA[作用域]]></category>
		<category><![CDATA[函数]]></category>
		<category><![CDATA[闭包]]></category>

		<guid isPermaLink="false">http://www.wumain.com/php/blog/?p=125</guid>
		<description><![CDATA[<span style="font-size: x-small;"><span style="font-size: medium;"><strong>8.8. 函数作用域与闭包
</strong></span>        如第四章所述,JavaScript函数的函数体在局部作用域中执行,局部作用域不同于全局作用域.本章将解释这些内容和相关的作用域问题,包括<strong>闭包</strong>.[*]</span>

<span style="font-size: xx-small;">[*] 本章包含超前的内容,如果你是第一次阅读,可以跳过.</span>

<span style="font-size: x-small;"><span style="font-size: small;"><strong>8.8.1. <a href="http://www.v-ec.com/dh20156/article.asp?id=88" target="_blank">词法作用域(Lexical Scoping)</a></strong> </span>
        JavaScript中的函数是基于词法作用域的,而不是动态作用域.这句话的意思是JavaScript中的函数运行在它们被定义的作用域里,而不是它们被执行的作用域里.定义一个函数时,当前作用域链被保存起来并成为该函数内部状态的一部分.作用域链的顶层(最初一层)是由全局对象构成的,这和词法作用域没什么明显的关联.然而,当你定义一个嵌套函数时,作用域链将包含外层函数(嵌套函数的外层函数.原文:the containing function).这就意味着,被嵌套的函数可以访问外层函数的所有参数和局部变量.</span>

<span style="font-size: x-small;">        注意:尽管在一个函数定义的时候,作用域链就已经固定了,但是作用域链中定义的属性并不是固定的.作用域链是"活的"("live"),当函数被调用的时候,它有权访问任何当前被关联的数据.</span>

<span style="font-size: x-small;"><span style="font-size: small;"><strong>8.8.2. 调用对象(The Call Object)</strong> </span>
        当JavaScript解释器调用函数的时候,首先,它把作用域设置到作用域链,在函数被定义的时候,该作用域链已经有效.接下来,解释器添加一个叫做调用对象(ECMAScript规范使用术语:activation object,活动对象)的对象到作用域链的头部.引用Arguments对象的arguments属性为函数初始化调用对象.接下来,添加函数的命名参数到调用对象.所有用var语句定义的局部变量也都在这个对象中定义.因为调用对象在作用域链的头部,局部变量,函数参数和参数对象都在函数的作用域内.也就是说它们隐藏了所有同名的在更早的作用域中定义的属性.</span>

<span style="font-size: x-small;">注意:与arguments不同,this是关键字,而不是调用对象的一个属性.</span>

<span style="font-size: x-small;"><span style="font-size: small;"><strong>8.8.3. 调用对象作为命名空间(The Call Object as a Namespace)</strong> </span>
        有时,用定义一个简单函数的方法创建一个调用对象是很有用的,这个调用对象可以扮演一个临时命名空间的角色,如此一来,你定义的变量和创建的属性都不会破坏全局命名空间.例如:假设你有一个Javascrip代码文件,你希望把它用到很多不同的Javascript程序中(或者,用于客户端Javascript,在很多不同的<a href="http://www.v-ec.com/dh20156/" target="_blank"><strong>web前端</strong></a>网页上).假设这些代码像其它代码一样定义了中间变量来保存计算结果.现在的问题是因为这些代码将用于很多不同的程序,你无法知道此变量是否和其它引入该文件的程序的变量相冲突.</span>

<span style="font-size: x-small;">        解决的方法是把代码放到函数里,然后调用这个函数.如此一来,变量是被定义在函数的调用对象中:</span>
<div style="padding-right: 5px; padding-left: 4px; font-size: 13px; padding-bottom: 4px; width: 98%; padding-top: 4px; background-color: #eeeeee; border: #cccccc 1px solid;"><img id="Codehighlighter1_16_79_Open_Image" style="DISPLAY: inline" onclick="this.style.display='none'; Codehighlighter1_16_79_Open_Text.style.display='none'; Codehighlighter1_16_79_Closed_Image.style.display='inline'; Codehighlighter1_16_79_Closed_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockStart.gif" alt="" align="top" /> <img id="Codehighlighter1_16_79_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_16_79_Closed_Text.style.display='none'; Codehighlighter1_16_79_Open_Image.style.display='inline'; Codehighlighter1_16_79_Open_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedBlock.gif" alt="" align="top" /> <span style="COLOR: #0000ff">function</span> <span style="COLOR: #000000"> init() </span> <span id="Codehighlighter1_16_79_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif" alt="" /> </span><span id="Codehighlighter1_16_79_Open_Text" style="DISPLAY: inline"><span style="COLOR: #000000">{
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" alt="" align="top" />    </span> <span style="COLOR: #008000">//</span> <span style="COLOR: #008000"> 代码从这里开始</span> <span style="COLOR: #008000">
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" alt="" align="top" /> </span><span style="COLOR: #000000">    </span> <span style="COLOR: #008000">//</span> <span style="COLOR: #008000"> 任何变量声明都会成为调用对象的属性</span> <span style="COLOR: #008000">
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" alt="" align="top" /> </span><span style="COLOR: #000000">    </span> <span style="COLOR: #008000">//</span> <span style="COLOR: #008000"> 如此不会破坏全局命名空间.</span> <span style="COLOR: #008000">
<img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockEnd.gif" alt="" align="top" /> </span><span style="COLOR: #000000">}</span> </span><span style="COLOR: #000000">
<img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" alt="" align="top" />init();  </span> <span style="COLOR: #008000">//</span> <span style="COLOR: #008000"> 不要忘了调用这个函数哦!</span></div>
<span style="font-size: x-small;">        这段代码只给全局命名空间添加了一个"init"属性,该属性引用init函数.如果定义一个函数还嫌太多,那么你可以用一个表达式定义和调用一个匿名函数.像这样的JavaScript语法如下:</span>
<div style="padding-right: 5px; padding-left: 4px; font-size: 13px; padding-bottom: 4px; width: 98%; padding-top: 4px; background-color: #eeeeee; border: #cccccc 1px solid;"><img id="Codehighlighter1_12_89_Open_Image" onclick="this.style.display='none'; Codehighlighter1_12_89_Open_Text.style.display='none'; Codehighlighter1_12_89_Closed_Image.style.display='inline'; Codehighlighter1_12_89_Closed_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockStart.gif" alt="" align="top" /> <img id="Codehighlighter1_12_89_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_12_89_Closed_Text.style.display='none'; Codehighlighter1_12_89_Open_Image.style.display='inline'; Codehighlighter1_12_89_Open_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedBlock.gif" alt="" align="top" /> <span style="COLOR: #000000">(</span> <span style="COLOR: #0000ff">function</span> <span style="COLOR: #000000">() </span> <span id="Codehighlighter1_12_89_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif" alt="" /> </span><span id="Codehighlighter1_12_89_Open_Text"><span style="COLOR: #000000">{  </span> <span style="COLOR: #008000">//</span> <span style="COLOR: #008000"> 这个函数没有名字.</span> <span style="COLOR: #008000">
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" alt="" align="top" /> </span><span style="COLOR: #000000">    </span> <span style="COLOR: #008000">//</span> <span style="COLOR: #008000"> 代码从这里开始</span> <span style="COLOR: #008000">
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" alt="" align="top" /> </span><span style="COLOR: #000000">    </span> <span style="COLOR: #008000">//</span> <span style="COLOR: #008000"> 任何变量声明都会成为调用对象的属性</span> <span style="COLOR: #008000">
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" alt="" align="top" /> </span><span style="COLOR: #000000">    </span> <span style="COLOR: #008000">//</span> <span style="COLOR: #008000"> 如此不会破坏全局命名空间.</span> <span style="COLOR: #008000">
<img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockEnd.gif" alt="" align="top" /> </span><span style="COLOR: #000000">}</span> </span><span style="COLOR: #000000">)();          </span> <span style="COLOR: #008000">//</span> <span style="COLOR: #008000">结束函数直接量,并调用该函数.</span></div>
<span style="font-size: x-small;">        注意:函数直接量外面的括号是JavaScript语法所必需的.</span>

<span style="font-size: x-small;"><span style="font-size: small;"><strong>8.8.4. 嵌套函数作为闭包(Nested Functions as Closures)</strong> </span>
        JavaScript允许函数嵌套,允许把函数作为数据,允许使用词法作用域,把这些结合使用能创造出功能强大的令人惊奇的效果.让我们开始探索,考虑一下函数g被定义在函数f中.当f被调用的时候,作用域链由为函数f调用生成的调用对象跟随在全局对象之后构成.g函数被定义在f函数里,因此,这个作用域链作为g函数定义的一部分被保存起来.当g函数被调用的时候,作用域链包括三个部分:g函数自己的调用对象,f函数的调用对象和全局对象.</span>

<span style="font-size: x-small;">        嵌套函数在相同的它们被定义的词法作用域里被调用的时候是很容易理解的.例如,下面的代码并没有什么特别:</span>
<div style="padding-right: 5px; padding-left: 4px; font-size: 13px; padding-bottom: 4px; width: 98%; padding-top: 4px; background-color: #eeeeee; border: #cccccc 1px solid;"><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" alt="" align="top" /> <span style="COLOR: #0000ff">var</span> <span style="COLOR: #000000"> x </span> <span style="COLOR: #000000">=</span> <span style="COLOR: #000000"> </span> <span style="COLOR: #000000">"</span> <span style="COLOR: #000000">global</span> <span style="COLOR: #000000">"</span> <span style="COLOR: #000000">;
<img id="Codehighlighter1_31_94_Open_Image" onclick="this.style.display='none'; Codehighlighter1_31_94_Open_Text.style.display='none'; Codehighlighter1_31_94_Closed_Image.style.display='inline'; Codehighlighter1_31_94_Closed_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockStart.gif" alt="" align="top" /><img id="Codehighlighter1_31_94_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_31_94_Closed_Text.style.display='none'; Codehighlighter1_31_94_Open_Image.style.display='inline'; Codehighlighter1_31_94_Open_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedBlock.gif" alt="" align="top" /></span> <span style="COLOR: #0000ff">function</span> <span style="COLOR: #000000"> f() </span> <span id="Codehighlighter1_31_94_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif" alt="" /> </span><span id="Codehighlighter1_31_94_Open_Text"><span style="COLOR: #000000">{
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" alt="" align="top" />    </span> <span style="COLOR: #0000ff">var</span> <span style="COLOR: #000000"> x </span> <span style="COLOR: #000000">=</span> <span style="COLOR: #000000"> </span> <span style="COLOR: #000000">"</span> <span style="COLOR: #000000">local</span> <span style="COLOR: #000000">"</span> <span style="COLOR: #000000">;
<img id="Codehighlighter1_71_83_Open_Image" onclick="this.style.display='none'; Codehighlighter1_71_83_Open_Text.style.display='none'; Codehighlighter1_71_83_Closed_Image.style.display='inline'; Codehighlighter1_71_83_Closed_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif" alt="" align="top" /><img id="Codehighlighter1_71_83_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_71_83_Closed_Text.style.display='none'; Codehighlighter1_71_83_Open_Image.style.display='inline'; Codehighlighter1_71_83_Open_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif" alt="" align="top" />    </span> <span style="COLOR: #0000ff">function</span> <span style="COLOR: #000000"> g() </span> <span id="Codehighlighter1_71_83_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif" alt="" /> </span><span id="Codehighlighter1_71_83_Open_Text"><span style="COLOR: #000000">{ alert(x); }</span> </span><span style="COLOR: #000000">
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" alt="" align="top" />    g();
<img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockEnd.gif" alt="" align="top" />}</span> </span><span style="COLOR: #000000">
<img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" alt="" align="top" />f();  </span> <span style="COLOR: #008000">//</span> <span style="COLOR: #008000"> 调用这个函数显示 "local"</span></div>
<div><span style="font-size: x-small;">        然而,在JavaScript中,函数可以像其它值一样作为数据,因此可以在函数中返回一个函数,赋值给对象的属性,存储在数组中等等.这也没有什么特别的,除了嵌套的函数被调用的时候.考虑下面的代码,它包含一个返回嵌套函数的函数.每次被调用的时候,它都返回一个函数.被返回的函数的JavaScript代码总是相同的,但是,因为每次调用外层函数时的参数不同,每次被调用的时候,它(被返回的嵌套函数)创建的作用域也有些许不同.(也就是说,对于外层函数的每次调用,都会在作用域链中产生一个不同的调用对象.)如果你把返回函数保存在数组中,然后每一个调用一次,你将发现每一个函数都返回不同的值.因为每一个函数都由相同的JavaScript代码构成,并且每一次都是从相同的作用域中调用,所以,唯一能造成返回值不同的因素就是函数被定义的作用域:</span></div>
<span style="font-size: x-small;"> 

</span>
<div style="padding-right: 5px; padding-left: 4px; font-size: 13px; padding-bottom: 4px; width: 98%; padding-top: 4px; background-color: #eeeeee; border: #cccccc 1px solid;"><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" alt="" align="top" /> <span style="COLOR: #008000">//</span> <span style="COLOR: #008000"> 每次调用这个函数的时候返回一个函数</span> <span style="COLOR: #008000">
<img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" alt="" align="top" />//</span> <span style="COLOR: #008000"> 函数被定义的作用域在每次调用时都不同</span> <span style="COLOR: #008000">
<img id="Codehighlighter1_64_102_Open_Image" onclick="this.style.display='none'; Codehighlighter1_64_102_Open_Text.style.display='none'; Codehighlighter1_64_102_Closed_Image.style.display='inline'; Codehighlighter1_64_102_Closed_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockStart.gif" alt="" align="top" /> <img id="Codehighlighter1_64_102_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_64_102_Closed_Text.style.display='none'; Codehighlighter1_64_102_Open_Image.style.display='inline'; Codehighlighter1_64_102_Open_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedBlock.gif" alt="" align="top" /> </span><span style="COLOR: #0000ff">function</span> <span style="COLOR: #000000"> makefunc(x) </span> <span id="Codehighlighter1_64_102_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif" alt="" /> </span><span id="Codehighlighter1_64_102_Open_Text"><span style="COLOR: #000000">{
<img id="Codehighlighter1_88_100_Open_Image" onclick="this.style.display='none'; Codehighlighter1_88_100_Open_Text.style.display='none'; Codehighlighter1_88_100_Closed_Image.style.display='inline'; Codehighlighter1_88_100_Closed_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif" alt="" align="top" /><img id="Codehighlighter1_88_100_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_88_100_Closed_Text.style.display='none'; Codehighlighter1_88_100_Open_Image.style.display='inline'; Codehighlighter1_88_100_Open_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif" alt="" align="top" />    </span> <span style="COLOR: #0000ff">return</span> <span style="COLOR: #000000"> </span> <span style="COLOR: #0000ff">function</span> <span style="COLOR: #000000">() </span> <span id="Codehighlighter1_88_100_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif" alt="" /> </span><span id="Codehighlighter1_88_100_Open_Text"><span style="COLOR: #000000">{ </span> <span style="COLOR: #0000ff">return</span> <span style="COLOR: #000000"> x; }</span> </span><span style="COLOR: #000000">
<img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockEnd.gif" alt="" align="top" />}</span> </span><span style="COLOR: #000000">
<img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" alt="" align="top" />
<img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" alt="" align="top" /> </span><span style="COLOR: #008000">//</span> <span style="COLOR: #008000"> 调用几次 makefunc() , 把结果保存到数组中:</span> <span style="COLOR: #008000">
<img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" alt="" align="top" /> </span><span style="COLOR: #0000ff">var</span> <span style="COLOR: #000000"> a </span> <span style="COLOR: #000000">=</span> <span style="COLOR: #000000"> [makefunc(</span> <span style="COLOR: #000000">0</span> <span style="COLOR: #000000">), makefunc(</span> <span style="COLOR: #000000">1</span> <span style="COLOR: #000000">), makefunc(</span> <span style="COLOR: #000000">2</span> <span style="COLOR: #000000">)];
<img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" alt="" align="top" />
<img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" alt="" align="top" /></span> <span style="COLOR: #008000">//</span> <span style="COLOR: #008000"> 现在调用这些函数并显示结果.</span> <span style="COLOR: #008000">
<img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" alt="" align="top" />//</span> <span style="COLOR: #008000"> 尽管函数体是相同的,但是作用域是不同的,所以每次调用返回不同的结果:</span> <span style="COLOR: #008000">
<img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" alt="" align="top" /> </span><span style="COLOR: #000000">alert(a[</span> <span style="COLOR: #000000">0</span> <span style="COLOR: #000000">]());  </span> <span style="COLOR: #008000">//</span> <span style="COLOR: #008000"> Displays 0</span> <span style="COLOR: #008000">
<img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" alt="" align="top" /> </span><span style="COLOR: #000000">alert(a[</span> <span style="COLOR: #000000">1</span> <span style="COLOR: #000000">]());  </span> <span style="COLOR: #008000">//</span> <span style="COLOR: #008000"> Displays 1</span> <span style="COLOR: #008000">
<img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" alt="" align="top" /> </span><span style="COLOR: #000000">alert(a[</span> <span style="COLOR: #000000">2</span> <span style="COLOR: #000000">]());  </span> <span style="COLOR: #008000">//</span> <span style="COLOR: #008000"> Displays 2</span></div>
<span style="font-size: x-small;">        这段代码的结果是正确的,是根据词法作用域规则的严谨的应用所期待的:函数被执行在它被定义的作用域内.然而,这些结果令人吃惊的原因是,你期待的局部作用域在定义它们的函数退出的时候就不存在了.事实上,这是正常现象.当函数被调用的时候,解释器创建一个调用对象并把它放到作用域链的头部.当函数退出的时候,解释器从作用域链上删除这个调用对象.在没有嵌套函数被定义的时候,调用对象是唯一引用作用域链的对象.当调用对象从作用域链上删除时,就再也没有对它的引用了,它将被GC(garbage collected)回收.</span>
<p style="MARGIN-RIGHT: 0px" dir="ltr"><span style="font-size: x-small;">        但是,嵌套函数改变了这些.如果嵌套函数被创建,这个函数的定义引用调用对象,因为这个调用对象是函数被定义的作用域链的顶部.如果嵌套函数只是被外层函数使用,对嵌套函数的唯一引用在调用对象里.当外层函数返回时,只有嵌套函数引用调用对象,调用对象引用嵌套函数,除此之外,再也没有其它的什么引用任何一个,因此,这两个对象就只能被GC使用了.</span></p>

<span style="font-size: x-small;">        如果你保存了一个嵌套函数的引用到全局作用域,情况就有所不同了.你把嵌套函数作为外层函数的返回值,或者把嵌套函数保存为其它对象的属性.在这种情况下,就有了一个对嵌套函数的外部引用,所以,嵌套函数在它的外部函数的调用对象中保持着它的引用.结果是,为外层函数调用生成的调用对象仍然有效,外层函数的参数和变量的名字和值也保留在这个调用对象里.JavaScript代码无法直接访问调用对象,但是,它定义的作为作用域链的一部分的属性仍用于嵌套函数的任何调用.(注意:如果外层函数保存了两个嵌套函数的全局引用,那么就有两个嵌套函数共享同一个调用对象,通过调用一个函数对调用对象的改变对另一个嵌套函数是可见的)</span>

<span style="font-size: x-small;">        JavaScript函数是被执行的代码和执行它们的作用域的组合.这个代码和作用域的组合在计算机科学著作中被称作:<strong>闭包(closure)</strong>.<strong>所有的JavaScript函数都是闭包</strong>.然而,这些闭包只在象上面讨论的那样时才有趣:</span><strong><span style="font-size: x-small;">当一个嵌套的函数被输出到它被定义的作用域之外.只有嵌套函数被如此使用时,才被明确的称为闭包.</span></strong>

<span style="font-size: x-small;">        闭包是有趣并且功能强大的技术.尽管它们不会被普通的使用在日常JavaScript编程中,它仍然值得我们去理解.如果你理解闭包,你理解作用域链和函数调用对象,那么,你才能真正的称自己为高级JavaScript程序员(JSer :) ).</span>

<span style="font-size: x-small;"><strong>8.8.4.1. 闭包的例子(Closure examples)</strong>
        有时,你会想写一个函数,希望它能跨调用保存一个值.这个值不能保存在局部变量里,因为调用对象不会跨调用存在.全局变量是可以的,但是它会破坏全局命名空间.在8.6.3.章节中,我展现了一个名为uniqueInteger()的函数,它用一个属性保存这个恒久的值.你可以用闭包更进一步实现,创建一个恒久的私有的变量.下面是不用闭包写的一个函数:</span>
<div style="padding-right: 5px; padding-left: 4px; font-size: 13px; padding-bottom: 4px; width: 98%; padding-top: 4px; background-color: #eeeeee; border: #cccccc 1px solid;"><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" alt="" align="top" /> <span style="COLOR: #008000">//</span> <span style="COLOR: #008000"> 每次调用返回一个不同的整数</span> <span style="COLOR: #008000">
<img id="Codehighlighter1_39_130_Open_Image" onclick="this.style.display='none'; Codehighlighter1_39_130_Open_Text.style.display='none'; Codehighlighter1_39_130_Closed_Image.style.display='inline'; Codehighlighter1_39_130_Closed_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockStart.gif" alt="" align="top" /> <img id="Codehighlighter1_39_130_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_39_130_Closed_Text.style.display='none'; Codehighlighter1_39_130_Open_Image.style.display='inline'; Codehighlighter1_39_130_Open_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedBlock.gif" alt="" align="top" /> </span><span style="COLOR: #000000">uniqueID </span> <span style="COLOR: #000000">=</span> <span style="COLOR: #000000"> </span> <span style="COLOR: #0000ff">function</span> <span style="COLOR: #000000">() </span> <span id="Codehighlighter1_39_130_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif" alt="" /> </span><span id="Codehighlighter1_39_130_Open_Text"><span style="COLOR: #000000">{
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" alt="" align="top" />    </span> <span style="COLOR: #0000ff">if</span> <span style="COLOR: #000000"> (</span> <span style="COLOR: #000000">!</span> <span style="COLOR: #000000">arguments.callee.id) arguments.callee.id </span> <span style="COLOR: #000000">=</span> <span style="COLOR: #000000"> </span> <span style="COLOR: #000000">0</span> <span style="COLOR: #000000">;
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" alt="" align="top" />    </span> <span style="COLOR: #0000ff">return</span> <span style="COLOR: #000000"> arguments.callee.id</span> <span style="COLOR: #000000">++</span> <span style="COLOR: #000000">;
<img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockEnd.gif" alt="" align="top" />}</span> </span><span style="COLOR: #000000">;</span></div>
<span style="font-size: x-small;">        这种方法的问题在于任何人都能设置这个uniqueID.id为0,而破坏了该函数不能返回同一个值两次的约定.你可以通过保存这个恒久值到一个只有你自己的函数有权访问的闭包里的方法来防止别人设置:</span>
<div style="padding-right: 5px; padding-left: 4px; font-size: 13px; padding-bottom: 4px; width: 98%; padding-top: 4px; background-color: #eeeeee; border: #cccccc 1px solid;"><img id="Codehighlighter1_23_195_Open_Image" onclick="this.style.display='none'; Codehighlighter1_23_195_Open_Text.style.display='none'; Codehighlighter1_23_195_Closed_Image.style.display='inline'; Codehighlighter1_23_195_Closed_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockStart.gif" alt="" align="top" /> <img id="Codehighlighter1_23_195_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_23_195_Closed_Text.style.display='none'; Codehighlighter1_23_195_Open_Image.style.display='inline'; Codehighlighter1_23_195_Open_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedBlock.gif" alt="" align="top" /> <span style="COLOR: #000000">uniqueID </span> <span style="COLOR: #000000">=</span> <span style="COLOR: #000000"> (</span> <span style="COLOR: #0000ff">function</span> <span style="COLOR: #000000">() </span> <span id="Codehighlighter1_23_195_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif" alt="" /> </span><span id="Codehighlighter1_23_195_Open_Text"><span style="COLOR: #000000">{  </span> <span style="COLOR: #008000">//</span> <span style="COLOR: #008000"> 这个函数的调用对象保存值</span> <span style="COLOR: #008000">
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" alt="" align="top" /> </span><span style="COLOR: #000000">    </span> <span style="COLOR: #0000ff">var</span> <span style="COLOR: #000000"> id </span> <span style="COLOR: #000000">=</span> <span style="COLOR: #000000"> </span> <span style="COLOR: #000000">0</span> <span style="COLOR: #000000">;           </span> <span style="COLOR: #008000">//</span> <span style="COLOR: #008000"> 这是私有恒久的那个值</span> <span style="COLOR: #008000">
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" alt="" align="top" /> </span><span style="COLOR: #000000">    </span> <span style="COLOR: #008000">//</span> <span style="COLOR: #008000"> 外层函数返回一个有权访问恒久值的嵌套的函数</span> <span style="COLOR: #008000">
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" alt="" align="top" /> </span><span style="COLOR: #000000">    </span> <span style="COLOR: #008000">//</span> <span style="COLOR: #008000"> 那就是我们保存在变量uniqueID里的嵌套函数.</span> <span style="COLOR: #008000">
<img id="Codehighlighter1_166_181_Open_Image" onclick="this.style.display='none'; Codehighlighter1_166_181_Open_Text.style.display='none'; Codehighlighter1_166_181_Closed_Image.style.display='inline'; Codehighlighter1_166_181_Closed_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif" alt="" align="top" /> <img id="Codehighlighter1_166_181_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_166_181_Closed_Text.style.display='none'; Codehighlighter1_166_181_Open_Image.style.display='inline'; Codehighlighter1_166_181_Open_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif" alt="" align="top" /> </span><span style="COLOR: #000000">    </span> <span style="COLOR: #0000ff">return</span> <span style="COLOR: #000000"> </span> <span style="COLOR: #0000ff">function</span> <span style="COLOR: #000000">() </span> <span id="Codehighlighter1_166_181_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif" alt="" /> </span><span id="Codehighlighter1_166_181_Open_Text"><span style="COLOR: #000000">{ </span> <span style="COLOR: #0000ff">return</span> <span style="COLOR: #000000"> id</span> <span style="COLOR: #000000">++</span> <span style="COLOR: #000000">; }</span> </span><span style="COLOR: #000000">;  </span> <span style="COLOR: #008000">//</span> <span style="COLOR: #008000"> 返回,自加.</span> <span style="COLOR: #008000">
<img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockEnd.gif" alt="" align="top" /> </span><span style="COLOR: #000000">}</span> </span><span style="COLOR: #000000">)(); </span> <span style="COLOR: #008000">//</span> <span style="COLOR: #008000"> 在定义后调用外层函数.</span></div>
<span style="font-size: x-small;">        例子8-6是第二个闭包的例子.它示范的是像第一个一样的私有恒久变量,但是这个能被多个函数共享.</span>

<span style="font-size: x-small;">        Example 8-6. Private properties with closures</span>
<div style="padding-right: 5px; padding-left: 4px; font-size: 13px; padding-bottom: 4px; width: 98%; padding-top: 4px; background-color: #eeeeee; border: #cccccc 1px solid;"><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" alt="" align="top" /> <span style="COLOR: #008000">//</span> <span style="COLOR: #008000"> 这个函数为对象o的指定名称的属性添加了访问方法</span> <span style="COLOR: #008000">
<img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" alt="" align="top" />//</span> <span style="COLOR: #008000"> 方法名为:get&#60;name&#62;和set&#60;name&#62;.</span> <span style="COLOR: #008000">
<img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" alt="" align="top" />//</span> <span style="COLOR: #008000"> 如果提供了一个判断函数,setter方法将在保存前判断参数是不是有效的</span> <span style="COLOR: #008000">
<img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" alt="" align="top" />//</span> <span style="COLOR: #008000"> 如果检验失败,setter方法抛出一个异常</span> <span style="COLOR: #008000">
<img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" alt="" align="top" />//</span> <span style="COLOR: #008000"> 这个函数的与众不同之处在于,用getter和setter方法操作的属性值并不是存储在对象o里面,</span> <span style="COLOR: #008000">
<img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" alt="" align="top" />//</span> <span style="COLOR: #008000"> 相反的,值被存储在函数的局部变量里.</span> <span style="COLOR: #008000">
<img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" alt="" align="top" />//</span> <span style="COLOR: #008000"> getter和setter方法也被定义为函数的局部方法,因此有权访问这个局部变量.</span> <span style="COLOR: #008000">
<img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" alt="" align="top" />//</span> <span style="COLOR: #008000"> 注意:对于两个访问方法,该值是私有的,除了setter方法,无法修改或设置它.</span> <span style="COLOR: #008000">
<img id="Codehighlighter1_324_656_Open_Image" onclick="this.style.display='none'; Codehighlighter1_324_656_Open_Text.style.display='none'; Codehighlighter1_324_656_Closed_Image.style.display='inline'; Codehighlighter1_324_656_Closed_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockStart.gif" alt="" align="top" /> <img id="Codehighlighter1_324_656_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_324_656_Closed_Text.style.display='none'; Codehighlighter1_324_656_Open_Image.style.display='inline'; Codehighlighter1_324_656_Open_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedBlock.gif" alt="" align="top" /> </span><span style="COLOR: #0000ff">function</span> <span style="COLOR: #000000"> makeProperty(o, name, predicate) </span> <span id="Codehighlighter1_324_656_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif" alt="" /> </span><span id="Codehighlighter1_324_656_Open_Text"><span style="COLOR: #000000">{
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" alt="" align="top" />    </span> <span style="COLOR: #0000ff">var</span> <span style="COLOR: #000000"> value;  </span> <span style="COLOR: #008000">//</span> <span style="COLOR: #008000"> This is the property value</span> <span style="COLOR: #008000">
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" alt="" align="top" /> </span><span style="COLOR: #000000">
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" alt="" align="top" />    </span> <span style="COLOR: #008000">//</span> <span style="COLOR: #008000"> getter方法只是简单的返回值.</span> <span style="COLOR: #008000">
<img id="Codehighlighter1_431_447_Open_Image" onclick="this.style.display='none'; Codehighlighter1_431_447_Open_Text.style.display='none'; Codehighlighter1_431_447_Closed_Image.style.display='inline'; Codehighlighter1_431_447_Closed_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif" alt="" align="top" /> <img id="Codehighlighter1_431_447_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_431_447_Closed_Text.style.display='none'; Codehighlighter1_431_447_Open_Image.style.display='inline'; Codehighlighter1_431_447_Open_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif" alt="" align="top" /> </span><span style="COLOR: #000000">    o[</span> <span style="COLOR: #000000">"</span> <span style="COLOR: #000000">get</span> <span style="COLOR: #000000">"</span> <span style="COLOR: #000000"> </span> <span style="COLOR: #000000">+</span> <span style="COLOR: #000000"> name] </span> <span style="COLOR: #000000">=</span> <span style="COLOR: #000000"> </span> <span style="COLOR: #0000ff">function</span> <span style="COLOR: #000000">() </span> <span id="Codehighlighter1_431_447_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif" alt="" /> </span><span id="Codehighlighter1_431_447_Open_Text"><span style="COLOR: #000000">{ </span> <span style="COLOR: #0000ff">return</span> <span style="COLOR: #000000"> value; }</span> </span><span style="COLOR: #000000">;
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" alt="" align="top" />
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" alt="" align="top" />    </span> <span style="COLOR: #008000">//</span> <span style="COLOR: #008000"> setter保存值,如果校验失败则抛出异常</span> <span style="COLOR: #008000">
<img id="Codehighlighter1_514_653_Open_Image" onclick="this.style.display='none'; Codehighlighter1_514_653_Open_Text.style.display='none'; Codehighlighter1_514_653_Closed_Image.style.display='inline'; Codehighlighter1_514_653_Closed_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif" alt="" align="top" /> <img id="Codehighlighter1_514_653_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_514_653_Closed_Text.style.display='none'; Codehighlighter1_514_653_Open_Image.style.display='inline'; Codehighlighter1_514_653_Open_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif" alt="" align="top" /> </span><span style="COLOR: #000000">    o[</span> <span style="COLOR: #000000">"</span> <span style="COLOR: #000000">set</span> <span style="COLOR: #000000">"</span> <span style="COLOR: #000000"> </span> <span style="COLOR: #000000">+</span> <span style="COLOR: #000000"> name] </span> <span style="COLOR: #000000">=</span> <span style="COLOR: #000000"> </span> <span style="COLOR: #0000ff">function</span> <span style="COLOR: #000000">(v) </span> <span id="Codehighlighter1_514_653_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif" alt="" /> </span><span id="Codehighlighter1_514_653_Open_Text"><span style="COLOR: #000000">{
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" alt="" align="top" />        </span> <span style="COLOR: #0000ff">if</span> <span style="COLOR: #000000"> (predicate </span> <span style="COLOR: #000000">&#38;&#38;</span> <span style="COLOR: #000000"> </span> <span style="COLOR: #000000">!</span> <span style="COLOR: #000000">predicate(v))
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" alt="" align="top" />            </span> <span style="COLOR: #0000ff">throw</span> <span style="COLOR: #000000"> </span> <span style="COLOR: #000000">"</span> <span style="COLOR: #000000">set</span> <span style="COLOR: #000000">"</span> <span style="COLOR: #000000"> </span> <span style="COLOR: #000000">+</span> <span style="COLOR: #000000"> name </span> <span style="COLOR: #000000">+</span> <span style="COLOR: #000000"> </span> <span style="COLOR: #000000">"</span> <span style="COLOR: #000000">: invalid value </span> <span style="COLOR: #000000">"</span> <span style="COLOR: #000000"> </span> <span style="COLOR: #000000">+</span> <span style="COLOR: #000000"> v;
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" alt="" align="top" />        </span> <span style="COLOR: #0000ff">else</span> <span style="COLOR: #000000">
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" alt="" align="top" />            value </span> <span style="COLOR: #000000">=</span> <span style="COLOR: #000000"> v;
<img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" alt="" align="top" />    }</span> </span><span style="COLOR: #000000">;
<img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockEnd.gif" alt="" align="top" />}</span> </span><span style="COLOR: #000000">
<img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" alt="" align="top" />
<img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" alt="" align="top" /> </span><span style="COLOR: #008000">//</span> <span style="COLOR: #008000"> 下面的代码演示makeProperty() 方法.</span> <span style="COLOR: #008000">
<img id="Codehighlighter1_696_697_Open_Image" onclick="this.style.display='none'; Codehighlighter1_696_697_Open_Text.style.display='none'; Codehighlighter1_696_697_Closed_Image.style.display='inline'; Codehighlighter1_696_697_Closed_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockStart.gif" alt="" align="top" /> <img id="Codehighlighter1_696_697_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_696_697_Closed_Text.style.display='none'; Codehighlighter1_696_697_Open_Image.style.display='inline'; Codehighlighter1_696_697_Open_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedBlock.gif" alt="" align="top" /> </span><span style="COLOR: #0000ff">var</span> <span style="COLOR: #000000"> o </span> <span style="COLOR: #000000">=</span> <span style="COLOR: #000000"> </span> <span id="Codehighlighter1_696_697_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif" alt="" /> </span><span id="Codehighlighter1_696_697_Open_Text"><span style="COLOR: #000000">{}</span> </span><span style="COLOR: #000000">;  </span> <span style="COLOR: #008000">//</span> <span style="COLOR: #008000"> 这是一个空对象</span> <span style="COLOR: #008000">
<img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" alt="" align="top" /> </span><span style="COLOR: #000000">
<img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" alt="" align="top" /> </span><span style="COLOR: #008000">//</span> <span style="COLOR: #008000"> 添加属性访问方法getName() 和 setName()</span> <span style="COLOR: #008000">
<img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" alt="" align="top" />//</span> <span style="COLOR: #008000"> 确保只允许字符串值</span> <span style="COLOR: #008000">
<img id="Codehighlighter1_795_826_Open_Image" onclick="this.style.display='none'; Codehighlighter1_795_826_Open_Text.style.display='none'; Codehighlighter1_795_826_Closed_Image.style.display='inline'; Codehighlighter1_795_826_Closed_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockStart.gif" alt="" align="top" /> <img id="Codehighlighter1_795_826_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_795_826_Closed_Text.style.display='none'; Codehighlighter1_795_826_Open_Image.style.display='inline'; Codehighlighter1_795_826_Open_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedBlock.gif" alt="" align="top" /> </span><span style="COLOR: #000000">makeProperty(o, </span> <span style="COLOR: #000000">"</span> <span style="COLOR: #000000">Name</span> <span style="COLOR: #000000">"</span> <span style="COLOR: #000000">, </span> <span style="COLOR: #0000ff">function</span> <span style="COLOR: #000000">(x) </span> <span id="Codehighlighter1_795_826_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif" alt="" /> </span><span id="Codehighlighter1_795_826_Open_Text"><span style="COLOR: #000000">{ </span> <span style="COLOR: #0000ff">return</span> <span style="COLOR: #000000"> </span> <span style="COLOR: #0000ff">typeof</span> <span style="COLOR: #000000"> x </span> <span style="COLOR: #000000">==</span> <span style="COLOR: #000000"> </span> <span style="COLOR: #000000">"</span> <span style="COLOR: #000000">string</span> <span style="COLOR: #000000">"</span> <span style="COLOR: #000000">; }</span> </span><span style="COLOR: #000000">);
<img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" alt="" align="top" />
<img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" alt="" align="top" />o.setName(</span> <span style="COLOR: #000000">"</span> <span style="COLOR: #000000">Frank</span> <span style="COLOR: #000000">"</span> <span style="COLOR: #000000">);  </span> <span style="COLOR: #008000">//</span> <span style="COLOR: #008000"> 设置属性值</span> <span style="COLOR: #008000">
<img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" alt="" align="top" /> </span><span style="COLOR: #000000">print(o.getName());  </span> <span style="COLOR: #008000">//</span> <span style="COLOR: #008000"> 获得属性值</span> <span style="COLOR: #008000">
<img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" alt="" align="top" /> </span><span style="COLOR: #000000">o.setName(</span> <span style="COLOR: #000000">0</span> <span style="COLOR: #000000">);        </span> <span style="COLOR: #008000">//</span> <span style="COLOR: #008000"> 试图设置错误类型的值</span></div>
<span style="font-size: x-small;">        我知道的最简单最有用的使用闭包的例子是Steve Yen创建的断点程序,它发布在 http://trimpath.com</span><span style="color: #3468a4;"> </span><span style="font-size: x-small;">,是TrimPath客户端框架的一部分.断点是函数内的一个点,代码执行到该点停止,给程序员检查变量,表达式,调用函数等的值的机会.Steve的断点技术用闭包捕捉函数的当前作用域(包括局部变量和函数参数),用全局的eval()函数组合这些就可以检查作用域了.eval()函数计算JavaScript代码字符串并返回结果.下面是一个以自检闭包方式工作的嵌套函数.</span>
<span style="font-size: x-small;">// 捕捉当前作用域,可以用eval()检查
var inspector = function($) { return eval($); }</span>

<span style="font-size: x-small;">        这个函数用了很少见的标识符$作为参数名,这样可以减少在计划检查的作用域内命名冲突的可能性.</span>

<span style="font-size: x-small;">        (接下来部分代码与所述内容无关,译略)</span>

<span style="font-size: x-small;"><strong>8.8.4.2. <a href="http://www.v-ec.com/dh20156/article.asp?id=207" target="_blank">闭包和IE中的内存泄露(Closures and memory leaks in Internet Explorer)</a></strong>
        MS的IE浏览器在ActiveX对象和客户端DOM元素的GC方面表现较弱.客户端对象按引用计数,当引用数为0的时候释放对象.这种方法在循环引用的时候就失效了,例如,当一个核心JavaScript对象引用一个文档元素,而那个文档元素又有一个属性(比如是一个事件句柄)引用该核心JavaScript对象.</span>

<span style="font-size: x-small;">        在IE客户端编程使用闭包的时候,这种循环引用经常出现.当你使用闭包的时候,记住,封闭(enclosing)函数的调用对象,包括函数所有的参数和局部变量,都将和闭包一样"长寿".如果任何函数参数或者局部变量引用了一个客户端对象,就会发生内存泄露.</span>

<span style="font-size: x-small;">        关于这个问题的完整讨论超出本书范围,详情请参见: 
</span>

<a href="http://msdn.microsoft.com/library/en-us/IETechCol/dnwebgen/ie_leak_patterns.asp" target="_blank"><span style="color: #3468a4;">http://msdn.microsoft.com/library/en-us/IETechCol/dnwebgen/ie_leak_patterns.asp</span></a>

本文出处:JavaScript - the definitive guide,5th edition
译: 梅雪香
时间:2006-10-29]]></description>
		<wfw:commentRss>http://www.wumain.com/php/blog/archives/125/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Javascript事件设计模式</title>
		<link>http://www.wumain.com/php/blog/archives/122</link>
		<comments>http://www.wumain.com/php/blog/archives/122#comments</comments>
		<pubDate>Fri, 06 Nov 2009 05:31:53 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[js]]></category>
		<category><![CDATA[事件设计模式]]></category>
		<category><![CDATA[设计模式]]></category>

		<guid isPermaLink="false">http://www.wumain.com/php/blog/?p=122</guid>
		<description><![CDATA[事件设计概述
事件机制可以使程序逻辑更加符合现实世界，在JavaScript中很多对象都有自己的事件，例如按钮就有onclick事件，下拉列表框就有onchange事件，通过这些事件可以方便编程。那么对于自己定义的类，是否也可以实现事件机制呢？是的，通过事件机制，可以将类设计为独立的模块，通过事件对外通信，提高了程序的开发效率。本节就将详细介绍JavaScript中的事件设计模式以及可能遇到的问题。

最简单的事件设计模式
最简单的一种模式是将一个类的方法成员定义为事件，这不需要任何特殊的语法，通常是一个空方法，例如：
function class1(){
//构造函数
}
class1.prototype={
show:function(){
//show函数的实现
this.onShow(); //触发onShow事件
},
onShow:function(){} //定义事件接口
}
上面的代码中，就定义了一个方法：show()，同时该方法中调用了onShow()方法，这个onShow()方法就是对外提供的事件接口，其用法如下：
//创建class1的实例
var obj=new class1();
//创建obj的onShow事件处理程序
obj.onShow=function(){
alert("onshow event");
}
//调用obj的show方法
obj.show();

由此可见，obj.onShow方法在类的外部被定义，而在类的内部方法show()中被调用，这就实现了事件机制。
上述方法很简单，实际的开发中常用来解决一些简单的事件功能。说它简单，因为它有以下两个缺点：
? 不能够给事件处理程序传递参数，因为是在show()这个内部方法中调用事件处理程序的，无法知道外部的参数；
? 每个事件接口仅能够绑定一个事件处理程序，而内部方法则可以使用attachEvent或者addEventListener方法绑定多个处理程序。
在下面两小节将着重解决这个问题。

给事件处理程序传递参数
给事件处理程序传递参数不仅是自定义事件中存在的问题，也是系统内部对象的事件机制中存在的问题，因为事件机制仅传递一个函数的名称，不带有任何参数的信息，所以无法传递参数进去。例如：
//定义类class1
function class1(){
//构造函数
}
class1.prototype={
show:function(){
//show函数的实现
this.onShow(); //触发onShow事件
},
onShow:function(){} //定义事件接口
}
//创建class1的实例
var obj=new class1();
//创建obj的onShow事件处理程序
function objOnShow(userName){
alert("hello,"+userName);
}
//定义变量userName
var userName="jack";
//绑定obj的onShow事件
obj.onShow=objOnShow; //无法将userName这个变量传递进去
//调用obj的show方法
obj.show();
注意上面的obj.onShow=objOnShow事件绑定语句，不能为了传递userName变量进去而写成：
obj.onShow=objOnShow(userName);
或者：
obj.onShow="objOnShow(userName)";
前者是将objOnShow(userName)的运行结果赋给了obj.onShow，而后者是将字符串“objOnShow(userName)”赋给了obj.onShow。
要解决这个问题，可以从相反的思路去考虑，不考虑怎么把参数传进去，而是考虑如何构建一个无需参数的事件处理程序，该程序是根据有参数的事件处理程序创建的，是一个外层的封装。现在自定义一个通用的函数来实现这种功能：
//将有参数的函数封装为无参数的函数
function createFunction(obj,strFunc){
var args=[]; //定义args用于存储传递给事件处理程序的参数
if(!obj)obj=window; //如果是全局函数则obj=window;
//得到传递给事件处理程序的参数
for(var i=2;i&#60;arguments.length;i++)args.push(arguments[i]);
//用无参数函数封装事件处理程序的调用
return function(){
obj[strFunc].apply(obj,args); //将参数传递给指定的事件处理程序
}
}
该方法将一个有参数的函数封装为一个无参数的函数，不仅对全局函数适用，作为对象方法存在的函数同样适用。该方法首先接收两个参数：obj和strFunc，obj表示事件处理程序所在的对象；strFunc表示事件处理程序的名称。除此以外，程序中还利用arguments对象处理第二个参数以后的隐式参数，即未定义形参的参数，并在调用事件处理程序时将这些参数传递进去。例如一个事件处理程序是：
someObject.eventHandler=function(_arg1,_arg2){
//事件处理代码
}
应该调用：
createFunction(someObject,"eventHandler",arg1,arg2);
这就返回一个无参数的函数，在返回的函数中已经包括了传递进去的参数。如果是全局函数作为事件处理程序，事实上它是window对象的一个方法，所以可以传递window对象作为obj参数，为了更清晰一点，也可以指定obj为null，createFunction函数内部会自动认为该函数是全局函数，从而自动把obj赋值为window。下面来看应用的例子：
&#60;script language="JavaScript" type="text/javascript"&#62;
&#60;!--
//将有参数的函数封装为无参数的函数
function createFunction(obj,strFunc){
var args=[];
if(!obj)obj=window;
for(var i=2;i&#60;arguments.length;i++)args.push(arguments[i]);
return function(){
obj[strFunc].apply(obj,args);
}
}
//定义类class1
function class1(){
//构造函数
}
class1.prototype={
show:function(){
//show函数的实现
this.onShow(); //触发onShow事件
},
onShow:function(){} //定义事件接口
}
//创建class1的实例
var obj=new class1();
//创建obj的onShow事件处理程序
function objOnShow(userName){
alert("hello,"+userName);
}
//定义变量userName
var userName="jack";
//绑定obj的onShow事件
obj.onShow=createFunction(null,"objOnShow",userName);
//调用obj的show方法
obj.show();
//--&#62;
&#60;/script&#62;
在这段代码中，就将变量userName作为参数传递给了objOnShow事件处理程序。事实上，obj.onShow得到的事件处理程序并不是objOnShow，而是由createFunction返回的一个无参函数。
通过createFunction封装，就可以用一种通用的方案实现参数传递了。这不仅适用于自定义的事件，也适用于系统提供的事件，其原理是完全相同的。

使自定义事件支持多绑定
可以用attachEvent或者addEventListener方法来实现多个事件处理程序的同时绑定，不会互相冲突，而自定义事件怎样来实现多订阅呢？下面介绍这种实现。要实现多订阅，必定需要一个机制用于存储绑定的多个事件处理程序，在事件发生时同时调用这些事件处理程序。从而达到多订阅的效果，其实现如下：
&#60;script language="JavaScript" type="text/javascript"&#62;
&#60;!--
//定义类class1
function class1(){
//构造函数
}
//定义类成员
class1.prototype={
show:function(){
//show的代码
//...

//如果有事件绑定则循环onshow数组，触发该事件
if(this.onshow){
for(var i=0;i&#60;this.onshow.length;i++){
this.onshow[i](); //调用事件处理程序
}
}
},
attachOnShow:function(_eHandler){
if(!this.onshow)this.onshow=[]; //用数组存储绑定的事件处理程序引用
this.onshow.push(_eHandler);
}
}
var obj=new class1();
//事件处理程序1
function onShow1(){
alert(1);
}
//事件处理程序2
function onShow2(){
alert(2);
}
//绑定两个事件处理程序
obj.attachOnShow(onShow1);
obj.attachOnShow(onShow2);
//调用show，触发onshow事件
obj.show();
//--&#62;
&#60;/script&#62;
从代码的执行结果可以看到，绑定的两个事件处理程序都得到了正确的运行。如果要绑定有参数的事件处理程序，只需加上createFunction方法即可，在上一节有过描述。
这种机制基本上说明了处理多事件处理程序的基本思想，但还有改进的余地。例如如果类有多个事件，可以定义一个类似于attachEvent的方法，用于统一处理事件绑定。在添加了事件绑定后如果想删除，还可以定义一个detachEvent方法用于取消绑定。这些实现的基本思想都是对数组的操作。

原文地址：<a href="http://blog.sqlsky.net/article.asp?id=101" target="_blank">http://blog.sqlsky.net/article.asp?id=101</a>]]></description>
		<wfw:commentRss>http://www.wumain.com/php/blog/archives/122/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>javascript 闭包</title>
		<link>http://www.wumain.com/php/blog/archives/119</link>
		<comments>http://www.wumain.com/php/blog/archives/119#comments</comments>
		<pubDate>Fri, 06 Nov 2009 05:29:49 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[js]]></category>
		<category><![CDATA[闭包]]></category>

		<guid isPermaLink="false">http://www.wumain.com/php/blog/?p=119</guid>
		<description><![CDATA[写在前面的话：
试图翻译自 http://jibbering.com/faq/faq_notes/closures.html
文中大量提到《ECMA 262 》，我也没时间读这东西，可能有问题理解有误。希望纠正。
只译了前边部分，我得理解几天再继续下去。
英文水平差，凑合看吧。
国内找了半天没这篇文章中文版，献丑了就。
读后有种豁然开朗的感觉，清楚了很多javascript的问题。

一、Introduction
<h2>
Closure (闭包)</h2>
A "<strong>closure</strong>" is an expression (typically a function) that can have free variables together with an environment that binds those variables (that "closes" the expression).

<strong>闭包是ECMAScript(javascript)语言强大的特征之一</strong>，如果没有真正的理解它的概念，不可能很好使用它。在一般浏览器环境中，它们很容易被建立，但也会造成比较难理解的代码逻辑。为了避免<strong>闭包</strong>引起的缺点，利用它所提供的优点，明白它的机制是重要的。<strong>javascript语言的闭包</strong>很大程度上依靠 <strong>scope chains(函数，变量的范围链) </strong>和 <strong>javascript对象</strong>的灵活的属性机制 实现。

<strong>闭包简单的解释</strong>是，ECMAScript允许<strong>inner functions(嵌套函数)</strong>：函数可以定义在另外一个函数里面（关于嵌套函数可以看看）。这些内部的函数可以访问<strong>outer function（父函数）</strong>的local变量，参数，其它内部函数。当内部函数被构造，并可以在函数外被获得（函数当成返回值），这个内部函数被在 outer function返回后被执行（在outer函数外执行），那一个<strong>闭包形成</strong>了。（简单的理解，function被当成数据类型传递或动态执行）。 inner function还有权利访问 那些outer function（父函数）的local变量，参数，其它内部函数。那些outer function（父函数）的local变量，参数，其它内部函数在outer function返回前就有值，并返回的inner function需要改变这些值。

我估计以下代码就是一个<strong>闭包</strong>。

&#60; script &#62;
var g_count = 0 ;
function aaa(p) { // outer function
var outer_count = 0 ;
function innerfun(name,count) { // outer function中定义的另外一个inner function
return name + ' : ' + count + ' 次; ' ;
}
return function() { // 返回一个匿名的inner函数
var inner_count = 0 ;
return innerfun( ' g_count ' ,( ++ g_count)) + innerfun( ' outer_count ' ,( ++ outer_count))+innerfun('inner_count',(++inner_count))+p;
}
}

var fun1=aaa("fun1");
var fun2=aaa("fun2");
alert(fun1)
alert(fun1());//这时候才真正执行
alert(fun2());

不幸的，<a href="http://www.v-ec.com/dh20156/article.asp?id=87" target="_blank"><strong>完全深入理解闭包</strong></a>需要知道它背后的机制和一些技术细节。
二、The Resolution of Property Names on Objects (javascript对象的属性)
ECMAScript认可两类对象，“<strong>Native Object</strong>”和“<strong>Host Object</strong>”,Host Object属于Native Object的子类，在(ECMA 262 3rd Ed Section 4.3)中叫"<strong>Built-in Object</strong>"（<strong>内置对象</strong>）。Native objects属于语言级别，host objects被环境提供（浏览器等），例如，document objects,DOM nodes等。
关于对象属性的存取，<strong>数据类型</strong>，<a href="http://www.v-ec.com/dh20156/article.asp?id=157" target="_blank"><strong>原型对象prototype</strong></a>的使用，我这就不译了。
可以参见我的另一篇文章

三、Identifier Resolution, Execution Contexts and <a href="http://www.v-ec.com/dh20156/article.asp?id=160" target="_blank"><strong>Scope Chains</strong></a>

1、The Execution Context

执行环境上下文（Execution Context）是个抽象的概念，the ECMSScript specification (ECMA 262 3rd edition) to define the behaviour required of ECMAScript implementations。规范没有说 execution contexts 应该怎样实现，但规范中提到execution contexts是个关联属性结构，因此你可以假想为一个有属性的对象，但不是公有的（public）。

所有的javascript代码在一个execution context中执行。Global代码(.js文件中)在我叫做globla execution context中执行，每个函数的调用有个专属的execution context。注意，用eval函数执行的代码有个独特的execution context.(原文中说eval函数没常被程序员应用，确实如果掌握闭包使用后，还是可以避免一些eval使用的)。在section 10.2 of ECMA 262 (3rd edition)中详细讲述的execution context.

当一个函数被调用，那相应的execution context被建立，如果另外的函数（或同一个函数递归调用），那新的execution context被建立，直到函数return(对于递归调用，execution context是独立的)。因此，javascript代码的执行会建立很多的execution contexts.
当一个函数的execution context被建立(javascript中有global和function两种，eval没讨论)，按照顺序，有几个事情要发生。

（1）在一个函数的execution context中，一个"Activation"对象被建立（我在其它文章中叫调用对象）。the activation被另外规范解释。你可以把它当成一个对象，因为它有对象的属性，但它不是一般对象，它没有原型对象，并不能被javascript代码直接引用。

（2）建立一个arguments对象，它和数组类似，以整数为索引来访问值，表示函数的参数。它有length和callee属性。这个arguments对象被当成activation对象的属性。在函数内可以直接访问得到。

（3）下一步，execution context被分配一个 scope属性（scope chain后面讲到，我们可以把scope理解成对象的一个scope属性，值是scope chain）。一个scope由一列对象组成（或叫chain）。每个函数对象也有由chain组成的scope属性。函数的scope＝ Activation object+上级对象的scope的属性.（这里的scope可以理解成servlet中的chain,一系列请求组成的链。）

（4）Activation object的实例化。Activation object(调用对象)可以看作Variable(变量)。
function fun(a,b){};fun('p'); a和b会当成调用对象的属性，但函数调用是参数不够，b的值为undefined。如果函数内有inner function，当成属性赋值给调用对象。变量实例化最后把local variables（函数内部声名的变量）当成调用对象的参数。调用对象的属性 包括函数的参数、内部变量。

（5）在函数内，local variables作为调用对象的属性出现，function (a){alert(s); var s='a';}调用时，s的值是unidefine,直到执行到赋值语句后才有值。

（6）arguments属性是以索引标识的参数，它和显示声明的参数是重复的，值也相同。如果local变量的签名和参数相同，那么它们三者一个变化，其它都会相应改变值。见下例
function a(p){alert( arguments [0]);alert(p);var p=1;alert(p);alert( arguments [0]);};a(0);

（7）最后，为this关键字设置值。可能 new Function()的有些疑问。关于this关键字，感觉自己还没有彻底理解。this关键字关联于执行时的作用域，而非定义时的作用域。(The this keyword is relative to the execution context, not the declaration context )

global execution context 的过程和上面有些不同，它没有arguments也不需要定义Activation object。global execution context也不需要scope chain,因为scope chain只有一个，就是global object.它的变量实例化过程和inner function其实都是根变量和函数,就是global对象的属性。global execution context用this应用global对象，在浏览器中为window.

2、<a href="http://www.v-ec.com/dh20156/article.asp?id=161" target="_blank">Scope chains and [[scope]] </a>

The scope chain of the execution context for a function call is constructed by adding the execution context's Activation/Variable object to the front of the scope chain held in the function object's [[scope]] property。我理解每个函数执行环境都有scope chain，子函数(inner function)的scope chain包括它的父函数的scope chain，如此递归对global对象。
在ECMAScript中，函数是个对象，它们可以用function声明，或function表达式声明，或Function构造函数初始化。

用Function构造的函数对象一直有个scope属性,指向的scope chain 仅包括 global 对象。

用function表达式定义的函数对象，这类函数对象的scope chain被分配到内部的scope 属性。

（1）简单的global函数，例如:-
function exampleFunction(formalParameter){
... // function body code
}

在global execution context的变量实例化阶段，the corresponding function object 被创建。global execution context有scope chain，只包含global object.因此，函数对象被分配一个指向global object的 scope属性（ internal [[scope]] property）。

（2）A similar scope chain is assigned when a function expression is executed in the global context:-

var exampleFuncRef = function(){
... // function body code
}

这个例子scope chain情形与上类似。有个区别是函数对象在代码执行过程才创建。（见我以前文章）

（3）inner 函数的情形较为复杂，看下面代码：

function exampleOuterFunction(formalParameter){
function exampleInnerFuncitonDec(){
... // inner function body
}
... // the rest of the outer function body.
}
exampleOuterFunction( 5 );

outer函数在global execution context变量实例化阶段被创建，因此它的scope chain只包括global object.

当global代码执行到调用exampleOuterFunction时，一个新的execution context被创建，(Activation)调用对象也被创建。这个新的execution context的scope chain由两部分组成，新的调用对象在顶层，outer函数scope chain（只包括global object）在后。新的execution context的变量实例化阶段（outer 函数体内）导致inner函数对象被创建，这个inner函数对象的[[scope]] property 被指向上述的哪个scope chain,也就是调用对象和global object.注意inner function也有调用对象。

引用了 http://wj.cnblogs.com/archive/2006/04/22/381851.html 回复内的代码

以上所有过程自动进行，代码不需要任何设置（造成很多人不知道闭包原因）。

<a href="http://www.v-ec.com/dh20156/article.asp?id=156" target="_blank">scope chain</a> 简单看来可以按照下面的代码来描述：

函数体外Execution context 的scope chain 只有 global.
function fun(){
函数体内Execution context 的scope chain fun的调用对象+global
function innerfun(){
inner函数体内Execution context 的scope chain innerfun的调用对象 + fun的调用对象 + global
}

}

但是ECMAScript提供的with表达式会修改scope chain.with表达式，我是能不用就不用了，中也说with会造成性能的集聚下降。原文贴在下面。有时间再仔细研究。

The with statement evaluates an expression and if that expression is an object it is added to the scope chain of the current execution context (in front of the Activation/Variable object). The with statement then executes another statement (that may itself be a block statement) and then restores the execution context's scope chain to what it was before.

A function declaration could not be affected by a with statement as they result in the creation of function objects during variable instantiation, but a function expression can be evaluated inside a with statement:-

/* create a global variable - y - that refers to an object:- */
var y = {x:5}; // object literal with an - x - property
function exampleFuncWith(){
var z;
/* Add the object referred to by the global variable - y - to the
front of he scope chain:-
*/
with(y){
/* evaluate a function expression to create a function object
and assign a reference to that function object to the local
variable - z - :-
*/
z = function(){
... // inner function expression body;
}
}
...
}

/* execute the - exampleFuncWith - function:- */
exampleFuncWith();
When the exampleFuncWith function is called the resulting execution context has a scope chain consisting of its Activation object followed by the global object. The execution of the with statement adds the object referred to by the global variable y to the front of that scope chain during the evaluation of the function expression. The function object created by the evaluation of the function expression is assigned a [[scope]] property that corresponds with the scope of the execution context in which it is created. A scope chain consisting of object y followed by the Activation object from the execution context of the outer function call, followed by the global object.

When the block statement associated with the with statement terminates the scope of the execution context is restored (the y object is removed), but the function object has been created at that point and its [[scope]] property assigned a reference to a scope chain with the y object at its head.

3、Identifier Resolution
关于这部分我决定不按照原文直译。Identifier Resolution是一个过程，而不是具体的概念，我举个例子可能就明白了。

其实Identifier Resolution就是属性查找的过程。 先从scope chain 的第一个对象开始找，如果找不到再从scope chain的第二个对象找， global对象始终是scope chain 的最后一个对象，如果global object中也找不到属性，那为undefined.
有两个注意点：
如果可能，这个查找过程会对对象的prototype（原型对象）查找。先找实例属性，再找原型属性。见我的其它文章。
在函数内，这个函数的调用对象包括的参数，local变量，inner函数等。

参考：
《javascript权威指南》

书接上回，继续闭包。

Closures

1、自动的垃圾回收

ECMAScript有自动的垃圾回收机制。与java类似。但是规范也没有对该机制详细定义，而是让浏览器等规范实现厂家来实现，各种浏览器实现不一样，垃圾回收的算法也不同。好象ie的实现会出现内存溢出问题。对我我们来说注意到这点就够了，后面会提到如何避免ie的这个bug.
关于上篇提到的execution context，调用对象，参数，scope chain 等等都需要内存，垃圾回收机制会在适当时候释放内存。

2、闭包如何形成

通俗的说，当一个(outer)函数的返回类型是(inner)函数类型时，这个被返回的inner函数斥又outer函数的scope chain，这时候闭包形成。 如下例：

function exampleClosureForm(arg1, arg2){
var localVar = 8;
function exampleReturned(innerArg){
return ((arg1 + arg2)/(innerArg + localVar));
}
/* return a reference to the inner function defined as -
exampleReturned -:-
*/
return exampleReturned;
}
var globalVar = exampleClosureForm(2, 4);

现在exampleClosureForm(2, 4)返回的inner函数不能被垃圾回收，因为它被变量globalVar持有，并可执行globalVar(n)。

但是内部的原理没有表面上那么简单。现在globalVar是个函数对象，它的[[scope]] property 指向一个scope chain,而这个scope chain 包括 exampleClosureForm函数的调用对象+global对象。所以垃圾回收不能回收这部分内存。

一个闭包形成了。inner函数对象有自己的变量，也可以访问exampleClosureForm函数调用过程中的参数，local变量等。

在上面的例子中，globalVar(n)执行时,在通过调用对象可以访问到exampleClosureForm(2, 4)执行过程中的参数，local变量等。arg1 = 2，arg2 = 4 ，localVar=8，这些属性都通过调用对象"ActOuter1"可以得到。

如果增加以下代码，又返回另外一个inner 函数。
var secondGlobalVar = exampleClosureForm(12, 3);
exampleClosureForm(12, 3)会引起新的调用对象创建，我们定义为ActOuter2。这个过程中，arg1 = 12，arg2 = 3 ，localVar=8。第二个闭包形成了.

下面考虑返回的inner函数执行过程。如globalVar(2)。新的execution context、调用对象（ActInner）被创建。现在的scope chain是 ActInner1-&#62;ActOuter1-&#62;global object. 函数返回是 ((2 + 4)/(2 + 8)).
如果是secondGlobalVar(5)被执行情况是什么呢？现在的scope chain是ActInner2-&#62; ActOuter2-&#62; global object.函数返回是 ((12 + 3)/(5 + 8)).

通过比较，这两个inner函数互不干扰的执行。如果嵌套更多的函数的话，与上面所诉类似。明白的javascript的闭包，从这个方面可能就能体会到它比java等慢n个数量级的原因。

3、闭包能做什么（例子）
（1）
function callLater(paramA, paramB, paramC){
return (function(){
paramA[paramB] = paramC;
});
}
var functRef = callLater(elStyle, "display", "none");
hideMenu=setTimeout(functRef, 500);
想象我们做颜色渐变，或者动画的时候吧。上面提供的函数多幽雅。
（2）
function associateObjWithEvent(obj, methodName){
return (function(e){
e = e&#124;&#124;window.event;
return obj[methodName](e, this);
});
}
function DhtmlObject(elementId){
var el = getElementWithId(elementId);
if(el){
el.onclick = associateObjWithEvent(this, "doOnClick");
el.onmouseover = associateObjWithEvent(this, "doMouseOver");
el.onmouseout = associateObjWithEvent(this, "doMouseOut");
}
}
DhtmlObject.prototype.doOnClick = function(event, element){
... // doOnClick method body.
}
DhtmlObject.prototype.doMouseOver = function(event, element){
... // doMouseOver method body.
}
DhtmlObject.prototype.doMouseOut = function(event, element){
... // doMouseOut method body.
}
......

又一种注册事件的方法。我觉得作者的这种实现可谓精妙。大大的开阔了我的思路。我们可以为我们的UI事件绑定到对象上，可以很好的重用代码。另外比起prototype.js的时间注册来说简单点。
（３）
var getImgInPositionedDivHtml = (function(){
var buffAr = [
'

'', //index 11, IMG URL
'\" width=\"',
'', //index 13, IMG width
'\" height=\"',
'', //index 15, IMG height
'\" alt=\"',
'', //index 17, IMG alt text
'\"&#62;&#60;\/div&#62;'
];
return (function(url, id, width, height, top, left, altText){
buffAr[1] = id;
buffAr[3] = top;
buffAr[5] = left;
buffAr[13] = (buffAr[7] = width);
buffAr[15] = (buffAr[9] = height);
buffAr[11] = url;
buffAr[17] = altText;
return buffAr.join('');
}); //:End of inner function expression.
})();

这种匿名函数的调用在dojo中见过，现在再看，感觉不一样。

以上是原作者的例子，我抄过来的。下次我准备深入研究一下闭包能给我们开发js类库提供什么更好的思路。感觉现在很多人对闭包了解不多，经过这段时间的思考，利用javascript中的闭包，代码偶合性会更低。<strong>不过唯一要注意的是，避免因为Javascript闭包造成循环引用而引起<a href="http://www.v-ec.com/dh20156/article.asp?id=207" target="_blank">内存泄漏</a>！</strong>]]></description>
		<wfw:commentRss>http://www.wumain.com/php/blog/archives/119/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>【10.27.09】《火炬之光（Torchlight）》[EN]</title>
		<link>http://www.wumain.com/php/blog/archives/104</link>
		<comments>http://www.wumain.com/php/blog/archives/104#comments</comments>
		<pubDate>Mon, 02 Nov 2009 03:18:48 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[心情]]></category>
		<category><![CDATA[Diablo]]></category>
		<category><![CDATA[Torchlight]]></category>
		<category><![CDATA[火炬之光]]></category>

		<guid isPermaLink="false">http://www.wumain.com/php/blog/?p=104</guid>
		<description><![CDATA[<a rel="attachment wp-att-109" href="http://www.wumain.com/php/blog/archives/104/attachment/46642014016599"><img class="aligncenter size-medium wp-image-109" title="46642014016599" src="http://www.wumain.com/php/blog/wp-content/uploads/2009/11/46642014016599-218x300.jpg" alt="46642014016599" width="218" height="300" /></a>
中文名称：火炬之光
英文名称：Torchlight
发行时间：2009年10月27日
游戏类型：动作角色扮演
游戏语言：英文
开发厂商：Runic Games
发行厂商：Perfect World Entertainment
官方网站：http://www.torchlightgame.com/
讨论专区：http://3dmgame.chnren.com/bbs/showforum-559.html

游戏介绍：

Runic Games（原暴雪北方创始人之一的Max Schaefer创办的新公司）ARPG新作《Torchlight（火炬之光）》公布了一段新预告片，看上去就像降质版的暗黑3。该作的单机版即将在10月27日上市，数字版下载售价US$19.99。而网游版预计在单机版推出18个月之后才能面市，另外早先消息报道该作全球发行权由中国完美时空获得。

配置需求：

1.8 Ghz Intel Pentium 4 or AMD Athlon processor
1 GB RAM
NVIDIA GeForce FX 5200 or higher or ATI Radeon 9500 or higher, with at least 64MB of video RAM
500MB of drive space
DirectX 9 compatible sound card

安装信息：

1. 解压缩
2. 载入镜象
3. 安装游戏
5. 运行游戏

游戏截图：

<a rel="attachment wp-att-105" href="http://www.wumain.com/php/blog/archives/104/1-2"><img class="aligncenter size-medium wp-image-105" title="1" src="http://www.wumain.com/php/blog/wp-content/uploads/2009/11/1-300x187.jpg" alt="1" width="300" height="187" /></a>

<a href="http://www.wumain.com/php/blog/archives/104/2-2" rel="attachment wp-att-106"><img src="http://www.wumain.com/php/blog/wp-content/uploads/2009/11/2-300x183.jpg" alt="2" title="2" width="300" height="183" class="aligncenter size-medium wp-image-106" /></a>

<a href="http://www.wumain.com/php/blog/archives/104/3-2" rel="attachment wp-att-107"><img src="http://www.wumain.com/php/blog/wp-content/uploads/2009/11/3-300x183.jpg" alt="3" title="3" width="300" height="183" class="aligncenter size-medium wp-image-107" /></a>

<a href="http://www.wumain.com/php/blog/archives/104/4-2" rel="attachment wp-att-108"><img src="http://www.wumain.com/php/blog/wp-content/uploads/2009/11/4-300x183.jpg" alt="4" title="4" width="300" height="183" class="aligncenter size-medium wp-image-108" /></a>

游戏下载:
<a href='http://www.wumain.com/php/blog/wp-content/uploads/2009/11/3DMGAME-Torchlight-SKIDROW.torrent'>3DMGAME-Torchlight-SKIDROW</a>
种子网盘下载：
http://www.rayfile.com/files/dac9120f-c2de-11de-a872-0014221b798a/]]></description>
		<wfw:commentRss>http://www.wumain.com/php/blog/archives/104/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>献给水瓶座&#8212;12星座中仅有的,没有生命的星座</title>
		<link>http://www.wumain.com/php/blog/archives/101</link>
		<comments>http://www.wumain.com/php/blog/archives/101#comments</comments>
		<pubDate>Sat, 31 Oct 2009 13:32:13 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[心情]]></category>
		<category><![CDATA[水瓶]]></category>
		<category><![CDATA[没有生命的星座]]></category>

		<guid isPermaLink="false">http://www.wumain.com/php/blog/?p=101</guid>
		<description><![CDATA[水瓶座,因为太理智,所以没有呼吸，没有生命。

他们有一种特殊的诱惑。都说瓶子有一颗坚强的心，她们总是将理智与感性完美的结合在一起。有时候瓶子很敏感很容易感伤，而理由仅仅是因为一片落叶，一份远方的牵挂。有时候瓶子很坚强，跌倒后仍能满身是伤的一次次爬起，哪怕身边的人已经全部倒下。除非瓶子自己倒下，否则谁也别想让她放弃。

瓶子其实很特别，她们的性格里充满了矛盾，理智和感性中她们往往能够服从于理性。瓶子很敏感，能够感觉到很细微的变化，她们像是希腊神话中的先知者，常常在别人大笑欢庆时，看到灾难的前奏，在人们低头悲吟时，看到希望的光芒。

当看到一个瓶子在疯狂地快乐或悲伤时，千万不要被迷惑，水瓶总是不由自主地交错操纵着快乐与悲伤。其实并不像看到的那么快乐，同样的，也不像看到的那么悲伤。只是悲伤时，喜欢带上快乐的面具，而当水瓶快乐时，悲伤又不肯轻易放过。

所以有时候，人们会觉得瓶子有些反常，有些不可理喻。 

很少有人能够真正的抓住瓶子，因为瓶子始终是瓶子，即使是一只透明的瓶子，它依然有一层薄薄的玻璃壁，把自己的故事藏在其中。

瓶子会有很多朋友，她们身上充满了神秘。朋友们乐于听瓶子高谈阔论。瓶子很讲义气，喜欢为朋友两肋插刀，不过这些朋友必须是瓶子认为的真正朋友。在瓶子的身边有各式各样的朋友，他们往往风格迥异，但他们会因为瓶子而走到一起。在友情方面瓶子的魔力相当大，他们好像可以包容一切，周旋在各个角落。

一般水瓶座的好朋友都是经过很长世间的考察的，不仅仅是几年，而是十几年。一旦被水瓶座当作好朋友的，会赴汤蹈火掏心掏肺。 

感情世界里的瓶子是绝对的痴情者，一旦她认定，一定会给他最大的幸福。但有时候瓶子会很烦人，有些絮叨，会把对方看得有些紧，有时候还会让对方觉得莫名其妙的乱发脾气，不过你静下心来想一想，自己一定是在不经意间让瓶子感到了“背叛”和“不信任”。要知道瓶子们最厌恶的就是“背叛”和来自亲密爱人以及朋友的“不信任”。其实瓶子很大度，对于一些利益的得失不会斤斤计较，很讲原则。 

几乎每个水瓶座的心底都有着一段刻骨铭心人间记忆，一个永远无法忘记的背影。那也许只是极其短暂的两情相悦，只是一种单恋，或只是一种只存在于虚幻空间。一切看起来是那么平静，那么和谐。没有惊天动地，没有海誓山盟，没有花前月下，没有浪漫，没有誓言，没有温度。水瓶座的理智和冷漠，注定了任何感情永无燃点。 

水瓶座不容易喜欢上一个人。有人说水瓶座对伴侣的要求太高，其实并非这样，水瓶座注重的是感觉。只是那么轻描淡写的一眼，那个人已经吸引了水瓶的所有注意力，从此目光便无法转移。 

用一秒钟爱上一个人，然后再付出一生，水瓶座就是这样的试验品。但几乎所有的水瓶都会否认在自己的身上发生一见钟情，因为一向自视清高，承认爱上一个人这种事似乎是在侮辱自己的智商。 

更多的时候是因为，连自己都没发现已经爱上。水瓶座很多时候对于感情反应非常迟钝，迟钝到每次都是最后的知情者。有时容易出现弄不清自己的感觉，不清楚自己想做什么，觉得迷惘。 

在对方没有非常明确地表示感情时会退怯，觉得爱情是两厢情愿，不想勉强对方。

会很被动，忽冷忽热，犹豫不决，极其矛盾。在没有完全确定前，决不轻易付出感情，因为怕失去。许是缺乏安全感，许是对自己的保护，也可以算作是一种自私。 

水瓶座在人前总是一幅无忧无虑没心没肝的样子，不想别人看见自己已经花下的心思，那样会有不安全的感觉，总是在无人的地方暗自落泪。这样很好，没人看出来，不至于太没面子。可以继续貌似潇洒。尽管水瓶座装着多么不在乎，看都不看一眼。可是对方说的每句话都从耳朵进去。对方提的任何过分的要求，水瓶座统统照单全收精心尽力，决对不会有半个不字。完全成为一个爱情的奴隶，脸上还装酷无表情，整个死要面子活受罪。 

只要能和对方开心的在一起，过去不重要，未来也不重要，面子不重要，金钱不重要，时间不重要，自己也不重要。

这种情况下，如果对方使点阴谋诡计，刻意疏远避而不见或是视而不见，电话不接或是哼哈敷衍等等，水瓶会给整疯了，开始会想是什么自己地方做错了，说错话了，然后拉下面子主动讨好试探。

但是不用多，碰壁两次，水瓶座就会有自知之明了，不会再去想是为什么会这样，也不想知道了---心里会想，原来是对方讨厌自己，不想见到自己。明白之后，就是绝对的安静了。 

水瓶座依然谈笑风生，依然开朗豁达，继续着一段接一段的新感情，重复着一切。人们都说水瓶花心，见一个爱一个，水瓶座会哈哈一笑，说“哪有？冤啊！”。其实心里在滴着血，脸上却得笑的灿烂，安慰自己“我是谁啊！哪会那么弱呢！” 直到有一天发现自己仍然是自己,理智冷静的连放纵也做不到的时候,做回游魂，没心没肺地独自飘荡开去。

因为无法虚伪，所以甜言蜜语都吝啬给予。因为天真，所以至死之前仍在等待见鬼的真爱。因为骄傲，所以宁愿错过。只有真正懂得水瓶座的人，才能看见眼底那一缕似有似无的哀伤，才能明白是什么让水瓶如此的义无反顾，是什么让水瓶变得如此忽冷忽热捉摸不定，才能体会水瓶的坚强只是竭力掩饰的脆弱。

很难让人想象，这个有着博爱心胸的星座，一旦动了感情，也会是个痴心专情的星座。因为游魂本没有生命，哪天有了呼吸，站立了下来，那是你给予的，从此为你而生。

水瓶座，爱一次就爱一世。]]></description>
		<wfw:commentRss>http://www.wumain.com/php/blog/archives/101/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>QQ的好友印象太害人了～～～～～～整人必看！！！！！</title>
		<link>http://www.wumain.com/php/blog/archives/98</link>
		<comments>http://www.wumain.com/php/blog/archives/98#comments</comments>
		<pubDate>Tue, 27 Oct 2009 17:06:10 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[心情]]></category>
		<category><![CDATA[好友印象]]></category>
		<category><![CDATA[整人]]></category>

		<guid isPermaLink="false">http://www.wumain.com/php/blog/?p=98</guid>
		<description><![CDATA[某人的好友印象被人写道：“安心工作吧，孩子我已经打掉了。”

女友与之分手。

杯具并未中止。。。。。此人又收到如下好友印象：

1."孩子我打掉了，我不恨你。”

2.“孩子我也打掉了，我不恨你。” 

3."那我把孩子也打掉吧，我恨你。" 

4."相信我，孩子真是你的。” 

5."对不起，这孩子不是你的。” 

6.“我妈让我问你，这孩子你是要还是不要。”

7.“钱已收到，孩子舍不得打掉。”

8.“孩子已经生下来了 ，眼睛很像你。我欺骗了你，孩子我没忍心打掉。”

9.“回来吧，就当是为了孩子。”]]></description>
		<wfw:commentRss>http://www.wumain.com/php/blog/archives/98/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>婚礼上的一百元 [这个故事虽短，但当中却颇有启发]</title>
		<link>http://www.wumain.com/php/blog/archives/96</link>
		<comments>http://www.wumain.com/php/blog/archives/96#comments</comments>
		<pubDate>Tue, 13 Oct 2009 10:23:35 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[心情]]></category>
		<category><![CDATA[一百元]]></category>
		<category><![CDATA[启发]]></category>
		<category><![CDATA[婚礼]]></category>
		<category><![CDATA[故事]]></category>

		<guid isPermaLink="false">http://www.wumain.com/php/blog/?p=96</guid>
		<description><![CDATA[前日去参加一个婚礼、当牧师证婚词中用一张一百元纸钞作了个比喻，我自己听了，想跟大家分享一下。­

牧师手持（里拿）一张新的百元钞票举起问大家，谁想要？­

没人出声。­

­牧师又说不要怕羞，真的，谁想要就举手啦 ~~~­

­全场大约三分之一的人举手，牧师又将这张百元新钞揉成一团，再打开问现在还有谁想要？­

­仍然有人举手，但少了差不多一倍，牧师再将这张纸钞放在地上用力踩了几下，再捡起来打开，问大家那这样还有人要吗？­

­全场只有三、四个人举手。­

­牧师请了一位男士上台，把一百元给了这位男士，说这位男士是三次都举手的，当全场大笑时，牧师示意大家安静，并向新郎说你今天迎娶的这位心爱的女士，就如同一张新版的百元钞票，岁月加上辛劳，就如同残破的一百元钞票一样，令起初宠爱的人，变了心，事实上，这张一百元钞票仍然是一百元，它的价值全没有改变的，希望你可以像这位男士一样，懂得真正的价值和意义， 不要让外表带领你走人生路！]]></description>
		<wfw:commentRss>http://www.wumain.com/php/blog/archives/96/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>10岁男童携女友，情敌及女友蓝颜知己共度良宵</title>
		<link>http://www.wumain.com/php/blog/archives/92</link>
		<comments>http://www.wumain.com/php/blog/archives/92#comments</comments>
		<pubDate>Sat, 03 Oct 2009 08:51:19 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[心情]]></category>
		<category><![CDATA[女友]]></category>
		<category><![CDATA[情敌]]></category>
		<category><![CDATA[男童]]></category>
		<category><![CDATA[蓝颜知己]]></category>

		<guid isPermaLink="false">http://www.wumain.com/php/blog/?p=92</guid>
		<description><![CDATA[<img src="http://www.wumain.com/php/blog/wp-content/uploads/2009/10/2_51065737_diary.jpg" alt="2_51065737_diary" title="2_51065737_diary" width="580" height="527" class="aligncenter size-full wp-image-93" />]]></description>
		<wfw:commentRss>http://www.wumain.com/php/blog/archives/92/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>ASUS 5870 入手</title>
		<link>http://www.wumain.com/php/blog/archives/85</link>
		<comments>http://www.wumain.com/php/blog/archives/85#comments</comments>
		<pubDate>Thu, 01 Oct 2009 11:10:22 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Hardware]]></category>
		<category><![CDATA[兴趣]]></category>
		<category><![CDATA[显卡]]></category>
		<category><![CDATA[5870]]></category>
		<category><![CDATA[ASUS]]></category>

		<guid isPermaLink="false">http://www.wumain.com/php/blog/?p=85</guid>
		<description><![CDATA[<img class="aligncenter size-medium wp-image-83" title="P1010822" src="http://www.wumain.com/php/blog/wp-content/uploads/2009/10/P1010822-300x225.jpg" alt="P1010822" width="300" height="225" />
<img class="aligncenter size-medium wp-image-83" title="P1010826" src="http://www.wumain.com/php/blog/wp-content/uploads/2009/10/P1010826-300x225.jpg" alt="P1010826" width="300" height="225" />
<img class="aligncenter size-medium wp-image-83" title="P1010837" src="http://www.wumain.com/php/blog/wp-content/uploads/2009/10/P1010837-300x225.jpg" alt="P1010837" width="300" height="225" />

<a href="http://bbs.chiphell.com/viewthread.php?tid=55838" target="_blank">CHH</a>]]></description>
		<wfw:commentRss>http://www.wumain.com/php/blog/archives/85/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>[拍客]牛人超强演绎两岸三地巨星版《我的中国心》！</title>
		<link>http://www.wumain.com/php/blog/archives/79</link>
		<comments>http://www.wumain.com/php/blog/archives/79#comments</comments>
		<pubDate>Sun, 27 Sep 2009 16:27:57 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[心情]]></category>
		<category><![CDATA[我的中国心]]></category>

		<guid isPermaLink="false">http://www.wumain.com/php/blog/archives/79</guid>
		<description><![CDATA[<embed src="http://player.youku.com/player.php/sid/XMTIwOTg5Njky/v.swf" quality="high" width="480" height="400" align="middle" allowScriptAccess="sameDomain" type="application/x-shockwave-flash"></embed>]]></description>
		<wfw:commentRss>http://www.wumain.com/php/blog/archives/79/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>糗事囧事一大堆   绝对够尴尬</title>
		<link>http://www.wumain.com/php/blog/archives/76</link>
		<comments>http://www.wumain.com/php/blog/archives/76#comments</comments>
		<pubDate>Sun, 27 Sep 2009 08:18:32 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[心情]]></category>
		<category><![CDATA[囧事]]></category>
		<category><![CDATA[糗事]]></category>

		<guid isPermaLink="false">http://www.wumain.com/php/blog/?p=76</guid>
		<description><![CDATA[我没事喜欢给自己改装衣服，家里帽子、鞋什么，很多都自己画的。
今天，又花八个小时，在t恤上画了个类似六角星的魔法阵图案。弄好以后在镜子前头左照右照，觉得自个儿挺美。
正美着呢，一旁的老爹看了一眼，皱眉，说：闺女，你咋在衣服上整了个王八？
当场石化。

 

一日大醉，拉着朋友要嗨歌，朋友无奈，架着送回家，欲走，拉着不放，又喝，失去知觉。第二日清晨忽醒，摸索着穿衣，随手扔了几百元在床，欲走，忽感不对，回头望去，老婆拿着钱疑问似地望着……

 

大学时的初恋男友,最近通过QQ联系到了我. 当年在一起,他觉得我高攀了,配不上他,特别对我的身高不满意.(我1米58,他也就1米72). 但我依然坚持了一年,最终还是被抛弃了,我用了很长时间来恢复.
这已经是5年前的事情了.
话说他主动加了我好友以后,随便聊了两句,就问我是否有了男友,我说有啊,
他问:他嫌你矮吗?
我说:不嫌啊,他觉得我身高刚好
他问:他多高啊? (充满着轻蔑和不信)
我答:1米86
然后,他就下线了.
好吧,如果这就是报复,那还真是甜美
我一个朋友的老婆刚生过孩子，坐在我的对面，没有穿内衣。从她的腋下可以看到她硕大的mm，我正看的入神，被她发现了，她跟我说话我一句都没听进去，她大声咳嗽了一下，把我拉回现实，红着脸对我说，刚生过孩子，有点大，不好看。我当时就想找个地缝钻进去，还好朋友没发现。

我女朋友是一个幼儿园老师，今天去找她，一个很可爱的小男孩抱着我腿问我：“哥哥，姐姐还是处女吗？”

这不十一快到了，放八天假...很是开心啊,终于可以回去见女友了,于是连续两天排队去买票,两次都空手而回,估摸着这票是习不着了,于是昨晚打电话告诉女友:票不好买,可能不回去了....得到回复:不好买就算了,过年再回吧.可是我那个不甘心啊....于是上网疯狂地找黄牛...最后于今天中午把票拿到手,11个小时的车,硬座,原价143,"手续费"50,你说我一穷学生,容易么我.....屁颠屁颠地发信息报告好消息...结果...........

 
我昨晚想好了,我们不合适...我们分手吧,以后还是不要再见面的好

 

大学期间，室友正处在热恋中，每日打扮得花枝招展的去赴约，某日室友外出约会，急忙中没来的及化妆，走到校门口见辆小汽车停靠在路旁，左右一看没啥人，迅速从包包里拿出全套化妆品对着小汽车的玻璃窗开始涂抹，化妆水、口红、粉饼、眉笔、腮红、口喷……待到自我感觉良好时，又对着玻璃窗扯扯衣角，演练了几遍即将对男友的淑女般的微笑，完毕正欲离开，突然小汽车玻璃窗户缓缓下移，从里面探出一个头来道：妹妹，你脖子上还没擦粉，有点黑！室友瞪大眼睛，瞟见后排座上还坐着三个男人笑得眼泪都快出来了，室友的脸顿时从刚化完妆的粉色变成了猪肝色。

 
刚中午去食堂买饭，前面一个男生买的菜是青椒鸡块
学生：这……青椒怎么这么多……= = （目测估计也就一块半鸡肉）
师傅（瞥一眼）：……
然后师傅默默的拿勺子将盘子里面的青椒扒拉了出去一些……
学生:……&#62;_&#60;……

 

小时候吃饭，够不着盘子。就抓住桌布拽啊拽啊拽啊拽啊..然后..哗啦..

被家人说了T-T

第二顿，长记性了，就推啊推啊推啊推啊..然后..哗啦..

 

一次到同事家，发现同事老婆是偶的好同学，且与偶有过xx，几年不见，这回却意外撞见她正在给BB喂奶。同事还没到家，偶突然被以前的大MM迷住，被她发现，红着脸说：想要来吸两口？他很快就回来了。无语。。。。。

 

小学二三年级的时候，那时成绩比较好老师也喜欢我，让我当了班干部。

记得有一次要领着全年级几百人在操场上对校领导敬礼，我手刚举过头顶，不知道为什么裤子就“唰”的掉下来了，我直接定格……

然后校领导当着那几百人的面给我提裤子……
某晚，半夜醒来，同宿的哥们说梦话，装着童音说：小喇叭节目开始了

汗～～～
中午，家里公公在做饭，婆婆上网炒股。老公把我拖进我们的房间准备和谐一下，两人脱了衣服钻进被子，正在打波时，老公姐姐的小孩，站在床边说：舅舅，你们干嘛？
我们两吓了一跳，老公忙用被子包住我们两，谁知，她一扭头跑出去大叫：恩妈嗲嗲，快来看，舅舅舅妈睡觉不穿衣，打赤膊。
我们暴汗。

 

曾经爬过一座山，山路大部分是大约长2米宽半米高30厘米左右的台阶，而且经常一连50，60阶都没有一点回转休息的地方。

山很高，每个台阶也都很高，爬起来很费劲。我们正在一边爬一边闲扯上山容易下山难的事情，就听到远远的人有人喊：快让开啦~~~~~

我们抬头，见前面的人都迅速的让开一条过道，我们也连忙让开。一会就看见一个人从山上飞快的冲下来，那双腿真灵活 = = 他一边往下跑一边大声喊：快让开啦，我刹不住啦~快让开啦……

然后一群人默默的用悲剧的目光注视着这位在高高的台阶上刹不住车的男子。我们站的地方距离山脚起码还有500米 = =

我一直不敢想象他万一腿脚无力的时候绊倒的场面……

 

两岁时我爷爷常带我去泡澡，但后来他不带我去了。。我也忘了这事，最近和奶奶聊起这个，才晓得为嘛。。。

原来我穿好衣服坐在长椅上等我爷爷时（他喜欢在池子里泡很久），一个光屁股老爷爷过来逗我玩，还回头和我爷爷说：你孙子长的讨喜啊！然后咧，我就爬过去，一把捏住了他的JJ。。。囧

PS：俺是女生
一日提着一袋子去厕所小便，刚拉到一半，朋友来电话，边接边电话边拉完。。。。然后边说边出了公共卫生间，到了大坪接完电话猛然发现忘记把小JJ放进去了。。。汗。。。

 

刚从厕所方便出来，就看见事先约好的客户已在大厅等候，赶忙上前迎接准备握手，手伸出去的同时，发现上面占了一根yin毛。囧啊~~~~~~~~~~
昨晚我和公司一个死党下班后在街上闲逛……
一个新开的桑拿馆映入眼帘，我俩对视一下，冲进去！冲洗！换衣！上楼！
一个SB领班过来，“二位先生需要什么”
“大活”我俩异口同声……
“对不起！现在严打，只能做口活……我们这口活是一绝的……”
一问价格，还不贵，行！既来之，则做之。泻火就行……
我刚被领到里面的屋子，MM就进来了。哇！好性感！我把她按在床上乱摸起来……她挣扎……
“对不起，哥，你别摸了，我不做大活。”
“我知道。”
“你知道啊！那你摸吧！没事！我就是告诉你我不做大活，没别的意思！你摸吧！哥！没关系，我这个人可实在了……你摸吧，哥！”
妈的！我突然不想摸了…………
她把鸡鸡含在口里……我闭上眼……
她把鸡鸡吐出来，说：“哥，一会儿你要射的时候告诉我一声……我不能……
“妈个逼的！破jb地方，没大活还不让口爆！”
“口……什么……爆？哥，啥意思啊？”
“就是把精射你嘴里！”我大声说。
“哦！“她若有所思……哥，你懂的东西真多！
我有点晕……
她把鸡鸡又吐出来……“哥，你不能生气吧？”
“不生气，你快做吧！”
“我看你好像生气了……”
“没有，你做吧！”
“我怕你生……”
“ SHUT UP ！”我大喊！
“哥，你还会英语啊！一进来我就看你和别人不一样，真厉害……”
我无语了……我真晕了……（对毛主席发誓我会的英语超不过五十句）
又把鸡鸡吐出来了，笑着说：“哥，你牛子真大！我嘴都麻了……”
“牛子？？？！你管我鸡鸡叫牛子？？？”我眼睛都快瞪出来了……
“是啊！我们家那都管这叫牛子，大人叫大牛子，老牛子。小孩子的叫小牛子……
“你们那的人真有才！”
“你别瞧不起我们，我家那可好了！大山可大了，全是原始森林，可多野生动物了，还有狍子呢！狍子最好玩了！可傻了，不怕人。我小时候上山就能见到，我还和它玩呢！”
我晕的越来越厉害了……（这位是和狍子从小玩到大的！）
“咦？哥，你牛子咋软了呢？”
“废话！你在这牛子长，狍子短的，我他妈能不软吗？”
“没事，哥！咱俩唠唠嗑，一会儿，我给你做。时间来得及。今天我让你口爆！”（她倒懂得现学现用）
看在口爆的面子上，我忍……
她继续唠叨：“哥，我其实是到你们这来找我丈夫的，他不回家，也不往家寄钱。我就来找他。谁知你们这地方也太大了！上哪找去呀？我就想挣点钱再回去，就到这上班了。我本来是想到这打扫卫生的，可是老板可坏了！非得让我干这个。我不干，他就说要打我！还不让我走！没办法，我就干这行了。第一次我做时我都哭了！客人气的踢了我一脚，老板还扣了我200块钱！后来，我想，反正我嘴里也吃过牛子了（吃？？？）我就做呗！（村姑！典型的村姑！）等我挣钱多了，我就回家，我买个三轮车往城里运山货，春天运野菜……夏天运蘑菇……秋天运……冬天运……
顿时，一位卖菜大嫂的身影出现在我脑海之中……她那饱经风霜的脸庞……她那布满老茧的双手……
我有点想回家了，我晕的受不了了……
“哥，你觉得我的想法怎么样？”
“很好，你是应该离开这，这不适合你。”
“那你觉得我这个人怎么样？”
“也很好，就是有点像大话西游里的唐僧……”
“哎呀哥！你也爱看西游记啊！我儿子也爱看！他一听见电视里，猴哥，猴哥的就跟着唱……
我差一点晕倒……
…………
…………
“哥！你别走啊！我还没给你口爆呢！”
“我有事，改天吧！”
“你生气了吧？哥！我现在就给你做！”
“不了！不了！”
“没事！哥！还有时间……”
“真不做了！我有点晕……”
“晕？好办！”她冲出房门大喊：“二霞！二霞！快把你昨天买的去痛片拿来！我哥头晕……”
我重重摔倒在地…………
去痛片也能治头晕？？？?#￥%???*（*???%￥#
出门后，我死党问我怎么样？我前前后后给他讲了一遍，他捂着肚子狂笑足足有半个小时…………]]></description>
		<wfw:commentRss>http://www.wumain.com/php/blog/archives/76/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>一时冲动&#8230;定了5870</title>
		<link>http://www.wumain.com/php/blog/archives/74</link>
		<comments>http://www.wumain.com/php/blog/archives/74#comments</comments>
		<pubDate>Sat, 26 Sep 2009 12:38:02 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Hardware]]></category>
		<category><![CDATA[兴趣]]></category>
		<category><![CDATA[显卡]]></category>
		<category><![CDATA[5870]]></category>
		<category><![CDATA[RV870]]></category>

		<guid isPermaLink="false">http://www.wumain.com/php/blog/?p=74</guid>
		<description><![CDATA[只能耐心等待了,谁让2900XT寿命不行呢]]></description>
		<wfw:commentRss>http://www.wumain.com/php/blog/archives/74/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>15个非常有用的CSS网格布局生成器</title>
		<link>http://www.wumain.com/php/blog/archives/70</link>
		<comments>http://www.wumain.com/php/blog/archives/70#comments</comments>
		<pubDate>Fri, 18 Sep 2009 10:30:26 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[技术]]></category>
		<category><![CDATA[CSS]]></category>
		<category><![CDATA[有用的]]></category>
		<category><![CDATA[生成器]]></category>
		<category><![CDATA[网格布局]]></category>

		<guid isPermaLink="false">http://www.wumain.com/php/blog/?p=70</guid>
		<description><![CDATA[<div>译自：<a href="http://www.webdesignbooth.com/15-extremely-useful-css-grid-layout-generator-for-web-designers/" target="_blank">webDesignBooth</a></div>
中文原文：<a href="http://www.qianduan.net/15-extremely-useful-css-grid-layout-generators.html" target="_blank">15个非常有用的CSS网格布局生成器</a>

版权所有，转载请注明出处，多谢！

<hr />网上有很多在线生成器可以帮助设计师快速的完成某项任务，这些在线生成器包括收藏夹图标生成器、背景图片生成器、按钮生成器、徽章生成器等。Balkhis曾经为我们写过一篇文章介绍<a title="超过55个非常有用的在线生成器" href="http://www.balkhis.com/web-designs-resources/55-extremely-useful-online-generators-for-designers/" target="_blank">非常有用的在线生成器</a>。

除了这些在线生成器之外，设计师还需要花费大量的时间来做重复的事情。还好现在已经有了很多不错的<a title="10 Promising CSS Framework That Worth A Look" href="http://www.webdesignbooth.com/10-promising-css-framework-that-worth-a-look/" target="_blank">CSS框架</a>，现在让我们看看一些很有用的CSS网格布局生成器吧。
<h4>1.<a title="Blueprint Grid CSS Generator" href="http://kematzy.com/blueprint-generator/" target="_blank">Blueprint Grid CSS Generator</a></h4>
<img title="blueprint-grid-css-generator" src="http://www.qianduan.net/wp-content/uploads/2009/06/130708y0g.jpg" alt="blueprint-grid-css-generator" width="500" height="341" />
<h4>2.<a title="Variable Grid System" href="http://www.spry-soft.com/grids/" target="_blank">Variable Grid System</a></h4>
<img title="variable-grid-system-by-spry-soft" src="http://www.qianduan.net/wp-content/uploads/2009/06/130712uni.jpg" alt="variable-grid-system-by-spry-soft" width="500" height="250" />
<h4>3.<a title="YUI CSS Grid Builder" href="http://developer.yahoo.com/yui/grids/builder/" target="_blank">YUI CSS Grid Builder</a></h4>
<img title="yui-css-grid-buider" src="http://www.qianduan.net/wp-content/uploads/2009/06/130709qkz.jpg" alt="yui-css-grid-buider" width="500" height="250" />
<h4>4.<a title="Grid System Generator" href="http://www.gridsystemgenerator.com/" target="_blank">Grid System Generator</a></h4>
<img title="grid-system-generator" src="http://www.qianduan.net/wp-content/uploads/2009/06/130709exp.jpg" alt="grid-system-generator" width="500" height="379" />
<h4>5.<a title="Grid Generator by DesignByGrid" href="http://www.designbygrid.com/tools" target="_blank">Grid Generator by DesignByGrid</a></h4>
<img title="grid-generator-by-designbygrid" src="http://www.qianduan.net/wp-content/uploads/2009/06/130711x0l.jpg" alt="grid-generator-by-designbygrid" width="402" height="340" />
<h4>6.<a title="Grid Generator by netProtozo" href="http://netprotozo.com/grid/" target="_blank">Grid Generator by netProtozo</a></h4>
<img title="grid-geenrator-by-netprotozo" src="http://www.qianduan.net/wp-content/uploads/2009/06/130711ekj.jpg" alt="grid-geenrator-by-netprotozo" width="500" height="250" />
<h4>7.<a title="Grid Designer" href="http://grid.mindplay.dk" target="_blank">Grid Designer (featured in Creative Review magazine)</a></h4>
<img title="grid-designer-by-mindplay" src="http://www.qianduan.net/wp-content/uploads/2009/06/130712tv8.jpg" alt="grid-designer-by-mindplay" width="500" height="407" />
<h4>8.<a title="Grid Layout Generator by Pagecolumn" href="http://www.pagecolumn.com/grid_layout_generator.htm" target="_blank">Grid Layout Generator by Pagecolumn</a></h4>
<img title="grid-layout-generator-by-pagecolumn" src="http://www.qianduan.net/wp-content/uploads/2009/06/130710nu8.jpg" alt="grid-layout-generator-by-pagecolumn" width="500" height="250" />
<h4>9.<a title="YAML Builder" href="http://builder.yaml.de/" target="_blank">YAML Builder</a></h4>
<img title="yaml-builder" src="http://www.qianduan.net/wp-content/uploads/2009/06/130712og6.jpg" alt="yaml-builder" width="500" height="214" />
<h4>10.<a title="Layout Generator by Pagecolumn" href="http://www.pagecolumn.com/" target="_blank">Layout Generators by Pagecolumn</a></h4>
<img title="layout-generator-by-pagecolumn" src="http://www.qianduan.net/wp-content/uploads/2009/06/130713hvf.jpg" alt="layout-generator-by-pagecolumn" width="500" height="303" />
<h4>11.<a title="Fisheye" href="http://fisheye.farcrycms.org/browse/projects/mollio/trunk/www/css/grid.css?r=3251" target="_blank">Fisheye</a></h4>
<img title="fisheye" src="http://www.qianduan.net/wp-content/uploads/2009/06/130713ess.jpg" alt="fisheye" width="500" height="214" />
<h4>12.<a title="CSS Layout Generator by CSSCreator" href="http://csscreator.com/tools/layout" target="_blank">CSS Layout Generator by CSSCreator</a></h4>
<img title="css-layout-generator-by-csscreator" src="http://www.qianduan.net/wp-content/uploads/2009/06/130713pdg.jpg" alt="css-layout-generator-by-csscreator" width="500" height="262" />
<h4>13.<a title="Firdamatic" href="http://www.wannabegirl.org/firdamatic/" target="_blank">Firdamatic</a></h4>
<img title="firdamatic" src="http://www.qianduan.net/wp-content/uploads/2009/06/130714xz8.jpg" alt="firdamatic" width="500" height="250" />
<h4>14.<a title="CSS Source Ordered Variable Border 1-3 Columned Page Maker" href="http://www.positioniseverything.net/articles/pie-maker/pagemaker_form.php" target="_blank">CSS Source Ordered Variable Border 1-3 Columned Page Maker</a></h4>
<img title="css-source-ordered-variable-border-1-3-columned" src="http://www.qianduan.net/wp-content/uploads/2009/06/130714no7.jpg" alt="css-source-ordered-variable-border-1-3-columned" width="500" height="250" />
<h4>15.<a title="CSS Layout Generator by CSSPortal" href="http://www.cssportal.com/generators/layout.htm" target="_blank">CSS Layout Generator by CSSPortal</a></h4>
<img title="css-layout-generator-by-cssportal" src="http://www.qianduan.net/wp-content/uploads/2009/06/130714n1x.jpg" alt="css-layout-generator-by-cssportal" width="500" height="243" />]]></description>
		<wfw:commentRss>http://www.wumain.com/php/blog/archives/70/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>15款代码生成器</title>
		<link>http://www.wumain.com/php/blog/archives/65</link>
		<comments>http://www.wumain.com/php/blog/archives/65#comments</comments>
		<pubDate>Fri, 18 Sep 2009 01:55:31 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[技术]]></category>

		<guid isPermaLink="false">http://www.wumain.com/php/blog/?p=65</guid>
		<description><![CDATA[15款代码生成器, 从弱智的色彩渐变代码生成器, 到<a href="http://paranimage.com/category/dede/css/">CSS</a>生成器, 再到适合开发人员的.NET代码生成器.

<a href="http://cssround.com/" target="_blank">Cssronnd</a> – 在线生成css圆角代码，可以设置圆角半径、包含文字、圆角颜色、背景颜色、文字颜色以及宽度。支持代码下载（其中包括4个圆角图片）。

<a href="http://csstxt.com/" target="_blank">CSSTXT</a> – 在线生成css文字代码，可以设置粗体、下划线、上划线、斜体、大写、文字大小、边框、颜色等参数。

<a href="http://lab.xms.pl/markup-generator/" target="_blank">Markup-generator</a>- 一个简捷的X<a href="http://paranimage.com/category/dede/html">HTML</a>/CSS代码生成器。如果厌倦了枯燥的框架代码写作，尤其是最开始的切片工作。那 Markup Genertor可能会比较适合你。它的主要目的是为了加快你的工作，XHTML标记和CSS代码的生成将非常直观，可缩短语法，让你可以直接跳到该元素 的风格。

<a href="http://gradcolor.com/" target="_blank">Grad color</a> – css渐变代码生成,可以设置宽度、高度、方向等参数。

<a href="http://www.haofa.net/wyzs/7.htm" target="_self">弹出式窗口代码产生器</a> – 生成弹出式窗口代码.

<a href="http://www.haofa.net/wyzs/3.htm" target="_self">色彩渐变代码生成器</a> – 生成渐变色彩代码.

<a href="http://www.codeproject.com/useritems/SmartCode-Code_Generation.asp" target="_blank">SmartCode</a> – CodeProject上的一个开源代码生成器，对于不想花钱买<span lang="EN-US">CodeSmith</span>的朋友来说，是个不错的选择，<span lang="EN-US">SmartCode</span>完全基于模版代码生成，它通过读取数据库，可以为每张表或者每一个字段设置生成属性.

<a href="http://www.tool.la/framegenerator/#" target="_blank">框架网页代码生成器 </a>- 主要用来生成那些想使用FRAME框架来制作简单网页的朋友.

<a href="http://www.maticsoft.com/" target="_blank">动软.NET代码生成器 </a>- 强大的代码生成功能, 便于日期开发的工具, 多种类型数据库集中管理器.

<span id="ctl00_ContentPlaceHolder1_CodeGenerator_002Context1_Label___Line_19_1533"><a href="http://www.dotnetcoding.net/" target="_blank">湛蓝.Net代码生成器</a> – </span><span id="ctl00_ContentPlaceHolder1_CodeGenerator_002Context1_Label___Line_20_1633">国内功能算比较完善的免费.NET代码生成器.</span>

<span id="ctl00_ContentPlaceHolder1_CodeGenerator_002Context1_Label___Line_14_998"><a href="http://www.mygenerationsoftware.com/portal/default.aspx" target="_blank">MyGeneratoe</a> – </span><span id="ctl00_ContentPlaceHolder1_CodeGenerator_002Context1_Label___Line_15_1097">国外著名的免费</span><span id="ctl00_ContentPlaceHolder1_CodeGenerator_002Context1_Label___Line_15_1097">.NET</span><span id="ctl00_ContentPlaceHolder1_CodeGenerator_002Context1_Label___Line_15_1097">代码生成器.</span>

<span id="ctl00_ContentPlaceHolder1_CodeGenerator_002Context1_Label___Line_9_459"><a href="http://www.codesmithtools.com/" target="_blank">Code Smith</a> – </span><span id="ctl00_ContentPlaceHolder1_CodeGenerator_002Context1_Label___Line_10_556">国外著名的商业</span><span id="ctl00_ContentPlaceHolder1_CodeGenerator_002Context1_Label___Line_15_1097">.NET</span><span id="ctl00_ContentPlaceHolder1_CodeGenerator_002Context1_Label___Line_10_556">代码生成器</span>

<span id="ctl00_ContentPlaceHolder1_CodeGenerator_002Context1_Label___Line_32_3161"><a href="http://www.codeplus.net/" target="_blank">Code Plus</a> – </span><span id="ctl00_ContentPlaceHolder1_CodeGenerator_002Context1_Label___Line_33_3259">国内早期人气最旺的.NET代码生成器.</span>

<a href="http://www.bluetechchina.com/cn/product/codeGenerator%5CCodeGenerator_002.aspx" target="_blank">菲菲.Net 代码生成器</a> – <span id="ctl00_ContentPlaceHolder1_CodeGenerator_002Context1_Label___Line_45_5117">国内早期免费代码生成器.</span>

<span id="ctl00_ContentPlaceHolder1_CodeGenerator_002Context1_Label___Line_51_5648"><a href="http://www.macrobject.com/cn/codeauto/index.htm" target="_blank">MacrObject</a> – </span><span id="ctl00_ContentPlaceHolder1_CodeGenerator_002Context1_Label___Line_52_5747">国内一款不错的代码生成器</span><span id="ctl00_ContentPlaceHolder1_CodeGenerator_002Context1_Label___Line_52_5826">. Macrobject CodeAuto 是一个基于模板的代码生成工具 (Code Generator)，它能从数据库架构、数据库数据、XML及其它数据源生成各种文本文件。</span>]]></description>
		<wfw:commentRss>http://www.wumain.com/php/blog/archives/65/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>[9月15日发布下载]Popcap最新游戏大作《祖玛的复仇》（Zuma&#8217;s Revenge）（预告片+破解完整版下载）</title>
		<link>http://www.wumain.com/php/blog/archives/61</link>
		<comments>http://www.wumain.com/php/blog/archives/61#comments</comments>
		<pubDate>Wed, 16 Sep 2009 15:33:24 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[心情]]></category>
		<category><![CDATA[Popcap]]></category>
		<category><![CDATA[Zuma's Revenge]]></category>
		<category><![CDATA[祖玛的复仇]]></category>

		<guid isPermaLink="false">http://www.wumain.com/php/blog/?p=61</guid>
		<description><![CDATA[<img src="http://pic.yupoo.com/wuyuankai/256907f2107c/r80wr6kg.jpg" alt="http://pic.yupoo.com/wuyuankai/256907f2107c/r80wr6kg.jpg" /> 

上次介绍了一款广受大家好评的游戏《植物大战僵尸》（Plants vs. Zombies），相信喜欢休闲游戏的朋友们已经都完通了。8月20日，Popcap宣布其招牌经典球类射击动作游戏《祖玛》（Zuma）将迎来新的续作——《祖玛的复仇》（Zuma's Revenge），该游戏将于今年9月15日发布！

作为祖玛游戏的鼻祖，这次祖玛新作较上作拥有更好更精美的画面，并且支持宽屏显示器分辨率；新增多种新能力武器和特性，新增多种游戏模式，另外还新增了Boss关卡。

游戏截图：

<img src="http://pic.yupoo.com/wuyuankai/365987f2106b/medium.jpg" alt="http://pic.yupoo.com/wuyuankai/365987f2106b/medium.jpg" />

<img src="http://pic.yupoo.com/wuyuankai/488757f21071/medium.jpg" alt="http://pic.yupoo.com/wuyuankai/488757f21071/medium.jpg" />

<img src="http://pic.yupoo.com/wuyuankai/216977f21076/medium.jpg" alt="http://pic.yupoo.com/wuyuankai/216977f21076/medium.jpg" />
 

游戏预告片视频：

(Google Reader等订阅用户请进入日志观看）

<a href=" http://player.youku.com/player.php/sid/XMTE0MDE2MjQ4/v.swf">http://player.youku.com/player.php/sid/XMTE0MDE2MjQ4/v.swf</a><a href="http://player.youku.com/player.php/sid/XMTE0MDE2MjQ4/v.swf"></a>

《祖玛2：祖玛的复仇》（Zuma’s Revenge）游戏官方试玩版下载地址

官方试玩版：<a href="http://downloads.popcap.com/www/popcap_downloads/ZumasRevengeSetup-en.exe">http://downloads.popcap.com/www/popcap_downloads/ZumasRevengeSetup-en.exe</a>

破解补丁：<a href="http://www.uushare.com/user/wuyuankai/file/2023227">http://www.uushare.com/user/wuyuankai/file/2023227</a>

将补丁压缩包里的ZumasRevenge.exe和properties文件夹覆盖到游戏安装目录下就可以了。

[或者]

《祖玛2：祖玛的复仇》（Zuma’s Revenge）游戏绿色破解完整版下载地址

下载地址1：<a href="http://rapidshare.com/files/280208213/zuma_s_revenge_.rar">http://rapidshare.com/files/280208213/zuma_s_revenge_.rar</a>

下载地址2：<a href="http://www.verycd.com/topics/2768421/">http://www.verycd.com/topics/2768421/</a>

下载地址3：<a href="http://www.rayfile.com/zh-cn/files/653ebe59-a1d2-11de-b0aa-0014221b798a/">http://www.rayfile.com/zh-cn/files/653ebe59-a1d2-11de-b0aa-0014221b798a/</a>

下载地址4：<a href="http://d.namipan.com/d/7eeaab1b3d4f924ce25a9cac91267c0028100044781be105">http://d.namipan.com/d/7eeaab1b3d4f924ce25a9cac91267c0028100044781be105</a>

[注：]此为破解硬盘版，下载后解压运行文件夹内的ZumasRevenge.exe即可执行游戏！Enjoy！

更多游戏信息请到游戏官网：<a href="http://popcap.com/promos/zumasrevengegame/">http://popcap.com/promos/zumasrevengegame/</a>

声明：文中所提及的破解补丁下载地址均为互联网所收集，请大家于下载之后25小时内删除。版权归Popcap所有 。请支持购买正版！]]></description>
		<wfw:commentRss>http://www.wumain.com/php/blog/archives/61/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>charindex代替like并非”更快更全面” &#8212; SQL LIKE使用</title>
		<link>http://www.wumain.com/php/blog/archives/56</link>
		<comments>http://www.wumain.com/php/blog/archives/56#comments</comments>
		<pubDate>Tue, 15 Sep 2009 05:18:00 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[数据库]]></category>
		<category><![CDATA[charindex]]></category>
		<category><![CDATA[like]]></category>
		<category><![CDATA[SQL LIKE]]></category>

		<guid isPermaLink="false">http://www.wumain.com/php/blog/?p=56</guid>
		<description><![CDATA[最近csdn的编辑们在社区和网站首页的标题让人有些受不了，一个吸引眼球的大红专题点进去只是一个聊聊数字的普通帖子..这种做法用来八卦也就算了，用来包装技术文章那是相当不负责的。

    一个普普通通的技术博文，不管观点对错，水平如何，作者的拿出来分享的做法是值得肯定的，但在没有经过论证，人为在加上一个漂亮的副标题打到技术专区的首页上，难免误导不明真相的群众。

    

文章出处

    <a href="http://database.ctocio.com.cn/336/9159836.shtml">http://database.ctocio.com.cn/336/9159836.shtml</a>

大概这就叫传说中的以讹传讹，就算作者认为他的方法更全面，人家也没有说更快...

别的不扯了，我写此文的目的以来是为了督促一下csdn官方，发布在首页上的文章要仔细审核，起码得专业精神还是需要的。二来让不明白真相的群众明白一下。我们就从更快更全面说开来：

首先：先明确掉全面这个问题，想like百分号很简单，帮助文档里面就有

ms-help://MS.SQLCC.v9/MS.SQLSVR.v9.zh-CHS/tsqlref9/html/581fb289-29f9-412b-869c-18d33a9e93d5.htm

转义百分号类似下面方法：

<code>select * from
(select 'a%b' as s union select 'ab' )t
where s like '%\%%' escape '\' ;</code>

反而，like可以实现比charindex更复杂的通配功能，比如partindex函数才支持的方括号

<code>select * from (select 'amm_99' as s union select 'happyflystone' ) t
where s like '%[0-9]%'</code>

然后：说一下是否更快，这个需要有测试数据，不是我相信快就快的，sql优化结果谁都无法预料。我在windows2008+sqlserver2005中的测试结果是没有索引一样快，有索引like快。

特别强调一下虽然是%%的like，索引还是起作用的。

测试数据如下：
<code>use tempdb
go
if (object_id ('t_test' )&#62; 0 )drop table t_test
go
create table t_test (f1 varchar (100 ), f2 varchar (100 ), f3 varchar (100 ))
go
insert into t_test select newid (), newid (), newid ()
go 1000

create index i_test on t_test (f1 )
go</code>

我们看两组sql语句的查询计划

第一组是：

<code>select * from t_test where f1 like '%abc%'
select * from t_test where charindex ('abc' , f1 )&#62; 0</code>结果如下：

 <img alt="" src="http://p.blog.csdn.net/images/p_blog_csdn_net/jinjazz/EntryImages/20090914/cc.jpg" title="http://p.blog.csdn.net/images/p_blog_csdn_net/jinjazz/EntryImages/20090914/cc.jpg" class="alignnone" width="534" height="360" />

很明显是like因为有索引扫描(rid是行标志符)而速度快于charindex，这里我们需要理解表扫描，索引扫描和索引查找的区别。为了说明这个问题，我们再看一下 like 'abc%'和charindex('abc',f1)=1的区别。

 <img src="http://p.blog.csdn.net/images/p_blog_csdn_net/jinjazz/EntryImages/20090914/bb.jpg" alt="http://p.blog.csdn.net/images/p_blog_csdn_net/jinjazz/EntryImages/20090914/bb.jpg" />

如果你测试一下，就会知道，charindex('abc',f1)=1和charindex('abc',f1)&#62;0的效率是一样的。这样我们就能看出来，索引查找要比索引扫描快，索引扫描要比表扫描快。大概解释一下我个人的理解，索引的存储方式是一个特定数据结构的树，查找可以被优化，不必遍历整个树的所有节点所以最快，而索引扫描需要遍历所有树的节点所以稍慢但仍然要比表扫描快。

 

本文来自CSDN博客，转载请标明出处：<a href="http://blog.csdn.net/jinjazz/archive/2009/09/14/4551008.aspx">http://blog.csdn.net/jinjazz/archive/2009/09/14/4551008.aspx</a>]]></description>
		<wfw:commentRss>http://www.wumain.com/php/blog/archives/56/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>ATI 5870</title>
		<link>http://www.wumain.com/php/blog/archives/48</link>
		<comments>http://www.wumain.com/php/blog/archives/48#comments</comments>
		<pubDate>Mon, 14 Sep 2009 16:31:09 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[兴趣]]></category>
		<category><![CDATA[5870]]></category>
		<category><![CDATA[ATI]]></category>
		<category><![CDATA[RV870]]></category>

		<guid isPermaLink="false">http://www.wumain.com/php/blog/?p=48</guid>
		<description><![CDATA[[gallery columns="5"]]]></description>
		<wfw:commentRss>http://www.wumain.com/php/blog/archives/48/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>PES2010</title>
		<link>http://www.wumain.com/php/blog/archives/7</link>
		<comments>http://www.wumain.com/php/blog/archives/7#comments</comments>
		<pubDate>Mon, 14 Sep 2009 15:45:19 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[心情]]></category>

		<guid isPermaLink="false">http://www.wumain.com/php/blog/?p=7</guid>
		<description><![CDATA[<img class="alignnone" title="PES2010" src="http://bbs.chiphell.com/attachments/month_0908/0908262030b398923934633e83.jpg" alt="" width="750" height="1060" />]]></description>
		<wfw:commentRss>http://www.wumain.com/php/blog/archives/7/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>2009年超经典流行回复语&#8212;&#8212;精辟!!</title>
		<link>http://www.wumain.com/php/blog/archives/4</link>
		<comments>http://www.wumain.com/php/blog/archives/4#comments</comments>
		<pubDate>Fri, 11 Sep 2009 18:06:58 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[心情]]></category>

		<guid isPermaLink="false">http://www.wumain.com/php/Blog/?p=4</guid>
		<description><![CDATA[<strong><span style="font-family: 幼圆;"><span style="font-size: small;"><span style="color: #0000ff;">1.你的仇人在上厕所时，没纸出不来，你怎么办？？——给他一卷透明胶带

2.你前任结婚了，你愿意参加她婚礼吗？——我只想参加丫的葬礼！

3.半夜遇见劫匪，他说不唱歌不让你走，你会唱什么？——好汉歌。。。

4.说真的，你整过容么？——我肚子是隆的。。。

5.如果情敌掉水里了，你会怎么样？——尿尿。。。

6.你觉得你本人好看，还是照片好看？——关灯好看。。。

7.雀斑，高度近视，大饼脸，象腿，粗腰，让你选一个当老婆，你会选择？——我会选择男人。。。

8.我爸爸突然对我说，我比李嘉诚有钱，你会说？——该吃药了

9.抽烟的男人有味道，还是喝酒的男人有味道？——不洗澡的有。。。

10.13个小朋友分9个橘子，如何分才公平？——掐死四个！

11.每天让你挣扎的事情是什么？——便秘。。。

12.对联：找工作找好工作。 找老公找好老公 横批？——做梦。。。

13.公交车上你睡着了，醒来后想的是什么？——啊。。。我还活着吗？（因为我是司机）

14.现在，眼睛离开电脑屏幕，向右看，看到了什么，告诉我？——我爹的巴掌，他妈的几点了还不睡觉！！！

15.你身上哪些部位被人赞美过？——指甲，小时候门卫赵大妈老夸我，哟，这孩子的指甲长得真像刘德华的 ！！！

16.我酒喝多了突然抓着你的手,然后对你说我喜欢你很久了你怎么办 ——对不起，我已经娶了你女儿了.

17.如果死后，在奈何桥看到孟婆，给你喝孟婆汤，你说什么 ——奶奶个腿！又TMD的掺水了！！！

18.身上最刻骨铭心的那条伤疤是怎么来的 ——出生的时候那个狠心肠的医生剪的.

19.眼泪要流出来嘚时候不想被别人看见，伱会怎么做？——用手捂着别人的眼睛.

20.你心目中 最想养的宠物是什麽？？？——奥特曼

21.放弃一个人，想忘记，最有效的方法是？——研究奥特曼

22.有人撒你一身油，对你说：别担心，有奥妙全自动，你咋办？——打到他肾亏，对他说“别担心，有六味地黄丸，治肾亏，不含糖。”

24.一个人动不动就去星巴客，抱个笔记本一坐一下午，你怎么看？——总比抱笔记本坐永和豆浆强.

25.有人对你说，我家冲马桶都用矿泉水，你怎么回应？——老子尿出来的都是皇家礼砲！

26.你的某个长得还不错的异性朋友半夜给你打电话要和你出去开房ML，你怎么办？——滚蛋！老子是正经人！别他妈勾引我－－－－－－－－－－－－－－－－－－－去哪？

27.双胞胎，哥哥叫天龙，弟弟叫啥好？——八部

28.两个女孩都喜欢你，一个漂亮有才华，一个温柔会持家，你选？——先把家里的离了

29.如果非要在（1李宇春2芙蓉姐姐3如花4吕秀莲）选一个，然后立刻洞房，你选什么——　　选死－－－

30.玩qq你偷到的最值钱是什么？——网吧的鼠标．．．

31.显示器画面不停地轻微抖动，有什么办法？----你也不停地抖动，当你的<span onclick="tagshow(event)">频率</span>和振幅与显示器画面一致时，你就感觉不出来了。 　　

32.巫师为什么要骑扫把不骑板凳呢？-----因为骑扫把比骑板凳帅多了，而且遇到敌人(强大的，自己打不过)就可以伪装成扫地工。 　　

33.市场上有增肥药吗？吃什么东西能胖一点？越简单越好！-----有，只要一会儿就马上变肥。方法是找个马蜂窝，用手伸进去搅拌两下，呵，只要一会儿，保证肥得连老妈都不认识你了。 　　

34.宝宝将在2009年8月诞生,爸姓章，妈姓王，请大家起个名，最好是双字名,且是动宾结构的.------章鱼王</span></span></span></strong>]]></description>
		<wfw:commentRss>http://www.wumain.com/php/blog/archives/4/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Hello world!</title>
		<link>http://www.wumain.com/php/blog/archives/1</link>
		<comments>http://www.wumain.com/php/blog/archives/1#comments</comments>
		<pubDate>Fri, 11 Sep 2009 17:36:55 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://www.wumain.com/php/Blog/?p=1</guid>
		<description><![CDATA[Welcome to WordPress. This is your first post. Edit or delete it, then start blogging!]]></description>
		<wfw:commentRss>http://www.wumain.com/php/blog/archives/1/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

