<?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>振之博文--一个web前端开发者的日志</title>
	<atom:link href="http://www.men-ideal.com/feed" rel="self" type="application/rss+xml" />
	<link>http://www.men-ideal.com</link>
	<description>天行健、君子以自强不息；地势坤、君子以厚德载物！</description>
	<lastBuildDate>Wed, 11 Aug 2010 03:48:49 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.6</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>你真的了解prototype吗？</title>
		<link>http://www.men-ideal.com/archives/519</link>
		<comments>http://www.men-ideal.com/archives/519#comments</comments>
		<pubDate>Wed, 11 Aug 2010 03:48:49 +0000</pubDate>
		<dc:creator>zhenn</dc:creator>
				<category><![CDATA[javascript]]></category>
		<category><![CDATA[OOP]]></category>

		<guid isPermaLink="false">http://www.men-ideal.com/?p=519</guid>
		<description><![CDATA[JavaScript中的prototype，即构造函数的原型对象，我想对于使用过JavaScript oo模式编程的你来说，肯定都能很好的利用prototype的特性来编写出优美的面向对象的代码，因为它的确很好用。但是你真的足够了解prototype吗？
首先我觉得，在分析prototype之前，应该先了解为什么要使用prototype来实现继承，而并不是把所有属性写到构造函数内部，那么这样做优势体现在哪里呢，如果你跟我有一样的困惑，请看如下两段代码：
/*代码1*/
var&#160;F = function(){
&#160; &#160; this.a = 1;
&#160; &#160; this.b = 2;
&#160; &#160; this.c = 3;
&#160; &#160; this.d = 4;
&#160; &#160; this.e = 5;
&#160; &#160; this.f = 6;
};
for(var&#160;i=0;i&#60;100000;i++){
&#160; &#160; eval('var f' + i + '= new F;');
}
/*代码2*/
var&#160;F = function(){};
F.prototype = {
&#160; &#160; a: 1,
&#160; &#160; b: 2,
&#160; &#160; c: 3,
&#160; &#160; d: 4,
&#160; &#160; e: [...]]]></description>
			<content:encoded><![CDATA[<p>JavaScript中的prototype，即构造函数的原型对象，我想对于使用过JavaScript oo模式编程的你来说，肯定都能很好的利用prototype的特性来编写出优美的面向对象的代码，因为它的确很好用。但是你真的足够了解prototype吗？</p>
<p>首先我觉得，在分析prototype之前，应该先了解为什么要使用prototype来实现继承，而并不是把所有属性写到构造函数内部，那么这样做优势体现在哪里呢，如果你跟我有一样的困惑，请看如下两段代码：</p>
<div class="hl-surround"><ol class="hl-main ln-show" title="Double click to hide line number." ondblclick = "linenumber(this)"><li class="hl-firstline"><span style="color: #ffa500;">/*代码1*/</span></li>
<li><span style="color: Green;">var</span><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">F</span><span style="color: Gray;"> = </span><span style="color: Green;">function</span><span style="color: Olive;">(){</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Green;">this</span><span style="color: Gray;">.</span><span style="color: Blue;">a</span><span style="color: Gray;"> = </span><span style="color: Maroon;">1</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Green;">this</span><span style="color: Gray;">.</span><span style="color: Blue;">b</span><span style="color: Gray;"> = </span><span style="color: Maroon;">2</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Green;">this</span><span style="color: Gray;">.</span><span style="color: Blue;">c</span><span style="color: Gray;"> = </span><span style="color: Maroon;">3</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Green;">this</span><span style="color: Gray;">.</span><span style="color: Blue;">d</span><span style="color: Gray;"> = </span><span style="color: Maroon;">4</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Green;">this</span><span style="color: Gray;">.</span><span style="color: Blue;">e</span><span style="color: Gray;"> = </span><span style="color: Maroon;">5</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Green;">this</span><span style="color: Gray;">.</span><span style="color: Blue;">f</span><span style="color: Gray;"> = </span><span style="color: Maroon;">6</span><span style="color: Gray;">;</span></li>
<li><span style="color: Olive;">}</span><span style="color: Gray;">;</span></li>
<li><span style="color: Green;">for</span><span style="color: Olive;">(</span><span style="color: Green;">var</span><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">i</span><span style="color: Gray;">=</span><span style="color: Maroon;">0</span><span style="color: Gray;">;</span><span style="color: Blue;">i</span><span style="color: Gray;">&lt;</span><span style="color: Maroon;">100000</span><span style="color: Gray;">;</span><span style="color: Blue;">i</span><span style="color: Gray;">++</span><span style="color: Olive;">){</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Blue;">eval</span><span style="color: Olive;">(</span><span style="color: #8b0000;">'</span><span style="color: Red;">var f</span><span style="color: #8b0000;">'</span><span style="color: Gray;"> + </span><span style="color: Blue;">i</span><span style="color: Gray;"> + </span><span style="color: #8b0000;">'</span><span style="color: Red;">= new F;</span><span style="color: #8b0000;">'</span><span style="color: Olive;">)</span><span style="color: Gray;">;</span></li>
<li><span style="color: Olive;">}</span></li>
<li><span style="color: #ffa500;">/*代码2*/</span></li>
<li><span style="color: Green;">var</span><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">F</span><span style="color: Gray;"> = </span><span style="color: Green;">function</span><span style="color: Olive;">(){}</span><span style="color: Gray;">;</span></li>
<li><span style="color: Blue;">F</span><span style="color: Gray;">.</span><span style="color: Blue;">prototype</span><span style="color: Gray;"> = </span><span style="color: Olive;">{</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Blue;">a</span><span style="color: Gray;">: </span><span style="color: Maroon;">1</span><span style="color: Gray;">,</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Blue;">b</span><span style="color: Gray;">: </span><span style="color: Maroon;">2</span><span style="color: Gray;">,</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Blue;">c</span><span style="color: Gray;">: </span><span style="color: Maroon;">3</span><span style="color: Gray;">,</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Blue;">d</span><span style="color: Gray;">: </span><span style="color: Maroon;">4</span><span style="color: Gray;">,</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Blue;">e</span><span style="color: Gray;">: </span><span style="color: Maroon;">5</span><span style="color: Gray;">,</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Blue;">f</span><span style="color: Gray;">: </span><span style="color: Maroon;">6</span></li>
<li><span style="color: Olive;">}</span><span style="color: Gray;">;</span></li>
<li><span style="color: Green;">for</span><span style="color: Olive;">(</span><span style="color: Green;">var</span><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">i</span><span style="color: Gray;">=</span><span style="color: Maroon;">0</span><span style="color: Gray;">;</span><span style="color: Blue;">i</span><span style="color: Gray;">&lt;</span><span style="color: Maroon;">100000</span><span style="color: Gray;">;</span><span style="color: Blue;">i</span><span style="color: Gray;">++</span><span style="color: Olive;">){</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Blue;">eval</span><span style="color: Olive;">(</span><span style="color: #8b0000;">'</span><span style="color: Red;">var f</span><span style="color: #8b0000;">'</span><span style="color: Gray;"> + </span><span style="color: Blue;">i</span><span style="color: Gray;"> + </span><span style="color: #8b0000;">'</span><span style="color: Red;">= new F;</span><span style="color: #8b0000;">'</span><span style="color: Olive;">)</span><span style="color: Gray;">;</span></li>
<li><span style="color: Olive;">}</span></li></ol></div>
<p>在浏览器中分别执行两段代码，观察浏览器的内存占用情况（数据量比较大，等待脚本执行完毕，浏览器稳定后的数据），如下图：</p>
<p><img class="alignnone size-full wp-image-523" title="ssss" src="http://www.men-ideal.com/wp-content/uploads/2010/08/ssss.png" alt="ssss" width="548" height="162" /></p>
<p>从图片中的数据不难看出，在Firefox中，把所有属性全部写到构造的原型对象中，生成100000个实例对象时，占用内存会比把所有属性全部写到构造内部少15M，而在IE中，这个差距竟然达到97M，匪夷所思啊，神奇的IE。这也就是为什么写oo代码时，总是喜欢把类的一些属性和方法写到它的原型对象中，在达到同样目的的前提下节省内存的使用率，我想没有哪一个人愿意拒绝这样的做法。</p>
<p>缘何使用prototype会节省内存空间呢？我觉得有必要了解JavaScript中类的实例化过程。</p>
<div class="hl-surround"><ol class="hl-main ln-show" title="Double click to hide line number." ondblclick = "linenumber(this)"><li class="hl-firstline"><span style="color: Green;">var</span><span style="color: Gray;"> </span><span style="color: Blue;">F</span><span style="color: Gray;"> = </span><span style="color: Green;">function</span><span style="color: Olive;">(){</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Green;">this</span><span style="color: Gray;">.</span><span style="color: Blue;">a</span><span style="color: Gray;"> = </span><span style="color: Maroon;">1</span><span style="color: Gray;">;&nbsp; &nbsp; </span></li>
<li><span style="color: Olive;">}</span><span style="color: Gray;">;</span></li>
<li><span style="color: Blue;">F</span><span style="color: Gray;">.</span><span style="color: Blue;">prototype</span><span style="color: Gray;"> = </span><span style="color: Olive;">{</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Blue;">a</span><span style="color: Gray;">: </span><span style="color: Maroon;">2</span><span style="color: Gray;">&nbsp; &nbsp; </span></li>
<li><span style="color: Olive;">}</span><span style="color: Gray;">;</span></li>
<li><span style="color: Green;">var</span><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">f</span><span style="color: Gray;"> = </span><span style="color: Green;">new</span><span style="color: Gray;"> </span><span style="color: Blue;">F</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span></li>
<li><span style="color: #ffa500;">/*new F的过程*/</span></li>
<li><span style="color: Green;">var</span><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">f</span><span style="color: Gray;"> = </span><span style="color: Olive;">{}</span><span style="color: Gray;">;&nbsp; &nbsp; </span><span style="color: #ffa500;">//创建空对象</span></li>
<li><span style="color: Blue;">f</span><span style="color: Gray;">.</span><span style="color: Blue;">__proto__</span><span style="color: Gray;"> = </span><span style="color: Blue;">F</span><span style="color: Gray;">.</span><span style="color: Blue;">prototype</span><span style="color: Gray;">;&nbsp; </span><span style="color: #ffa500;">//设置对原型对象的引用</span></li>
<li><span style="color: Blue;">F</span><span style="color: Gray;">.</span><span style="color: Blue;">call</span><span style="color: Olive;">(</span><span style="color: Blue;">f</span><span style="color: Olive;">)</span><span style="color: Gray;">;&nbsp; &nbsp;&nbsp; </span><span style="color: #ffa500;">//拷贝构造中的属性，初始化对象</span></li></ol></div>
<p>通过这个实例化过程，可以看到，在每个实例化对象中，如果构造中属性全部放到原型对象中来实现继承（所谓的原型链继承），并不是拷贝原型中的全部属性到自身所占的空间内，而是通过__proto__来实现对F.prototype的引用，显而易见，这样做更能节省内存空间。</p>
<p>事实上，这个过程可以解释我们再开发中遇到的很多问题，比如，在构造内部定义的属性要比在原型中定义的属性优先级要高，正如上述代码片段，f.a =1而不是f.a=2，就是因为对原型对象的引用发生在对象初始化之前，详细见下图：</p>
<p><img src="http://www.men-ideal.com/wp-content/uploads/2010/08/dddd.gif" alt="dddd" title="dddd" width="589" height="386" class="alignnone size-full wp-image-533" /></p>
<p>另外一个问题，修改原型对象中的属性或方法，即使在实例化之后，依然会奏效，这里需要注意的是，这个修改的过程需在F.prototype指向的原始对象上修改，不要试图将prototype重新指向一个新的对象，因为在<strong>实例化之后</strong>，在实例对象f中查找某个属性时，依然会从F.prototype指向的原始对象中查找，也就是说并不没有改变f.__proto__的指向，虽然我们期望看到他重新指向一个新的对象。</p>
<p><strong>PS：</strong>说了很多，重点只有一个，就是深刻类的实例化过程，这才是JavaScript原型继承的本质。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.men-ideal.com/archives/519/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>关于IE透明度失效的问题</title>
		<link>http://www.men-ideal.com/archives/509</link>
		<comments>http://www.men-ideal.com/archives/509#comments</comments>
		<pubDate>Tue, 27 Jul 2010 02:51:49 +0000</pubDate>
		<dc:creator>zhenn</dc:creator>
				<category><![CDATA[html+css]]></category>
		<category><![CDATA[滤镜]]></category>

		<guid isPermaLink="false">http://www.men-ideal.com/?p=509</guid>
		<description><![CDATA[近期项目中，发现这个诡异的问题，IE（以下如有特殊说明，指全部IE系列浏览器）下透明滤镜竟然会失效。起因在于，在做一个lightbox时，发现遮罩层透明效果是失效的，在第一时间里，我当然是把问题定位在YUI组建设计的缺陷上，但是当我用IE调试工具看到遮罩层渲染的样式时，我震惊了。如下图：

从渲染的css上看，没有任何问题，百思不得其解，更为让我疑惑的是，在我同事的机器上，遮罩层的透明效果是有的，难道我RP有问题？太不可思议了。
既然问题出了，就要去想办法解决，没有任何回避的理由，经过一番细心的排查，发现我和同事的机器唯一的差别就在于装的操作系统不一样，他的是XP，而我机器上装的是WIN7。这可能就是问题的所在了，但是细想，WIN7不可能不支持filter-alpha-opacity的，这样的结论相信没有人相信，因为我看到我以前写的遮罩层组件是可以正常工作的，所以排除WIN7不支持alpha的可能，那么问题到底出在哪里呢，请看可以正常工作的遮罩层CSS：

如果你足够细心，我想应该会发现区别在哪儿，没错，就是高度不一样，一个是20000px（失效），一个是1801px（有效）。既然高度会影响filter的渲染，那么肯定会有一个临界点，事实证明，的确如我所料，在WIN7的环境中，如果元素的高度超过4096px，就一定会导致filter-alpha-opacity失效，而这一切在XP环境中并不会发生，真是验证了一句话，在MS的世界里，没有什么不可能！
拓展：在vista系统中，也存在相同的问题，元素高度的临界点为2048px。所谓标准浏览器（firefox、chrome、safari之流）中，opacity渲染的透明度是跨系统的，不会存在失效问题
PS：邪恶的WIN7，邪恶的IE，永远遭我BS.
]]></description>
			<content:encoded><![CDATA[<p>近期项目中，发现这个诡异的问题，IE（以下如有特殊说明，指全部IE系列浏览器）下透明滤镜竟然会失效。起因在于，在做一个lightbox时，发现遮罩层透明效果是失效的，在第一时间里，我当然是把问题定位在YUI组建设计的缺陷上，但是当我用IE调试工具看到遮罩层渲染的样式时，我震惊了。如下图：</p>
<p><img class="alignnone size-full wp-image-511" title="ss" src="http://www.men-ideal.com/wp-content/uploads/2010/07/ss.png" alt="ss" width="314" height="105" /></p>
<p>从渲染的css上看，没有任何问题，百思不得其解，更为让我疑惑的是，在我同事的机器上，遮罩层的透明效果是有的，难道我RP有问题？太不可思议了。</p>
<p>既然问题出了，就要去想办法解决，没有任何回避的理由，经过一番细心的排查，发现我和同事的机器唯一的差别就在于装的操作系统不一样，他的是XP，而我机器上装的是WIN7。这可能就是问题的所在了，但是细想，WIN7不可能不支持filter-alpha-opacity的，这样的结论相信没有人相信，因为我看到我以前写的遮罩层组件是可以正常工作的，所以排除WIN7不支持alpha的可能，那么问题到底出在哪里呢，请看可以正常工作的遮罩层CSS：</p>
<p><img class="alignnone size-full wp-image-514" title="ssss" src="http://www.men-ideal.com/wp-content/uploads/2010/07/ssss.png" alt="ssss" width="407" height="277" /></p>
<p>如果你足够细心，我想应该会发现区别在哪儿，没错，就是高度不一样，一个是20000px（失效），一个是1801px（有效）。既然高度会影响filter的渲染，那么肯定会有一个临界点，事实证明，的确如我所料，在WIN7的环境中，如果元素的高度超过4096px，就一定会导致filter-alpha-opacity失效，而这一切在XP环境中并不会发生，真是验证了一句话，在MS的世界里，没有什么不可能！</p>
<p><strong>拓展：</strong>在vista系统中，也存在相同的问题，元素高度的临界点为2048px。所谓标准浏览器（firefox、chrome、safari之流）中，opacity渲染的透明度是跨系统的，不会存在失效问题</p>
<p><strong>PS：</strong>邪恶的WIN7，邪恶的IE，永远遭我BS.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.men-ideal.com/archives/509/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>基于ajax异步请求的选项卡</title>
		<link>http://www.men-ideal.com/archives/497</link>
		<comments>http://www.men-ideal.com/archives/497#comments</comments>
		<pubDate>Mon, 05 Jul 2010 15:30:08 +0000</pubDate>
		<dc:creator>zhenn</dc:creator>
				<category><![CDATA[javascript]]></category>
		<category><![CDATA[ajax]]></category>
		<category><![CDATA[选项卡]]></category>

		<guid isPermaLink="false">http://www.men-ideal.com/?p=497</guid>
		<description><![CDATA[关于ajax异步请求的tab技术很常见，在很多门户网站上都可以看到他的身影，特别是在频道首页，这样做的目的是显而易见的，分步请求数据，减缓服务器的压力，带来更为流畅的用户体验。如下图：

设计起来当然不是什么问题，就是一个特殊的和服务器有通信的tab而已，在首轮tab切换过程中，发送一个XHR，然后再把Server响应的数据（基本上是html字串）塞到相应的容器中即可。这个过程中有个问题需要注意，在每个选项点击第一次之后，已经把所需要的数据加载到客户端，那么再次切换的时候就没有必要重新请求服务器了，这样做的依据就是判断内容容器中的innerHTML是否为空。
诚然，你如果真的反其道而行之，也并无过错，并不会影响网页功能的展现，但却是徒劳无益，反而加重服务器的负担，并且会影响到用户体验，这也就有被于使用ajax tab的初衷了。
同样的，详情请登录 ：Demo
]]></description>
			<content:encoded><![CDATA[<p>关于ajax异步请求的tab技术很常见，在很多门户网站上都可以看到他的身影，特别是在频道首页，这样做的目的是显而易见的，分步请求数据，减缓服务器的压力，带来更为流畅的用户体验。如下图：</p>
<p><img class="alignnone size-medium wp-image-502" title="ajaxtab" src="http://www.men-ideal.com/wp-content/uploads/2010/07/ajaxtab-300x126.png" alt="ajaxtab" width="300" height="126" /></p>
<p>设计起来当然不是什么问题，就是一个特殊的和服务器有通信的tab而已，在首轮tab切换过程中，发送一个XHR，然后再把Server响应的数据（基本上是html字串）塞到相应的容器中即可。这个过程中有个问题需要注意，在每个选项点击第一次之后，已经把所需要的数据加载到客户端，那么再次切换的时候就没有必要重新请求服务器了，这样做的依据就是判断内容容器中的innerHTML是否为空。</p>
<p>诚然，你如果真的反其道而行之，也并无过错，并不会影响网页功能的展现，但却是徒劳无益，反而加重服务器的负担，并且会影响到用户体验，这也就有被于使用ajax tab的初衷了。</p>
<p>同样的，详情请登录 ：<a href="http://www.men-ideal.com/demo/ajaxtab" target="_blank">Demo</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.men-ideal.com/archives/497/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>js浮点数运算的bug</title>
		<link>http://www.men-ideal.com/archives/487</link>
		<comments>http://www.men-ideal.com/archives/487#comments</comments>
		<pubDate>Sat, 03 Jul 2010 12:38:42 +0000</pubDate>
		<dc:creator>zhenn</dc:creator>
				<category><![CDATA[javascript]]></category>
		<category><![CDATA[基础知识]]></category>
		<category><![CDATA[浮点数]]></category>

		<guid isPermaLink="false">http://www.men-ideal.com/?p=487</guid>
		<description><![CDATA[老实说在今天之前，我对javascript的浮点数运算毫无认识，觉得应该和实际运算中一样，然而，有些事情往往会出人意料。
先看一组数据:
0.1 + 0.11 = 0.21000000000000002
0.2 * 3 = 0.6000000000000001
0.7 / 10 = 0.06999999999999999
你相信吗？如果不信，那么立即打开firefox浏览器测试吧。有一点可以确信，你看到测试结果的表情，一定先是惊讶，后来是迷惑。
这里有几个demo，再来看看出现浮点数运算bug的概率，猛击之：加法、乘法、除法
对于这样的结果，我不知道是怎么产生的，但是既然是bug，就一定是可以hack的，思路很简单，先把所有的运算数转成int型（表达不准确，javascript的没有int、float之分），计算出两个运算数的小数点后的位数，再进行适当的运算，就可以得到原始的我们期望看到的结果了。代码如下：
加法运算：
function add(num1,num2){
&#160; &#160; &#160; &#160; var&#160;reg = /\./i;
&#160; &#160; if(!reg.test(num1) &#38;&#38; !reg.test(num2)){
&#160; &#160; &#160; &#160; return&#160;num1 * num2;
&#160; &#160; }
&#160; &#160; var&#160;r1 = 0, r2 = 0, m;
&#160; &#160; var&#160;str1 = num1.toString(), str2 = num2.toString();
&#160; &#160; if(str1.indexOf('.')&#62;-1){
&#160; &#160; &#160; &#160; r1 = str1.split('.')[1].length;
&#160; [...]]]></description>
			<content:encoded><![CDATA[<p>老实说在今天之前，我对javascript的浮点数运算毫无认识，觉得应该和实际运算中一样，然而，有些事情往往会出人意料。</p>
<p>先看一组数据:<br />
0.1 + 0.11 = 0.21000000000000002<br />
0.2 * 3 = 0.6000000000000001<br />
0.7 / 10 = 0.06999999999999999</p>
<p>你相信吗？如果不信，那么立即打开firefox浏览器测试吧。有一点可以确信，你看到测试结果的表情，一定先是惊讶，后来是迷惑。</p>
<p>这里有几个demo，再来看看出现浮点数运算bug的概率，猛击之：<a target="_blank" href="http://www.men-ideal.com/demo/jsfloat/floatnum_add.html">加法</a>、<a target="_blank" href="http://www.men-ideal.com/demo/jsfloat/floatnum_mul.html">乘法</a>、<a target="_blank" href="http://www.men-ideal.com/demo/jsfloat/floatnum_div.html">除法</a></p>
<p>对于这样的结果，我不知道是怎么产生的，但是既然是bug，就一定是可以hack的，思路很简单，先把所有的运算数转成int型（表达不准确，javascript的没有int、float之分），计算出两个运算数的小数点后的位数，再进行适当的运算，就可以得到原始的我们期望看到的结果了。代码如下：</p>
<p><strong>加法运算：</strong></p>
<div class="hl-surround"><ol class="hl-main ln-show" title="Double click to hide line number." ondblclick = "linenumber(this)"><li class="hl-firstline"><span style="color: Green;">function</span><span style="color: Gray;"> </span><span style="color: Blue;">add</span><span style="color: Olive;">(</span><span style="color: Blue;">num1</span><span style="color: Gray;">,</span><span style="color: Blue;">num2</span><span style="color: Olive;">){</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Green;">var</span><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">reg</span><span style="color: Gray;"> = </span><span style="color: #8b0000;">/</span><span style="color: Red;">\.</span><span style="color: #8b0000;">/i</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Green;">if</span><span style="color: Olive;">(</span><span style="color: Gray;">!</span><span style="color: Blue;">reg</span><span style="color: Gray;">.</span><span style="color: Blue;">test</span><span style="color: Olive;">(</span><span style="color: Blue;">num1</span><span style="color: Olive;">)</span><span style="color: Gray;"> &amp;&amp; !</span><span style="color: Blue;">reg</span><span style="color: Gray;">.</span><span style="color: Blue;">test</span><span style="color: Olive;">(</span><span style="color: Blue;">num2</span><span style="color: Olive;">)){</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Green;">return</span><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">num1</span><span style="color: Gray;"> * </span><span style="color: Blue;">num2</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Olive;">}</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Green;">var</span><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">r1</span><span style="color: Gray;"> = </span><span style="color: Maroon;">0</span><span style="color: Gray;">, </span><span style="color: Blue;">r2</span><span style="color: Gray;"> = </span><span style="color: Maroon;">0</span><span style="color: Gray;">, </span><span style="color: Blue;">m</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Green;">var</span><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">str1</span><span style="color: Gray;"> = </span><span style="color: Blue;">num1</span><span style="color: Gray;">.</span><span style="color: Blue;">toString</span><span style="color: Olive;">()</span><span style="color: Gray;">, </span><span style="color: Blue;">str2</span><span style="color: Gray;"> = </span><span style="color: Blue;">num2</span><span style="color: Gray;">.</span><span style="color: Blue;">toString</span><span style="color: Olive;">()</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Green;">if</span><span style="color: Olive;">(</span><span style="color: Blue;">str1</span><span style="color: Gray;">.</span><span style="color: Blue;">indexOf</span><span style="color: Olive;">(</span><span style="color: #8b0000;">'</span><span style="color: Red;">.</span><span style="color: #8b0000;">'</span><span style="color: Olive;">)</span><span style="color: Gray;">&gt;-</span><span style="color: Maroon;">1</span><span style="color: Olive;">){</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Blue;">r1</span><span style="color: Gray;"> = </span><span style="color: Blue;">str1</span><span style="color: Gray;">.</span><span style="color: Blue;">split</span><span style="color: Olive;">(</span><span style="color: #8b0000;">'</span><span style="color: Red;">.</span><span style="color: #8b0000;">'</span><span style="color: Olive;">)[</span><span style="color: Maroon;">1</span><span style="color: Olive;">]</span><span style="color: Gray;">.</span><span style="color: Blue;">length</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Olive;">}</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Green;">if</span><span style="color: Olive;">(</span><span style="color: Blue;">str2</span><span style="color: Gray;">.</span><span style="color: Blue;">indexOf</span><span style="color: Olive;">(</span><span style="color: #8b0000;">'</span><span style="color: Red;">.</span><span style="color: #8b0000;">'</span><span style="color: Olive;">)</span><span style="color: Gray;">&gt;-</span><span style="color: Maroon;">1</span><span style="color: Olive;">){</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Blue;">r2</span><span style="color: Gray;"> = </span><span style="color: Blue;">str2</span><span style="color: Gray;">.</span><span style="color: Blue;">split</span><span style="color: Olive;">(</span><span style="color: #8b0000;">'</span><span style="color: Red;">.</span><span style="color: #8b0000;">'</span><span style="color: Olive;">)[</span><span style="color: Maroon;">1</span><span style="color: Olive;">]</span><span style="color: Gray;">.</span><span style="color: Blue;">length</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Olive;">}</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Blue;">m</span><span style="color: Gray;"> = </span><span style="color: Teal;">Math</span><span style="color: Gray;">.</span><span style="color: Blue;">pow</span><span style="color: Olive;">(</span><span style="color: Maroon;">10</span><span style="color: Gray;">,</span><span style="color: Teal;">Math</span><span style="color: Gray;">.</span><span style="color: Blue;">max</span><span style="color: Olive;">(</span><span style="color: Blue;">r1</span><span style="color: Gray;">,</span><span style="color: Blue;">r2</span><span style="color: Olive;">))</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Green;">return</span><span style="color: Gray;">&nbsp;</span><span style="color: Olive;">(</span><span style="color: Blue;">mul</span><span style="color: Olive;">(</span><span style="color: Blue;">num1</span><span style="color: Gray;">,</span><span style="color: Blue;">m</span><span style="color: Olive;">)</span><span style="color: Gray;"> + </span><span style="color: Blue;">mul</span><span style="color: Olive;">(</span><span style="color: Blue;">num2</span><span style="color: Gray;">,</span><span style="color: Blue;">m</span><span style="color: Olive;">))</span><span style="color: Gray;"> </span><span style="color: #8b0000;">/</span><span style="color: Red;"> m;</span></li>
<li><span style="color: Red;">}</span></li></ol></div>
<p><strong>乘法运算：</strong></p>
<div class="hl-surround"><ol class="hl-main ln-show" title="Double click to hide line number." ondblclick = "linenumber(this)"><li class="hl-firstline"><span style="color: Green;">function</span><span style="color: Gray;"> </span><span style="color: Blue;">mul</span><span style="color: Olive;">(</span><span style="color: Blue;">num1</span><span style="color: Gray;">,</span><span style="color: Blue;">num2</span><span style="color: Olive;">){</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Green;">var</span><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">reg</span><span style="color: Gray;"> = </span><span style="color: #8b0000;">/</span><span style="color: Red;">\.</span><span style="color: #8b0000;">/i</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Green;">if</span><span style="color: Olive;">(</span><span style="color: Gray;">!</span><span style="color: Blue;">reg</span><span style="color: Gray;">.</span><span style="color: Blue;">test</span><span style="color: Olive;">(</span><span style="color: Blue;">num1</span><span style="color: Olive;">)</span><span style="color: Gray;"> &amp;&amp; !</span><span style="color: Blue;">reg</span><span style="color: Gray;">.</span><span style="color: Blue;">test</span><span style="color: Olive;">(</span><span style="color: Blue;">num2</span><span style="color: Olive;">)){</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Green;">return</span><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">num1</span><span style="color: Gray;"> * </span><span style="color: Blue;">num2</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Olive;">}</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Green;">var</span><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">len</span><span style="color: Gray;"> = </span><span style="color: Maroon;">0</span><span style="color: Gray;">, </span><span style="color: Blue;">str1</span><span style="color: Gray;"> = </span><span style="color: Blue;">num1</span><span style="color: Gray;">.</span><span style="color: Blue;">toString</span><span style="color: Olive;">()</span><span style="color: Gray;">, </span><span style="color: Blue;">str2</span><span style="color: Gray;"> = </span><span style="color: Blue;">num2</span><span style="color: Gray;">.</span><span style="color: Blue;">toString</span><span style="color: Olive;">()</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Green;">if</span><span style="color: Olive;">(</span><span style="color: Blue;">str1</span><span style="color: Gray;">.</span><span style="color: Blue;">indexOf</span><span style="color: Olive;">(</span><span style="color: #8b0000;">'</span><span style="color: Red;">.</span><span style="color: #8b0000;">'</span><span style="color: Olive;">)</span><span style="color: Gray;">&gt;=</span><span style="color: Maroon;">0</span><span style="color: Olive;">){</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Blue;">len</span><span style="color: Gray;"> += </span><span style="color: Blue;">str1</span><span style="color: Gray;">.</span><span style="color: Blue;">split</span><span style="color: Olive;">(</span><span style="color: #8b0000;">'</span><span style="color: Red;">.</span><span style="color: #8b0000;">'</span><span style="color: Olive;">)[</span><span style="color: Maroon;">1</span><span style="color: Olive;">]</span><span style="color: Gray;">.</span><span style="color: Blue;">length</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Olive;">}</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Green;">if</span><span style="color: Olive;">(</span><span style="color: Blue;">str2</span><span style="color: Gray;">.</span><span style="color: Blue;">indexOf</span><span style="color: Olive;">(</span><span style="color: #8b0000;">'</span><span style="color: Red;">.</span><span style="color: #8b0000;">'</span><span style="color: Olive;">)</span><span style="color: Gray;">&gt;=</span><span style="color: Maroon;">0</span><span style="color: Olive;">){</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Blue;">len</span><span style="color: Gray;"> += </span><span style="color: Blue;">str2</span><span style="color: Gray;">.</span><span style="color: Blue;">split</span><span style="color: Olive;">(</span><span style="color: #8b0000;">'</span><span style="color: Red;">.</span><span style="color: #8b0000;">'</span><span style="color: Olive;">)[</span><span style="color: Maroon;">1</span><span style="color: Olive;">]</span><span style="color: Gray;">.</span><span style="color: Blue;">length</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Olive;">}</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Green;">return</span><span style="color: Gray;">&nbsp;</span><span style="color: Teal;">Number</span><span style="color: Olive;">(</span><span style="color: Blue;">str1</span><span style="color: Gray;">.</span><span style="color: Blue;">replace</span><span style="color: Olive;">(</span><span style="color: #8b0000;">'</span><span style="color: Red;">.</span><span style="color: #8b0000;">'</span><span style="color: Gray;">,</span><span style="color: #8b0000;">''</span><span style="color: Olive;">))</span><span style="color: Gray;"> * </span><span style="color: Teal;">Number</span><span style="color: Olive;">(</span><span style="color: Blue;">str2</span><span style="color: Gray;">.</span><span style="color: Blue;">replace</span><span style="color: Olive;">(</span><span style="color: #8b0000;">'</span><span style="color: Red;">.</span><span style="color: #8b0000;">'</span><span style="color: Gray;">,</span><span style="color: #8b0000;">''</span><span style="color: Olive;">))</span><span style="color: Gray;"> </span><span style="color: #8b0000;">/</span><span style="color: Red;"> Math.pow(10,len);</span></li>
<li><span style="color: Red;">}</span></li></ol></div>
<p><strong>除法运算：</strong></p>
<div class="hl-surround"><ol class="hl-main ln-show" title="Double click to hide line number." ondblclick = "linenumber(this)"><li class="hl-firstline"><span style="color: Green;">function</span><span style="color: Gray;"> </span><span style="color: Blue;">div</span><span style="color: Olive;">(</span><span style="color: Blue;">num1</span><span style="color: Gray;">,</span><span style="color: Blue;">num2</span><span style="color: Olive;">){</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Green;">var</span><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">reg</span><span style="color: Gray;"> = </span><span style="color: #8b0000;">/</span><span style="color: Red;">\.</span><span style="color: #8b0000;">/i</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Green;">if</span><span style="color: Olive;">(</span><span style="color: Gray;">!</span><span style="color: Blue;">reg</span><span style="color: Gray;">.</span><span style="color: Blue;">test</span><span style="color: Olive;">(</span><span style="color: Blue;">num1</span><span style="color: Olive;">)</span><span style="color: Gray;"> &amp;&amp; !</span><span style="color: Blue;">reg</span><span style="color: Gray;">.</span><span style="color: Blue;">test</span><span style="color: Olive;">(</span><span style="color: Blue;">num2</span><span style="color: Olive;">)){</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Green;">return</span><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">num1</span><span style="color: Gray;"> * </span><span style="color: Blue;">num2</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Olive;">}</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Green;">var</span><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">len1</span><span style="color: Gray;"> = </span><span style="color: Maroon;">0</span><span style="color: Gray;">, </span><span style="color: Blue;">len2</span><span style="color: Gray;"> = </span><span style="color: Maroon;">0</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Green;">var</span><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">str1</span><span style="color: Gray;"> = </span><span style="color: Blue;">num1</span><span style="color: Gray;">.</span><span style="color: Blue;">toString</span><span style="color: Olive;">()</span><span style="color: Gray;">, </span><span style="color: Blue;">str2</span><span style="color: Gray;"> = </span><span style="color: Blue;">num2</span><span style="color: Gray;">.</span><span style="color: Blue;">toString</span><span style="color: Olive;">()</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: #ffa500;">//计算位数差</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Green;">if</span><span style="color: Olive;">(</span><span style="color: Blue;">str1</span><span style="color: Gray;">.</span><span style="color: Blue;">indexOf</span><span style="color: Olive;">(</span><span style="color: #8b0000;">'</span><span style="color: Red;">.</span><span style="color: #8b0000;">'</span><span style="color: Olive;">)</span><span style="color: Gray;">&gt;-</span><span style="color: Maroon;">1</span><span style="color: Olive;">){</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Blue;">len1</span><span style="color: Gray;"> = </span><span style="color: Blue;">str1</span><span style="color: Gray;">.</span><span style="color: Blue;">split</span><span style="color: Olive;">(</span><span style="color: #8b0000;">'</span><span style="color: Red;">.</span><span style="color: #8b0000;">'</span><span style="color: Olive;">)[</span><span style="color: Maroon;">1</span><span style="color: Olive;">]</span><span style="color: Gray;">.</span><span style="color: Blue;">length</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Olive;">}</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Green;">if</span><span style="color: Olive;">(</span><span style="color: Blue;">str2</span><span style="color: Gray;">.</span><span style="color: Blue;">indexOf</span><span style="color: Olive;">(</span><span style="color: #8b0000;">'</span><span style="color: Red;">.</span><span style="color: #8b0000;">'</span><span style="color: Olive;">)</span><span style="color: Gray;">&gt;-</span><span style="color: Maroon;">1</span><span style="color: Olive;">){</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Blue;">len2</span><span style="color: Gray;"> = </span><span style="color: Blue;">str2</span><span style="color: Gray;">.</span><span style="color: Blue;">split</span><span style="color: Olive;">(</span><span style="color: #8b0000;">'</span><span style="color: Red;">.</span><span style="color: #8b0000;">'</span><span style="color: Olive;">)[</span><span style="color: Maroon;">1</span><span style="color: Olive;">]</span><span style="color: Gray;">.</span><span style="color: Blue;">length</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Olive;">}</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Green;">return</span><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">mul</span><span style="color: Olive;">(</span><span style="color: Teal;">Number</span><span style="color: Olive;">(</span><span style="color: Blue;">str1</span><span style="color: Gray;">.</span><span style="color: Blue;">replace</span><span style="color: Olive;">(</span><span style="color: #8b0000;">'</span><span style="color: Red;">.</span><span style="color: #8b0000;">'</span><span style="color: Gray;">,</span><span style="color: #8b0000;">''</span><span style="color: Olive;">))</span><span style="color: Gray;"> </span><span style="color: #8b0000;">/</span><span style="color: Red;"> Number(str2.replace('.','')),Math.pow(10,len2-len1));</span></li>
<li><span style="color: Red;">}</span></li></ol></div>
]]></content:encoded>
			<wfw:commentRss>http://www.men-ideal.com/archives/487/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>一个关于倒计时的类</title>
		<link>http://www.men-ideal.com/archives/482</link>
		<comments>http://www.men-ideal.com/archives/482#comments</comments>
		<pubDate>Sat, 26 Jun 2010 06:38:12 +0000</pubDate>
		<dc:creator>zhenn</dc:creator>
				<category><![CDATA[javascript]]></category>
		<category><![CDATA[倒计时]]></category>

		<guid isPermaLink="false">http://www.men-ideal.com/?p=482</guid>
		<description><![CDATA[近期在做排列五的彩票项目，每一期都有购彩时段，即用户打开这个排列五的页面时，会从服务器传来一个remaintime（离本次彩期结束的剩余时间），然后这个时间在客户端递减呈现给用户看，让用户获得本次彩期的剩余时间。
实现原理挺简单的，在此不在赘述，敬请猛击demo。
调用方法如下：
new TheTime({
&#160; &#160; //容器id
&#160; &#160; container: 'remaintime',
&#160; &#160; //服务器返回的剩余时间，单位为秒
&#160; &#160; remaintime: 10000,
&#160; &#160; //倒计时完成时的回调
&#160; &#160; callback: function(){
&#160; &#160; &#160; &#160; document.getElementById('remaintime').innerHTML = '已截止';
&#160; &#160; }
});
]]></description>
			<content:encoded><![CDATA[<p>近期在做排列五的彩票项目，每一期都有购彩时段，即用户打开这个排列五的页面时，会从服务器传来一个remaintime（离本次彩期结束的剩余时间），然后这个时间在客户端递减呈现给用户看，让用户获得本次彩期的剩余时间。</p>
<p>实现原理挺简单的，在此不在赘述，敬请猛击<a href="http://www.men-ideal.com/demo/remaintime.html" target="_blank">demo</a>。</p>
<p>调用方法如下：</p>
<div class="hl-surround"><ol class="hl-main ln-show" title="Double click to hide line number." ondblclick = "linenumber(this)"><li class="hl-firstline"><span style="color: Green;">new</span><span style="color: Gray;"> </span><span style="color: Blue;">TheTime</span><span style="color: Olive;">({</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: #ffa500;">//容器id</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Blue;">container</span><span style="color: Gray;">: </span><span style="color: #8b0000;">'</span><span style="color: Red;">remaintime</span><span style="color: #8b0000;">'</span><span style="color: Gray;">,</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: #ffa500;">//服务器返回的剩余时间，单位为秒</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Blue;">remaintime</span><span style="color: Gray;">: </span><span style="color: Maroon;">10000</span><span style="color: Gray;">,</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: #ffa500;">//倒计时完成时的回调</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Blue;">callback</span><span style="color: Gray;">: </span><span style="color: Green;">function</span><span style="color: Olive;">(){</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Teal;">document</span><span style="color: Gray;">.</span><span style="color: Blue;">getElementById</span><span style="color: Olive;">(</span><span style="color: #8b0000;">'</span><span style="color: Red;">remaintime</span><span style="color: #8b0000;">'</span><span style="color: Olive;">)</span><span style="color: Gray;">.</span><span style="color: Blue;">innerHTML</span><span style="color: Gray;"> = </span><span style="color: #8b0000;">'</span><span style="color: Red;">已截止</span><span style="color: #8b0000;">'</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Olive;">}</span></li>
<li><span style="color: Olive;">})</span><span style="color: Gray;">;</span></li></ol></div>
]]></content:encoded>
			<wfw:commentRss>http://www.men-ideal.com/archives/482/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>基于yui3的组件开发</title>
		<link>http://www.men-ideal.com/archives/476</link>
		<comments>http://www.men-ideal.com/archives/476#comments</comments>
		<pubDate>Sat, 15 May 2010 05:54:38 +0000</pubDate>
		<dc:creator>zhenn</dc:creator>
				<category><![CDATA[web开发相关]]></category>
		<category><![CDATA[YUI]]></category>

		<guid isPermaLink="false">http://www.men-ideal.com/?p=476</guid>
		<description><![CDATA[从拔赤师兄的blog中看到的，对于我这样的YUI新手还是挺有意义的，特转载至此！

原文地址：http://www.uedmagazine.com/ued/comments.php?y=09&#038;m=11&#038;entry=entry091123-095015
]]></description>
			<content:encoded><![CDATA[<p>从拔赤师兄的blog中看到的，对于我这样的YUI新手还是挺有意义的，特转载至此！</p>
<p><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="425" height="355"><param name="movie" value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=random-091123031444-phpapp01&#038;stripped_title=yui3-2563104" /><param name="quality" value="high" /><embed src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=random-091123031444-phpapp01&#038;stripped_title=yui3-2563104" quality="high" pluginspage="http://www.macromedia.com/go/getflashplayer" type="application/x-shockwave-flash" width="425" height="355"></embed></object></p>
<p>原文地址：<a href="http://www.uedmagazine.com/ued/comments.php?y=09&#038;m=11&#038;entry=entry091123-095015" target="_blank">http://www.uedmagazine.com/ued/comments.php?y=09&#038;m=11&#038;entry=entry091123-095015</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.men-ideal.com/archives/476/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>悟透事件捕获和冒泡</title>
		<link>http://www.men-ideal.com/archives/452</link>
		<comments>http://www.men-ideal.com/archives/452#comments</comments>
		<pubDate>Fri, 30 Apr 2010 07:07:04 +0000</pubDate>
		<dc:creator>zhenn</dc:creator>
				<category><![CDATA[javascript]]></category>
		<category><![CDATA[事件冒泡]]></category>
		<category><![CDATA[捕获]]></category>

		<guid isPermaLink="false">http://www.men-ideal.com/?p=452</guid>
		<description><![CDATA[对“捕获”和“冒泡”这两个概念，我想我们对冒泡更熟悉一些，因为在我们使用的所有浏览器中，都支持事件冒泡，即事件由子元素向祖先元素传播的，就像气泡从水底向水面上浮一样。而在像firefox,chrome,safari这类所谓的标准浏览器中，事件传播还有个阶段，那就是捕获阶段，这个很少有用武之地，所以被人疏忽遗忘也在所难免了，不常用不代表它不存在，本着科学严谨的态度，我们有必要去看一下它的庐山真面目。
事实上，捕获阶段是一个和冒泡阶段完全相反的过程，即事件由祖先元素向子元素传播，和一个石子儿从水面向水底下沉一样，要说明的是在IE，opera浏览器中，是不存在这个阶段的。从各浏览器提供的注册事件监听的方法中可见一斑，例如适用于ie,opera的attachEvent，有两个参数，attachEvent(&#8221;on&#8221;+type,fn)，而适用于所谓标准浏览器的addEventListener则有三个参数，addEventListener(type,fn,boolean)，前面两个参数不用解释，第三个参数boolean，就是决定注册事件发生在捕获阶段还是冒泡阶段，具体参考如下：

true : 捕获阶段
false : 冒泡阶段

话说，眼见为实，耳听为虚！那么好吧，请看demo，猛击这里
在这个demo中，注册事件监听默认发生在冒泡阶段，由于“元素a”，“元素b”和“元素c”有嵌套关系，为了更好的表现冒泡过程，所以请先点击“元素c”，会看到在各个浏览器中呈现的视觉效果是一致的，即事件是从c向a传播的，这也恰恰证明了所有浏览器都有冒泡这个过程的观点。经过上述的介绍，唯一让你感到吃惊的应该是，从视觉效果上，“元素c”并没有包含在“元素a”和“元素b”里面，而表现出来的效果确实证明&#8221;click&#8221;事件依次从c经过b传播到a的，反而包含“元素c”的“元素d”却没有响应click事件。事实上，这并不奇怪，因为事件冒泡和视觉上的布局结构是毫无关系的，这个冒泡过程仅仅依赖于dom元素的html结构（即嵌套关系）。效果见下图：

提及事件冒泡，那么不得不提“阻止事件冒泡”这个概念，因为我们最经常处理的任务就在于如何阻止事件的冒泡，来避免一些不必要的麻烦，关于这点，由于在之前的文章中单独讨论过，在此不再赘述，详见：阻止事件冒泡
言归正传，为了更好的看到捕获和冒泡的区别，那么这时候需要你把这个demo另存到本地，然后找到如下图所示的代码片段：

接下来，你要做的就是，把这个代码片段中false改为true，也就是说让注册事件监听在捕获阶段进行，依次ctrl+s，在各个浏览器中打开这个页面，细心的你会发现，在firefox,chrome,safari中表现效果发生了变化（IE，opera中无变化，因为不存在捕获阶段），如下图：

对比两张图片所显示的视觉效果，应该足以证明本文开头所提出的观点了，如果针对事件捕获和冒泡尚有任何疑问或不解，请留言或者Email我，交流研究！
]]></description>
			<content:encoded><![CDATA[<p>对“捕获”和“冒泡”这两个概念，我想我们对冒泡更熟悉一些，因为在我们使用的所有浏览器中，都支持事件冒泡，即事件由子元素向祖先元素传播的，就像气泡从水底向水面上浮一样。而在像firefox,chrome,safari这类所谓的标准浏览器中，事件传播还有个阶段，那就是捕获阶段，这个很少有用武之地，所以被人疏忽遗忘也在所难免了，不常用不代表它不存在，本着科学严谨的态度，我们有必要去看一下它的庐山真面目。</p>
<p>事实上，捕获阶段是一个和冒泡阶段完全相反的过程，即事件由祖先元素向子元素传播，和一个石子儿从水面向水底下沉一样，要说明的是在IE，opera浏览器中，是不存在这个阶段的。从各浏览器提供的注册事件监听的方法中可见一斑，例如适用于ie,opera的attachEvent，有两个参数，attachEvent(&#8221;on&#8221;+type,fn)，而适用于所谓标准浏览器的addEventListener则有三个参数，addEventListener(type,fn,boolean)，前面两个参数不用解释，第三个参数boolean，就是决定注册事件发生在捕获阶段还是冒泡阶段，具体参考如下：</p>
<ul style="list-style:none;font-weight:bold;">
<li>true : 捕获阶段</li>
<li>false : 冒泡阶段</li>
</ul>
<p>话说，眼见为实，耳听为虚！那么好吧，请看demo，猛击<a href="http://www.men-ideal.com/demo/event.html"><em><strong>这里</strong></em></a></p>
<p>在这个demo中，注册事件监听默认发生在冒泡阶段，由于“元素a”，“元素b”和“元素c”有嵌套关系，为了更好的表现冒泡过程，所以请先点击“元素c”，会看到在各个浏览器中呈现的视觉效果是一致的，即事件是从c向a传播的，这也恰恰证明了所有浏览器都有冒泡这个过程的观点。经过上述的介绍，唯一让你感到吃惊的应该是，从视觉效果上，“元素c”并没有包含在“元素a”和“元素b”里面，而表现出来的效果确实证明&#8221;click&#8221;事件依次从c经过b传播到a的，反而包含“元素c”的“元素d”却没有响应click事件。事实上，这并不奇怪，因为事件冒泡和视觉上的布局结构是毫无关系的，这个冒泡过程仅仅依赖于dom元素的html结构（即嵌套关系）。效果见下图：</p>
<p><img title="视觉效果" src="http://www.men-ideal.com/wp-content/uploads/2010/04/fff.gif" alt="视觉效果" width="352" height="235" /></p>
<p>提及事件冒泡，那么不得不提“阻止事件冒泡”这个概念，因为我们最经常处理的任务就在于如何阻止事件的冒泡，来避免一些不必要的麻烦，关于这点，由于在之前的文章中单独讨论过，在此不再赘述，详见：<a href="http://www.men-ideal.com/archives/110"><em><strong>阻止事件冒泡</strong></em></a></p>
<p>言归正传，为了更好的看到捕获和冒泡的区别，那么这时候需要你把这个demo另存到本地，然后找到如下图所示的代码片段：</p>
<p><img title="codes" src="http://www.men-ideal.com/wp-content/uploads/2010/04/未命名.jpg" alt="codes" width="448" height="73" /></p>
<p>接下来，你要做的就是，把这个代码片段中false改为true，也就是说让注册事件监听在捕获阶段进行，依次ctrl+s，在各个浏览器中打开这个页面，细心的你会发现，在firefox,chrome,safari中表现效果发生了变化（IE，opera中无变化，因为不存在捕获阶段），如下图：</p>
<p><img title="捕获的视觉效果" src="http://www.men-ideal.com/wp-content/uploads/2010/04/sss.gif" alt="捕获的视觉效果" width="353" height="228" /></p>
<p>对比两张图片所显示的视觉效果，应该足以证明本文开头所提出的观点了，如果针对事件捕获和冒泡尚有任何疑问或不解，请留言或者<a href="mailto:zhenn.life@gmail.com" style="font-family:arial;"><em><strong>Email</strong></em></a>我，交流研究！</p>
]]></content:encoded>
			<wfw:commentRss>http://www.men-ideal.com/archives/452/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>解决attachEvent中this指向问题</title>
		<link>http://www.men-ideal.com/archives/441</link>
		<comments>http://www.men-ideal.com/archives/441#comments</comments>
		<pubDate>Thu, 29 Apr 2010 10:34:17 +0000</pubDate>
		<dc:creator>zhenn</dc:creator>
				<category><![CDATA[javascript]]></category>
		<category><![CDATA[事件机制]]></category>

		<guid isPermaLink="false">http://www.men-ideal.com/?p=441</guid>
		<description><![CDATA[给dom元素绑定事件监听，很easy，即使刚入门的javascript编程人员都可以办到，比如obj.onclick = fn就可以很轻松的监听obj的单击事件，这固然是没有问题的，但是问题就在于在这个监听过程中，很难触发N个代码片段，例如：
obj.onclick = fn1;
obj.onclick = fn2;
...
事实上，如果这么做，fn2会把fn1覆盖，也就是说在单击obj时只会执行fn2中的代码片段，fn1则会被忽略，很显然这样不能满足我们的需求。在考虑到这个问题的时候，JS已经为我们准备了像attachEvnet、addEventListener这样的方法来满足我们的需求，虽然在不同级别的浏览器中方法不尽相同，利用对browser的能力检测还是可以轻松的实现一个兼容的方法：
function bindEvent(elem,type,fn){
&#160; &#160; if(elem.attachEvent){
&#160; &#160; &#160; &#160; elem.attachEvent(&#34;on&#34;+type,fn);
&#160; &#160; }else{
&#160; &#160; &#160; &#160; elem.addEventListener(type,fn,false);
&#160; &#160; }
}
//调用
bindEvent(obj,&#34;click&#34;,fn1);
bindEvent(obj,&#34;click&#34;,fn2);
bindEvent(obj,&#34;mouseover&#34;,function(){alert(this)})&#160;&#160; //this-&#62;window
这样目的就达到了，当单击obj时，依次执行fn1、fn2。解决了这个问题后，细心的淫们会发现在执行的function中this执行是有问题的，始终指向window，又不是一个不小的麻烦。那么有没有办法，来解决这个棘手的问题呢，答案是肯定的，这正是我写这篇文章的意义所在，废话!
其实只需对bindEvent稍作加工即可，如下：
function bindEvent(elem,type,fn){
&#160; &#160; if(elem.attachEvent){
&#160; &#160; &#160; &#160; elem.attachEvent(&#34;on&#34;+type,function(){
&#160; &#160; &#160; &#160; &#160; &#160; fn.apply(elem,arguments);
&#160; &#160; &#160; &#160; });
&#160; &#160; }else{
&#160; &#160; &#160; &#160; elem.addEventListener(type,fn,false);
&#160; &#160; }
}
bindEvent(obj,&#34;mouseover&#34;,function(){alert(this)})&#160; //this-&#62;elem
理论上，这样的解决方案近乎完美了，但是还有一个问题亟待解决，因为在attachEvent中使用了匿名函数来执行fn，导致在无法使用detachEvent来删除绑定的某个代码片段，也许obj["on"+type] = null可以解决，清空绑定的代码片段，这很粗暴邪恶，同时也违背我们的业务需求。
我想要从根本上解决这些问题，就一定抛弃attachEvent这个方法，事实上我也是这样做的，如下：
//绑定事件
function&#160;bindEvent(elem,type,fn){
&#160; &#160; if(elem.attachEvent){
&#160; &#160; &#160; [...]]]></description>
			<content:encoded><![CDATA[<p>给dom元素绑定事件监听，很easy，即使刚入门的javascript编程人员都可以办到，比如obj.onclick = fn就可以很轻松的监听obj的单击事件，这固然是没有问题的，但是问题就在于在这个监听过程中，很难触发N个代码片段，例如：</p>
<div class="hl-surround"><ol class="hl-main ln-show" title="Double click to hide line number." ondblclick = "linenumber(this)"><li class="hl-firstline"><span style="color: Blue;">obj</span><span style="color: Gray;">.</span><span style="color: Blue;">onclick</span><span style="color: Gray;"> = </span><span style="color: Blue;">fn1</span><span style="color: Gray;">;</span></li>
<li><span style="color: Blue;">obj</span><span style="color: Gray;">.</span><span style="color: Blue;">onclick</span><span style="color: Gray;"> = </span><span style="color: Blue;">fn2</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">...</span></li></ol></div>
<p>事实上，如果这么做，fn2会把fn1覆盖，也就是说在单击obj时只会执行fn2中的代码片段，fn1则会被忽略，很显然这样不能满足我们的需求。在考虑到这个问题的时候，JS已经为我们准备了像attachEvnet、addEventListener这样的方法来满足我们的需求，虽然在不同级别的浏览器中方法不尽相同，利用对browser的能力检测还是可以轻松的实现一个兼容的方法：</p>
<div class="hl-surround"><ol class="hl-main ln-show" title="Double click to hide line number." ondblclick = "linenumber(this)"><li class="hl-firstline"><span style="color: Green;">function</span><span style="color: Gray;"> </span><span style="color: Blue;">bindEvent</span><span style="color: Olive;">(</span><span style="color: Blue;">elem</span><span style="color: Gray;">,</span><span style="color: Blue;">type</span><span style="color: Gray;">,</span><span style="color: Blue;">fn</span><span style="color: Olive;">){</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Green;">if</span><span style="color: Olive;">(</span><span style="color: Blue;">elem</span><span style="color: Gray;">.</span><span style="color: Blue;">attachEvent</span><span style="color: Olive;">){</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Blue;">elem</span><span style="color: Gray;">.</span><span style="color: Blue;">attachEvent</span><span style="color: Olive;">(</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">on</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;">+</span><span style="color: Blue;">type</span><span style="color: Gray;">,</span><span style="color: Blue;">fn</span><span style="color: Olive;">)</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Olive;">}</span><span style="color: Green;">else</span><span style="color: Olive;">{</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Blue;">elem</span><span style="color: Gray;">.</span><span style="color: Blue;">addEventListener</span><span style="color: Olive;">(</span><span style="color: Blue;">type</span><span style="color: Gray;">,</span><span style="color: Blue;">fn</span><span style="color: Gray;">,</span><span style="color: Green;">false</span><span style="color: Olive;">)</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Olive;">}</span></li>
<li><span style="color: Olive;">}</span></li>
<li><span style="color: #ffa500;">//调用</span></li>
<li><span style="color: Blue;">bindEvent</span><span style="color: Olive;">(</span><span style="color: Blue;">obj</span><span style="color: Gray;">,</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">click</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;">,</span><span style="color: Blue;">fn1</span><span style="color: Olive;">)</span><span style="color: Gray;">;</span></li>
<li><span style="color: Blue;">bindEvent</span><span style="color: Olive;">(</span><span style="color: Blue;">obj</span><span style="color: Gray;">,</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">click</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;">,</span><span style="color: Blue;">fn2</span><span style="color: Olive;">)</span><span style="color: Gray;">;</span></li>
<li><span style="color: Blue;">bindEvent</span><span style="color: Olive;">(</span><span style="color: Blue;">obj</span><span style="color: Gray;">,</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">mouseover</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;">,</span><span style="color: Green;">function</span><span style="color: Olive;">(){</span><span style="color: Blue;">alert</span><span style="color: Olive;">(</span><span style="color: Green;">this</span><span style="color: Olive;">)})</span><span style="color: Gray;">&nbsp;&nbsp; </span><span style="color: #ffa500;">//this-&gt;window</span></li></ol></div>
<p>这样目的就达到了，当单击obj时，依次执行fn1、fn2。解决了这个问题后，细心的淫们会发现在执行的function中this执行是有问题的，始终指向window，又不是一个不小的麻烦。那么有没有办法，来解决这个棘手的问题呢，答案是肯定的，这正是我写这篇文章的意义所在，废话!<br />
其实只需对bindEvent稍作加工即可，如下：</p>
<div class="hl-surround"><ol class="hl-main ln-show" title="Double click to hide line number." ondblclick = "linenumber(this)"><li class="hl-firstline"><span style="color: Green;">function</span><span style="color: Gray;"> </span><span style="color: Blue;">bindEvent</span><span style="color: Olive;">(</span><span style="color: Blue;">elem</span><span style="color: Gray;">,</span><span style="color: Blue;">type</span><span style="color: Gray;">,</span><span style="color: Blue;">fn</span><span style="color: Olive;">){</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Green;">if</span><span style="color: Olive;">(</span><span style="color: Blue;">elem</span><span style="color: Gray;">.</span><span style="color: Blue;">attachEvent</span><span style="color: Olive;">){</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Blue;">elem</span><span style="color: Gray;">.</span><span style="color: Blue;">attachEvent</span><span style="color: Olive;">(</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">on</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;">+</span><span style="color: Blue;">type</span><span style="color: Gray;">,</span><span style="color: Green;">function</span><span style="color: Olive;">(){</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Blue;">fn</span><span style="color: Gray;">.</span><span style="color: Blue;">apply</span><span style="color: Olive;">(</span><span style="color: Blue;">elem</span><span style="color: Gray;">,</span><span style="color: Blue;">arguments</span><span style="color: Olive;">)</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Olive;">})</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Olive;">}</span><span style="color: Green;">else</span><span style="color: Olive;">{</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Blue;">elem</span><span style="color: Gray;">.</span><span style="color: Blue;">addEventListener</span><span style="color: Olive;">(</span><span style="color: Blue;">type</span><span style="color: Gray;">,</span><span style="color: Blue;">fn</span><span style="color: Gray;">,</span><span style="color: Green;">false</span><span style="color: Olive;">)</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Olive;">}</span></li>
<li><span style="color: Olive;">}</span></li>
<li><span style="color: Blue;">bindEvent</span><span style="color: Olive;">(</span><span style="color: Blue;">obj</span><span style="color: Gray;">,</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">mouseover</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;">,</span><span style="color: Green;">function</span><span style="color: Olive;">(){</span><span style="color: Blue;">alert</span><span style="color: Olive;">(</span><span style="color: Green;">this</span><span style="color: Olive;">)})</span><span style="color: Gray;">&nbsp; </span><span style="color: #ffa500;">//this-&gt;elem</span></li></ol></div>
<p>理论上，这样的解决方案近乎完美了，但是还有一个问题亟待解决，因为在attachEvent中使用了匿名函数来执行fn，导致在无法使用detachEvent来删除绑定的某个代码片段，也许obj["on"+type] = null可以解决，清空绑定的代码片段，这很粗暴邪恶，同时也违背我们的业务需求。</p>
<p>我想要从根本上解决这些问题，就一定抛弃attachEvent这个方法，事实上我也是这样做的，如下：</p>
<div class="hl-surround"><ol class="hl-main ln-show" title="Double click to hide line number." ondblclick = "linenumber(this)"><li class="hl-firstline"><span style="color: #ffa500;">//绑定事件</span></li>
<li><span style="color: Green;">function</span><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">bindEvent</span><span style="color: Olive;">(</span><span style="color: Blue;">elem</span><span style="color: Gray;">,</span><span style="color: Blue;">type</span><span style="color: Gray;">,</span><span style="color: Blue;">fn</span><span style="color: Olive;">){</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Green;">if</span><span style="color: Olive;">(</span><span style="color: Blue;">elem</span><span style="color: Gray;">.</span><span style="color: Blue;">attachEvent</span><span style="color: Olive;">){</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Green;">var</span><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">typeRef</span><span style="color: Gray;"> = </span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">_</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;"> + </span><span style="color: Blue;">type</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Green;">if</span><span style="color: Olive;">(</span><span style="color: Gray;">!</span><span style="color: Blue;">elem</span><span style="color: Olive;">[</span><span style="color: Blue;">typeRef</span><span style="color: Olive;">]){</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Blue;">elem</span><span style="color: Olive;">[</span><span style="color: Blue;">typeRef</span><span style="color: Olive;">]</span><span style="color: Gray;"> = </span><span style="color: Olive;">[]</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Olive;">}</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Green;">for</span><span style="color: Olive;">(</span><span style="color: Green;">var</span><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">i</span><span style="color: Gray;"> </span><span style="color: Green;">in</span><span style="color: Gray;"> </span><span style="color: Blue;">elem</span><span style="color: Olive;">[</span><span style="color: Blue;">typeRef</span><span style="color: Olive;">]){</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Green;">if</span><span style="color: Olive;">(</span><span style="color: Blue;">elem</span><span style="color: Olive;">[</span><span style="color: Blue;">typeRef</span><span style="color: Olive;">][</span><span style="color: Blue;">i</span><span style="color: Olive;">]</span><span style="color: Gray;"> == </span><span style="color: Blue;">fn</span><span style="color: Olive;">){</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Green;">return</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Olive;">}</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Olive;">}</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Blue;">elem</span><span style="color: Olive;">[</span><span style="color: Blue;">typeRef</span><span style="color: Olive;">]</span><span style="color: Gray;">.</span><span style="color: Blue;">push</span><span style="color: Olive;">(</span><span style="color: Blue;">fn</span><span style="color: Olive;">)</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Blue;">elem</span><span style="color: Olive;">[</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">on</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;">+</span><span style="color: Blue;">type</span><span style="color: Olive;">]</span><span style="color: Gray;"> = </span><span style="color: Green;">function</span><span style="color: Olive;">(){</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Green;">for</span><span style="color: Olive;">(</span><span style="color: Green;">var</span><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">i</span><span style="color: Gray;"> </span><span style="color: Green;">in</span><span style="color: Gray;"> </span><span style="color: Green;">this</span><span style="color: Olive;">[</span><span style="color: Blue;">typeRef</span><span style="color: Olive;">]){</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Green;">this</span><span style="color: Olive;">[</span><span style="color: Blue;">typeRef</span><span style="color: Olive;">][</span><span style="color: Blue;">i</span><span style="color: Olive;">]</span><span style="color: Gray;">.</span><span style="color: Blue;">apply</span><span style="color: Olive;">(</span><span style="color: Green;">this</span><span style="color: Gray;">,</span><span style="color: Blue;">arguments</span><span style="color: Olive;">)</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Olive;">}</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Olive;">}</span><span style="color: Gray;">&nbsp; &nbsp; </span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Olive;">}</span><span style="color: Green;">else</span><span style="color: Olive;">{</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Blue;">elem</span><span style="color: Gray;">.</span><span style="color: Blue;">addEventListener</span><span style="color: Olive;">(</span><span style="color: Blue;">type</span><span style="color: Gray;">,</span><span style="color: Blue;">fn</span><span style="color: Gray;">,</span><span style="color: Green;">false</span><span style="color: Olive;">)</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Olive;">}</span></li>
<li><span style="color: Olive;">}</span></li>
<li><span style="color: Gray;">&nbsp;</span></li>
<li><span style="color: #ffa500;">//移除事件绑定</span></li>
<li><span style="color: Green;">function</span><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">removeEvent</span><span style="color: Olive;">(</span><span style="color: Blue;">elem</span><span style="color: Gray;">,</span><span style="color: Blue;">type</span><span style="color: Gray;">,</span><span style="color: Blue;">fn</span><span style="color: Olive;">){</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Green;">if</span><span style="color: Olive;">(</span><span style="color: Blue;">elem</span><span style="color: Gray;">.</span><span style="color: Blue;">detachEvent</span><span style="color: Olive;">){</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Green;">if</span><span style="color: Olive;">(</span><span style="color: Blue;">elem</span><span style="color: Olive;">[</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">_</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;">+</span><span style="color: Blue;">type</span><span style="color: Olive;">]){</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Green;">for</span><span style="color: Olive;">(</span><span style="color: Green;">var</span><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">i</span><span style="color: Gray;"> </span><span style="color: Green;">in</span><span style="color: Gray;"> </span><span style="color: Blue;">elem</span><span style="color: Olive;">[</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">_</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;">+</span><span style="color: Blue;">type</span><span style="color: Olive;">]){</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Green;">if</span><span style="color: Olive;">(</span><span style="color: Blue;">elem</span><span style="color: Olive;">[</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">_</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;">+</span><span style="color: Blue;">type</span><span style="color: Olive;">][</span><span style="color: Blue;">i</span><span style="color: Olive;">]</span><span style="color: Gray;"> == </span><span style="color: Blue;">fn</span><span style="color: Olive;">){</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Blue;">elem</span><span style="color: Olive;">[</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">_</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;">+</span><span style="color: Blue;">type</span><span style="color: Olive;">]</span><span style="color: Gray;">.</span><span style="color: Blue;">splice</span><span style="color: Olive;">(</span><span style="color: Blue;">i</span><span style="color: Gray;">,</span><span style="color: Maroon;">1</span><span style="color: Olive;">)</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Green;">break</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Olive;">}</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Olive;">}</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Olive;">}</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Olive;">}</span><span style="color: Green;">else</span><span style="color: Olive;">{</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Blue;">elem</span><span style="color: Gray;">.</span><span style="color: Blue;">removeEventListener</span><span style="color: Olive;">(</span><span style="color: Blue;">type</span><span style="color: Gray;">,</span><span style="color: Blue;">fn</span><span style="color: Gray;">,</span><span style="color: Green;">false</span><span style="color: Olive;">)</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Olive;">}</span></li>
<li><span style="color: Olive;">}</span></li></ol></div>
<p>这段代码有点饶人，首先根据type类型给elem注册一个相关的属性_type，来存放elem同种类型事件要执行的代码片段，当然在这个过程中要先判断这个属性是否已经存在，如果存在，则跳过这一步。然后要遍历这个存放代码片段的数组，判断是否有和要添加的代码片段相同的代码片段，如果有，直接跳出function。假设在上一步条件不满足的情况下（即代码片段不重复），那么把这个代码片段push到相应的数组中。之后干的事情，我想大家应该很清楚了，没错，就是把相应数组里的代码片段依次apply到elem下执行。当然，这个过程只有在触发事件的时候，才会发生。</p>
<p>依照这个原理，那么要删除绑定的某个代码片段就很容易做到了，只需要从elem["_"+type]这个数组中把相应的代码片段删除即可。</p>
<p>解释一下为什么这个存放需要绑定代码片段的数组设置为elem的一个属性，其实理由很简单，就是不用声明一个全部变量（数组类型），来管理这个二维的数据结构，这样可以保证bindEvent,removeEvent的高度独立性。</p>
<p>最后，希望各位大淫能帮忙测试一下这两个方法的健壮性如何，是否还存在一些bug，如果有，提交给我，<a href="http://www.men-ideal.com/about">zhenn</a>不胜感激之至！</p>
]]></content:encoded>
			<wfw:commentRss>http://www.men-ideal.com/archives/441/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>巧用&#8221;&amp;&amp;&#8221;和&#8221;&#124;&#124;&#8221;</title>
		<link>http://www.men-ideal.com/archives/430</link>
		<comments>http://www.men-ideal.com/archives/430#comments</comments>
		<pubDate>Sat, 24 Apr 2010 04:27:17 +0000</pubDate>
		<dc:creator>zhenn</dc:creator>
				<category><![CDATA[javascript]]></category>
		<category><![CDATA[基础知识]]></category>

		<guid isPermaLink="false">http://www.men-ideal.com/?p=430</guid>
		<description><![CDATA[对于&#038;&#038;和&#124;&#124;运算符，相信大家都用过，分别进行逻辑与运算和逻辑或运算符。如果&#038;&#038;的第一个运算数是false，则不再考虑第二个运算数，直接返回false。如果&#124;&#124;的第一个运算数是true，那么也不再考虑第二个运算数。
没有实践就没有发言权，demo如下：
var a = true, b = false;
function&#160;test(param){
　　alert(param);
}
a &#38;&#38; test(1);
b &#38;&#38; test(2);
a &#124;&#124; test(3);
b &#124;&#124; test(4);
执行如上代码，事实上只执行了test(1)和test(4)，原理如上所述。
a&#038;&#038;test(1)这种运算，其实我不知道是否有个专业的名词去描述它，在javascript森林群ToFishes同学称之为“惰性运算”，那么暂且叫它“惰性运算”吧，实际上相当于if(a){test(1)}。
其中&#124;&#124;运算符，有个很重要的应用就是给function的参数设置默认值，如：
function test(param){
&#160; &#160; param = {
&#160; &#160; &#160; &#160; name: param.name &#124;&#124; &#34;zhenn&#34;,
&#160; &#160; &#160; &#160; age: param.age &#124;&#124; 25
&#160; &#160; }
&#160; &#160; alert(param.name + &#34; is &#34; + param.age + &#34; years old.&#34;)
}
test({});
以上内容，针对刚入门javascript的童鞋们，大湿级的淫们可以直接skip.
]]></description>
			<content:encoded><![CDATA[<p>对于&#038;&#038;和||运算符，相信大家都用过，分别进行逻辑与运算和逻辑或运算符。如果&#038;&#038;的第一个运算数是false，则不再考虑第二个运算数，直接返回false。如果||的第一个运算数是true，那么也不再考虑第二个运算数。</p>
<p>没有实践就没有发言权，demo如下：</p>
<div class="hl-surround"><ol class="hl-main ln-show" title="Double click to hide line number." ondblclick = "linenumber(this)"><li class="hl-firstline"><span style="color: Green;">var</span><span style="color: Gray;"> </span><span style="color: Blue;">a</span><span style="color: Gray;"> = </span><span style="color: Green;">true</span><span style="color: Gray;">, </span><span style="color: Blue;">b</span><span style="color: Gray;"> = </span><span style="color: Green;">false</span><span style="color: Gray;">;</span></li>
<li><span style="color: Green;">function</span><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">test</span><span style="color: Olive;">(</span><span style="color: Blue;">param</span><span style="color: Olive;">){</span></li>
<li><span style="color: Gray;">　　</span><span style="color: Blue;">alert</span><span style="color: Olive;">(</span><span style="color: Blue;">param</span><span style="color: Olive;">)</span><span style="color: Gray;">;</span></li>
<li><span style="color: Olive;">}</span></li>
<li><span style="color: Blue;">a</span><span style="color: Gray;"> &amp;&amp; </span><span style="color: Blue;">test</span><span style="color: Olive;">(</span><span style="color: Maroon;">1</span><span style="color: Olive;">)</span><span style="color: Gray;">;</span></li>
<li><span style="color: Blue;">b</span><span style="color: Gray;"> &amp;&amp; </span><span style="color: Blue;">test</span><span style="color: Olive;">(</span><span style="color: Maroon;">2</span><span style="color: Olive;">)</span><span style="color: Gray;">;</span></li>
<li><span style="color: Blue;">a</span><span style="color: Gray;"> || </span><span style="color: Blue;">test</span><span style="color: Olive;">(</span><span style="color: Maroon;">3</span><span style="color: Olive;">)</span><span style="color: Gray;">;</span></li>
<li><span style="color: Blue;">b</span><span style="color: Gray;"> || </span><span style="color: Blue;">test</span><span style="color: Olive;">(</span><span style="color: Maroon;">4</span><span style="color: Olive;">)</span><span style="color: Gray;">;</span></li></ol></div>
<p>执行如上代码，事实上只执行了test(1)和test(4)，原理如上所述。</p>
<p>a&#038;&#038;test(1)这种运算，其实我不知道是否有个专业的名词去描述它，在javascript森林群ToFishes同学称之为“惰性运算”，那么暂且叫它“惰性运算”吧，实际上相当于if(a){test(1)}。</p>
<p>其中||运算符，有个很重要的应用就是给function的参数设置默认值，如：</p>
<div class="hl-surround"><ol class="hl-main ln-show" title="Double click to hide line number." ondblclick = "linenumber(this)"><li class="hl-firstline"><span style="color: Green;">function</span><span style="color: Gray;"> </span><span style="color: Blue;">test</span><span style="color: Olive;">(</span><span style="color: Blue;">param</span><span style="color: Olive;">){</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Blue;">param</span><span style="color: Gray;"> = </span><span style="color: Olive;">{</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Blue;">name</span><span style="color: Gray;">: </span><span style="color: Blue;">param</span><span style="color: Gray;">.</span><span style="color: Blue;">name</span><span style="color: Gray;"> || </span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">zhenn</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;">,</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Blue;">age</span><span style="color: Gray;">: </span><span style="color: Blue;">param</span><span style="color: Gray;">.</span><span style="color: Blue;">age</span><span style="color: Gray;"> || </span><span style="color: Maroon;">25</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Olive;">}</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Blue;">alert</span><span style="color: Olive;">(</span><span style="color: Blue;">param</span><span style="color: Gray;">.</span><span style="color: Blue;">name</span><span style="color: Gray;"> + </span><span style="color: #8b0000;">&quot;</span><span style="color: Red;"> is </span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;"> + </span><span style="color: Blue;">param</span><span style="color: Gray;">.</span><span style="color: Blue;">age</span><span style="color: Gray;"> + </span><span style="color: #8b0000;">&quot;</span><span style="color: Red;"> years old.</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">)</span></li>
<li><span style="color: Olive;">}</span></li>
<li><span style="color: Blue;">test</span><span style="color: Olive;">({})</span><span style="color: Gray;">;</span></li></ol></div>
<p>以上内容，针对刚入门javascript的童鞋们，大湿级的淫们可以直接<a href="http://www.men-ideal.com">skip</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.men-ideal.com/archives/430/feed</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>值传递和地址传递</title>
		<link>http://www.men-ideal.com/archives/405</link>
		<comments>http://www.men-ideal.com/archives/405#comments</comments>
		<pubDate>Wed, 31 Mar 2010 07:53:19 +0000</pubDate>
		<dc:creator>zhenn</dc:creator>
				<category><![CDATA[javascript]]></category>
		<category><![CDATA[值]]></category>
		<category><![CDATA[地址]]></category>

		<guid isPermaLink="false">http://www.men-ideal.com/?p=405</guid>
		<description><![CDATA[一个陷阱，引发一次深刻的思考，代码如下：
var a = 11111;
var&#160;b = {
&#160; &#160; pro: &#34;test&#34;
}
function&#160;fn(a,b){
&#160; &#160; a = 2222;
&#160; &#160; b.pro = &#34;zhenn&#34;;&#160; &#160; 
}
fn(a,b);
console.log(a);&#160; // 11111
console.log(b);&#160; // b.pro = &#34;zhenn&#34;
在JavaScript中，除了Object,Array是地址引用，其他数据类型，诸如Number
、Boolean、String等都是值引用，这就是从陷阱中挖出的东西，同一个坑不能跳进去两次啊！杯具&#8230;
]]></description>
			<content:encoded><![CDATA[<p>一个陷阱，引发一次深刻的思考，代码如下：</p>
<div class="hl-surround"><ol class="hl-main ln-show" title="Double click to hide line number." ondblclick = "linenumber(this)"><li class="hl-firstline"><span style="color: Green;">var</span><span style="color: Gray;"> </span><span style="color: Blue;">a</span><span style="color: Gray;"> = </span><span style="color: Maroon;">11111</span><span style="color: Gray;">;</span></li>
<li><span style="color: Green;">var</span><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">b</span><span style="color: Gray;"> = </span><span style="color: Olive;">{</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Blue;">pro</span><span style="color: Gray;">: </span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">test</span><span style="color: #8b0000;">&quot;</span></li>
<li><span style="color: Olive;">}</span></li>
<li><span style="color: Green;">function</span><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">fn</span><span style="color: Olive;">(</span><span style="color: Blue;">a</span><span style="color: Gray;">,</span><span style="color: Blue;">b</span><span style="color: Olive;">){</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Blue;">a</span><span style="color: Gray;"> = </span><span style="color: Maroon;">2222</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Blue;">b</span><span style="color: Gray;">.</span><span style="color: Blue;">pro</span><span style="color: Gray;"> = </span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">zhenn</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;">;&nbsp; &nbsp; </span></li>
<li><span style="color: Olive;">}</span></li>
<li><span style="color: Blue;">fn</span><span style="color: Olive;">(</span><span style="color: Blue;">a</span><span style="color: Gray;">,</span><span style="color: Blue;">b</span><span style="color: Olive;">)</span><span style="color: Gray;">;</span></li>
<li><span style="color: Blue;">console</span><span style="color: Gray;">.</span><span style="color: Blue;">log</span><span style="color: Olive;">(</span><span style="color: Blue;">a</span><span style="color: Olive;">)</span><span style="color: Gray;">;&nbsp; </span><span style="color: #ffa500;">// 11111</span></li>
<li><span style="color: Blue;">console</span><span style="color: Gray;">.</span><span style="color: Blue;">log</span><span style="color: Olive;">(</span><span style="color: Blue;">b</span><span style="color: Olive;">)</span><span style="color: Gray;">;&nbsp; </span><span style="color: #ffa500;">// b.pro = &quot;zhenn&quot;</span></li></ol></div>
<p>在JavaScript中，除了Object,Array是地址引用，其他数据类型，诸如Number<br />
、Boolean、String等都是值引用，这就是从陷阱中挖出的东西，同一个坑不能跳进去两次啊！杯具&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.men-ideal.com/archives/405/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
	</channel>
</rss>
