<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0">
	<channel>
		<title>千里之行——www.footya.com</title>
		<link>http://www.footya.com//</link>
		<description>人的头脑太复杂,时间过得久,有时候连自己也被自己骗了,记下来才是最真实的......</description>
		<copyright>Copyright (C) 2004 Security Angel Team [S4T] All Rights Reserved.</copyright>
		<generator>SaBlog-X Version 1.6 Build 20080806</generator>
		<lastBuildDate>Wed, 08 Feb 2012 17:23:46 +0000</lastBuildDate>
		<ttl>30</ttl>
		<item>
			<guid>http://www.footya.com//?action=show&amp;id=123</guid>
			<title>js对象深拷贝和对象扩展</title>
			<author>footya</author>
			<description><![CDATA[<p>对象深拷贝和对象扩展一直比较头疼，最近查阅了一些资料，终于想出了一个比较靠谱的方案，深拷贝的代码来自网络：<a href="http://blog.csdn.net/qq1119753812/article/details/6968054"><font color="#0066cc">http://blog.csdn.net/qq1119753812/article/details/6968054</font></a>，基于深拷贝写了个对象扩展的方法，测了一下基本可以满足日常使用。<br />
js对象深拷贝：</p>
<div class="codeText">
<div class="codeHead">JavaScript代码</div>
<ol class="dp-c">
    <li class="alt"><span><span class="comment">//对象和数组的深拷贝</span><span>&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>Object.clone&nbsp;=&nbsp;<span class="keyword">function</span><span>(sObj){&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">if</span><span>(</span><span class="keyword">typeof</span><span>&nbsp;sObj&nbsp;!==&nbsp;</span><span class="string">&quot;object&quot;</span><span>){&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">return</span><span>&nbsp;sObj;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">var</span><span>&nbsp;s&nbsp;=&nbsp;{};&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">if</span><span>(sObj.constructor&nbsp;==&nbsp;Array){&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;s&nbsp;=&nbsp;[];&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">for</span><span>(</span><span class="keyword">var</span><span>&nbsp;i&nbsp;</span><span class="keyword">in</span><span>&nbsp;sObj){&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;s[i]&nbsp;=&nbsp;Object.clone(sObj[i]);&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">return</span><span>&nbsp;s;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li>
</ol>
</div>
<p>js对象扩展：</p>
<div class="codeText">
<div class="codeHead">JavaScript代码</div>
<ol class="dp-c">
    <li class="alt"><span><span class="comment">//对象扩展，tObj被扩展对象，sObj扩展对象&nbsp;</span><span>&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;Object.extend&nbsp;=&nbsp;<span class="keyword">function</span><span>(tObj,sObj){&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">for</span><span>(</span><span class="keyword">var</span><span>&nbsp;i&nbsp;</span><span class="keyword">in</span><span>&nbsp;sObj){&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">if</span><span>(</span><span class="keyword">typeof</span><span>&nbsp;sObj[i]&nbsp;!==&nbsp;</span><span class="string">&quot;object&quot;</span><span>){&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tObj[i]&nbsp;=&nbsp;sObj[i];&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<span class="keyword">else</span><span>&nbsp;</span><span class="keyword">if</span><span>&nbsp;(sObj[i].constructor&nbsp;==&nbsp;Array){&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tObj[i]&nbsp;=&nbsp;Object.clone(sObj[i]);&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<span class="keyword">else</span><span>{&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tObj[i]&nbsp;=&nbsp;tObj[i]&nbsp;||&nbsp;{};&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Object.extend(tObj[i],sObj[i]);&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li>
</ol>
</div>
<p><br />
测试用例如下：</p>
<div class="codeText">
<div class="codeHead">JavaScript代码</div>
<ol class="dp-c">
    <li class="alt"><span><span class="keyword">var</span><span>&nbsp;a&nbsp;=&nbsp;{};&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span><span class="keyword">var</span><span>&nbsp;b&nbsp;=&nbsp;{</span><span class="string">&quot;a&quot;</span><span>:1,&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="string">&quot;b&quot;</span><span>:{</span><span class="string">&quot;c&quot;</span><span>:</span><span class="keyword">function</span><span>(t){&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;alert(t);&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;},&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="string">&quot;d&quot;</span><span>:{</span><span class="string">&quot;e&quot;</span><span>:2,&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="string">&quot;f&quot;</span><span>:[1,4,5,7,9]&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;};&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>Object.extend(a,b);<span class="comment">//a获得了b的所有属性</span><span>&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
</ol>
</div>]]></description>
			<link>http://www.footya.com//?action=show&amp;id=123</link>
			<category domain="http://www.footya.com//?cid=3">AJAX/Javascript</category>
			<pubDate>2011-12-27 09:59</pubDate>
		</item>
		<item>
			<guid>http://www.footya.com//?action=show&amp;id=122</guid>
			<title>《Head First 设计模式》读书笔记5——设计模式之适配器模式</title>
			<author>footya</author>
			<description><![CDATA[<p><strong>定义：</strong><br />
将一个类的接口，转换成客户期望的另一个接口。适配器adapter使原本因接口不匹配而无法在一起工作的两个类能够在一起工作。</p>
<p><strong>uml:</strong></p>
<p><strong>对象适配器<br />
</strong><a href="http://www.footya.com//attachment.php?id=77" target="_blank"><img src="http://www.footya.com//attachments//date_201110/5d52a530005b8af9998a2d0a10909d64.png" border="0" alt="大小: 4.73 K&#13;尺寸: 522 x 179&#13;浏览: 11 次&#13;点击打开新窗口浏览全图" width="522" height="179" /></a></p>
<p><strong>类适配器<br />
</strong><a href="http://www.footya.com//attachment.php?id=78" target="_blank"><img src="http://www.footya.com//attachments//date_201110/1af931843748e6a304eeec04e33b24db.png" border="0" alt="大小: 4.87 K&#13;尺寸: 533 x 177&#13;浏览: 0 次&#13;点击打开新窗口浏览全图" width="533" height="177" /></a><br />
<strong>适配器模式的角色组成：</strong></p>
<p>1.源（Adaptee）<br />
已经存在的、需要适配的类。<br />
2.目标（Target）<br />
客户所期待的接口。目标可以是具体的或抽象的类，也可以是接口。<br />
3.适配器（Adapter）<br />
适配器模式的核心类。有两种方式实现Adapter，对象适配器(Object Adapter)和类适配器(Class Adapter)。<br />
4.客户(Client)</p>
<p><strong>适用范围：<br />
</strong>1、你想使用一个已经存在的类，而它的接口不符合你的需求。 <br />
2、你想创建一个可以复用的类，该类可以与其他不相关的类或不可预见的类（即那些接口可能不一定兼容的类）协同工作。 <br />
3、你想使用一些已经存在的子类，但是不可能对每一个都进行子类化以匹配它们的接口。对象适配器可以适配它的父类接口。<br />
<strong>引用书中的例子：</strong><br />
1、鸭子有两个行为飞【fly()】和叫【quack()】;<br />
2、火鸡有两个行为飞【fly()】和叫【gobble()】;<br />
3、实现一个适配器使得火鸡的行为和鸭子的行为提供一样的接口；</p>
<p><strong>js代码实现：</strong></p>
<p>&nbsp;</p>
<div class="codeText">
<div class="codeHead">JavaScript代码</div>
<ol class="dp-c">
    <li class="alt"><span><span class="comment">//目标</span><span>&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span><span class="keyword">function</span><span>&nbsp;Duck(){&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">this</span><span>.fly&nbsp;=&nbsp;</span><span class="keyword">function</span><span>(){&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;alert(<span class="string">&quot;Duck&nbsp;flying&quot;</span><span>);&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;};&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">this</span><span>.quack&nbsp;=&nbsp;</span><span class="keyword">function</span><span>(){&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;alert(<span class="string">&quot;Duck&nbsp;quacking&quot;</span><span>)&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;};&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>}&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span><span class="comment">//源</span><span>&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span><span class="keyword">function</span><span>&nbsp;Turkey(){&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">this</span><span>.fly&nbsp;=&nbsp;</span><span class="keyword">function</span><span>(){&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;alert(<span class="string">&quot;Turkey&nbsp;flying&quot;</span><span>);&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;};&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">this</span><span>.gobble&nbsp;=&nbsp;</span><span class="keyword">function</span><span>(){&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;alert(<span class="string">&quot;turkey&nbsp;gobble&quot;</span><span>);&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>}&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span><span class="comment">//适配器</span><span>&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span><span class="keyword">function</span><span>&nbsp;TurkeyAdapter(turkey){&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">this</span><span>.turkey&nbsp;=&nbsp;turkey;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">this</span><span>.fly&nbsp;=&nbsp;</span><span class="keyword">function</span><span>(){&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;turkey.fly();&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;};&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">this</span><span>.quack&nbsp;=&nbsp;</span><span class="keyword">function</span><span>(){&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;turkey.gobble();&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;};&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>}&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span><span class="comment">//客户</span><span>&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span><span class="keyword">function</span><span>&nbsp;testDuck(duck){&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;duck.quack();&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;duck.fly();&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>};&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span><span class="keyword">function</span><span>&nbsp;main(){&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">var</span><span>&nbsp;duck&nbsp;&nbsp;&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;Duck();&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">var</span><span>&nbsp;turkey&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;Turkey();&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">var</span><span>&nbsp;turkeyadapter&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;TurkeyAdapter(turkey);&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;testDuck(duck);&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;testDuck(turkeyadapter);&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>}&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>main();&nbsp;&nbsp;</span></li>
</ol>
</div>
<p>&nbsp;</p>]]></description>
			<link>http://www.footya.com//?action=show&amp;id=122</link>
			<category domain="http://www.footya.com//?cid=11">学习总结</category>
			<pubDate>2011-10-20 08:29</pubDate>
		</item>
		<item>
			<guid>http://www.footya.com//?action=show&amp;id=121</guid>
			<title>《Head First 设计模式》读书笔记4——设计模式之命令模式</title>
			<author>footya</author>
			<description><![CDATA[<p><strong>定义：</strong><br />
将一个请求封装为一个对象，从而使你可用不同的请求对客户进行参数化；对请求排队或记录请求日志，以及支持可撤消的操作。</p>
<p><strong>uml:</strong><br />
<a href="http://www.footya.com//attachment.php?id=75" target="_blank"><img src="http://www.footya.com//attachments//date_201110/f4e23904074d4a1a820b0dfccaf03d40.png" border="0" alt="大小: 5.57 K&#13;尺寸: 596 x 208&#13;浏览: 0 次&#13;点击打开新窗口浏览全图" width="596" height="208" /></a><br />
<strong>命令模式的角色组成：<br />
</strong>1)命令角色（Command）：  定义命令的接口，声明执行的方法。<br />
2)具体命令角色（Concrete Command）：<br />
命令接口实现对象，是&ldquo;虚&rdquo;的实现；通常会持有接收者(Receiver)的引用，并调用接收者(Receiver)的功能(receiver.Action())来完成命令要执行的操作(Execute)。<br />
3)客户角色（Client）：创建具体的命令对象，并且设置命令对象的接收者。注意这个不是我们常规意义上的客户端，而是在组装命令对象和接收者，或许，把这个Client称为装配者会更好理解，因为真正使用命令的客户端是从Invoker来触发执行。<br />
4)请求者角色（Invoker）：调用命令对象(Command)执行这个请求。<br />
5)接收者角色（Receiver）：知道如何实施与执行一个请求相关的操作。任何类都可能作为一个接收者。<br />
<br />
<strong>引用书中的例子：</strong><br />
实现一个开关遥控器<br />
1、遥控器上有7个编程插槽，每个插槽分别对应开、关两个按钮；<br />
2、有已经封装好的家电类，这些家电类都实现了自己的开关方法；<br />
3、遥控器上还有一个撤销按钮；<br />
4、创建一组控制遥控器的API，让每个插槽都能够控制一个或一组家电装置；<br />
5、能够控制目前的装置和未来可能出现的装置。</p>
<p><br />
我们先实现一个家电的开关，以卧室的灯来举例。</p>
<p><strong> 初步实现的UML图：</strong></p>
<p>&nbsp;<a href="http://www.footya.com//attachment.php?id=76" target="_blank"><img src="http://www.footya.com//attachments//date_201110/0b609515093bbd76ae019d9149cc9e11.png" border="0" alt="大小: 10.57 K&#13;尺寸: 751 x 238&#13;浏览: 1 次&#13;点击打开新窗口浏览全图" width="751" height="238" /></a><br />
<strong>js程序实现：<br />
</strong></p>
<div class="codeText">
<div class="codeHead">JavaScript代码</div>
<ol class="dp-c">
    <li class="alt"><span><span class="keyword">function</span><span>&nbsp;Command(){&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>}&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>Command.prototype.execute&nbsp;=&nbsp;<span class="keyword">function</span><span>(){&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>}&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span><span class="keyword">function</span><span>&nbsp;LightOnCommand&nbsp;(light){&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;Command.apply(<span class="keyword">this</span><span>,arguments);&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">this</span><span>.light&nbsp;=&nbsp;light;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>}&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>LightOnCommand.prototype&nbsp;=&nbsp;<span class="keyword">new</span><span>&nbsp;Command();&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>LightOnCommand.prototype.constructor&nbsp;=&nbsp;LightOnCommand;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>LightOnCommand.prototype.execute&nbsp;=&nbsp;<span class="keyword">function</span><span>(){&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">this</span><span>.light.on();&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>}&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span><span class="keyword">function</span><span>&nbsp;SimpleRemoteControl&nbsp;(){&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>}&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>SimpleRemoteControl.prototype.setCommand&nbsp;=&nbsp;<span class="keyword">function</span><span>(command){&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">this</span><span>.solt&nbsp;=&nbsp;command;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>};&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>SimpleRemoteControl.prototype.buttonWasPressed&nbsp;=&nbsp;<span class="keyword">function</span><span>(){&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">this</span><span>.solt.execute();&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>};&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span><span class="comment">//&nbsp;</span><span>&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span><span class="keyword">function</span><span>&nbsp;Light(){&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>};&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>Light.prototype.on&nbsp;=&nbsp;<span class="keyword">function</span><span>(){&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;alert(<span class="string">&quot;the&nbsp;light&nbsp;on&quot;</span><span>);&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>};&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>Light.prototype.off&nbsp;=&nbsp;<span class="keyword">function</span><span>(){&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;alert(<span class="string">&quot;the&nbsp;light&nbsp;off&quot;</span><span>);&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>};&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span><span class="keyword">function</span><span>&nbsp;RemoteControlTest(){&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">var</span><span>&nbsp;remote&nbsp;&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;SimpleRemoteControl();&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">var</span><span>&nbsp;light&nbsp;&nbsp;&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;Light();&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">var</span><span>&nbsp;lighton&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;LightOnCommand(light);&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;remote.setCommand(lighton);&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;remote.buttonWasPressed();&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>}&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>RemoteControlTest();&nbsp;&nbsp;</span></li>
</ol>
</div>
<p>&nbsp;</p>]]></description>
			<link>http://www.footya.com//?action=show&amp;id=121</link>
			<category domain="http://www.footya.com//?cid=11">学习总结</category>
			<pubDate>2011-10-09 22:42</pubDate>
		</item>
		<item>
			<guid>http://www.footya.com//?action=show&amp;id=120</guid>
			<title>《Head First 设计模式》读书笔记3——设计模式之单件模式</title>
			<author>footya</author>
			<description><![CDATA[<p><strong>单件模式（singleton）</strong></p>
<p>保证一个类仅有一个实例，并提供一个访问它的全局访问点。</p>
<p><strong>uml图示：<br />
<a href="http://www.footya.com//attachment.php?id=74" target="_blank"><img src="http://www.footya.com//attachments//date_201109/da62274e3904a11048eb2378b3861c19.png" border="0" alt="大小: 4.38 K&#13;尺寸: 421 x 140&#13;浏览: 0 次&#13;点击打开新窗口浏览全图" width="421" height="140" /></a></strong></p>
<p><strong>单件模式应该使用在什么场合:<br />
</strong>　　当需要控制一个类的实例数量且调用者可以从一个公共的众所周知的访问点访问时。<br />
<strong>单件模式类的创建:<br />
</strong>　　两种方式来实现单件类的创建，一是将一个类的公共构造函数改为私有，另一种方式是保留类的公共构造函数，通过一个静态成员来决定是否要返回一个类实例。</p>
<p><strong>单件模式模式的实现基于两个要点：</strong><br />
1）不直接用类的构造函数，而另外提供一个Public的静态方法来构造类的实例。通常这个方法取名为Instance。Public保证了它的全局可见性，静态方法保证了不会创建出多余的实例。<br />
2）将类的构造函数设为Private，即将构造函数&quot;隐藏&quot;起来，任何企图使用构造函数创建实例的方法都将报错。这样就阻止了开发人员绕过上面的Instance方法直接创建类的实例。</p>
<p><strong>js代码示例：</strong></p>
<div class="codeText">
<div class="codeHead">JavaScript代码</div>
<ol class="dp-c">
    <li class="alt"><span><span class="keyword">function</span><span>&nbsp;Singleton(){&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;<span class="keyword">if</span><span>(!Singleton.lock){&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;alert(<span class="string">&quot;您不能直接示例化这个类&quot;</span><span>);&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span><span class="keyword">return</span><span>;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;}&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;<span class="keyword">this</span><span>.uniqueInstance&nbsp;=&nbsp;</span><span class="keyword">null</span><span>;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;}&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;Singleton.prototype.test&nbsp;=&nbsp;<span class="keyword">function</span><span>(){&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;alert(<span class="string">&quot;你已经成功示例化了&quot;</span><span>);&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;}&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>Singleton.instance&nbsp;=&nbsp;<span class="keyword">function</span><span>(){&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;<span class="keyword">this</span><span>.lock&nbsp;=&nbsp;</span><span class="keyword">true</span><span>;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;<span class="keyword">if</span><span>(</span><span class="keyword">this</span><span>.uniqueInstance&nbsp;==&nbsp;</span><span class="keyword">null</span><span>){&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;<span class="keyword">this</span><span>.uniqueInstance&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;Singleton();&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>}&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;<span class="keyword">return</span><span>&nbsp;</span><span class="keyword">this</span><span>.uniqueInstance;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;}&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;<span class="keyword">var</span><span>&nbsp;test1&nbsp;=&nbsp;Singleton.instance();&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;test1.test();&nbsp;&nbsp;</span></li>
</ol>
</div>
<p>&nbsp;</p>]]></description>
			<link>http://www.footya.com//?action=show&amp;id=120</link>
			<category domain="http://www.footya.com//?cid=3">AJAX/Javascript</category>
			<pubDate>2011-09-22 21:57</pubDate>
		</item>
		<item>
			<guid>http://www.footya.com//?action=show&amp;id=118</guid>
			<title>《Head First 设计模式》读书笔记2——设计模式之观察者模式</title>
			<author>footya</author>
			<description><![CDATA[<p><strong>观察者模式（<span class="Apple-style-span" style="font: 14px/24px arial, 宋体, sans-serif; color: rgb(0, 0, 0); text-transform: none; text-indent: 0px; letter-spacing: normal; word-spacing: 0px; white-space: normal; orphans: 2; widows: 2; font-size-adjust: none; font-stretch: normal; background-color: rgb(255, 255, 255); -webkit-text-decorations-in-effect: none; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px;">Observer</span>）</strong></p>
<p><span class="Apple-style-span" style="font: 12pt/22px Microsoft YaHei; color: rgb(0, 0, 0); text-transform: none; text-indent: 0px; letter-spacing: normal; word-spacing: 0px; white-space: normal; orphans: 2; widows: 2; font-size-adjust: none; font-stretch: normal; background-color: rgb(255, 255, 255); -webkit-text-decorations-in-effect: none; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px;">定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时, 所有依赖于它的对象都得到通知并被自动更新。</span></p>
<p><span class="Apple-style-span" style="font: 12pt/22px Microsoft YaHei; color: rgb(0, 0, 0); text-transform: none; text-indent: 0px; letter-spacing: normal; word-spacing: 0px; white-space: normal; orphans: 2; widows: 2; font-size-adjust: none; font-stretch: normal; background-color: rgb(255, 255, 255); -webkit-text-decorations-in-effect: none; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px;">此种模式通常被用来实现事件处理系统。<br />
<span class="Apple-style-span" style="font: 14px/24px arial, 宋体, sans-serif; color: rgb(0, 0, 0); text-transform: none; text-indent: 0px; letter-spacing: normal; word-spacing: 0px; white-space: normal; orphans: 2; widows: 2; font-size-adjust: none; font-stretch: normal; background-color: rgb(255, 255, 255); -webkit-text-decorations-in-effect: none; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px;"><strong>UML图示：</strong></span></span></p>
<p>&nbsp;<a href="http://www.footya.com//attachment.php?id=73" target="_blank"><img src="http://www.footya.com//attachments//date_201109/a3826da58216ee367a92935443e76785.png" border="0" alt="大小: 10.43 K&#13;尺寸: 616 x 239&#13;浏览: 1 次&#13;点击打开新窗口浏览全图" width="616" height="239" /></a><br />
1、观察者（observer）<br />
（Observer）将自己注册（Attach）到被观察对象（Subject）中，被观察对象将观察者存放在一个容器（observers）里。<br />
2、被观察对象（subject）<br />
被观察对象发生了某种变化，从容器中（observers）得到所有注册过的观察者，将变化通知观察者。<br />
3、撤销观察<br />
观察者告诉被观察者要撤销（Detach）观察，被观察者从容器中将观察者去除。</p>
<p>观察者将自己注册到被观察者的容器中时，被观察者不应该过问观察者的具体类型，而是应该使用观察者的接口。这样的优点是：假定程序中还有别的观察者，那么只要这个观察者也是相同的接口实现即可。一个被观察者可以对应多个观察者，当被观察者发生变化的时候，他可以将消息一一通知给所有的观察者。基于接口，而不是具体的实现&mdash;&mdash;这一点为程序提供了更大的灵活性。<br />
<br />
引用书里的例子：<br />
<strong>需求1：</strong>设计一个气象站，这个气象站可以提供温度、湿度、气压这3种数据；<br />
<strong>需求2：</strong>设计3个不同用途的公告板用来显示温度、湿度、气压等数据；<br />
<strong>需求3：</strong>每当有温度、湿度、气压变化时，气象站都要通知给各个公告板来更新显示；<br />
<strong>需求4：</strong>3个公告板中的任意一个都可以随时停止更新显示；</p>
<p><br />
UML设计如下：</p>
<p>&nbsp;<a href="http://www.footya.com//attachment.php?id=72" target="_blank"><img src="http://www.footya.com//attachments//date_201109/1695c32240a9c8dd70ffeb10acb26d56.png" border="0" alt="大小: 10.32 K&#13;尺寸: 493 x 317&#13;浏览: 2 次&#13;点击打开新窗口浏览全图" width="493" height="317" /></a></p>
<p>&nbsp;js代码的实现如下：</p>
<div class="codeText">
<div class="codeHead">JavaScript代码</div>
<ol class="dp-c">
    <li class="alt"><span><span class="comment">//主题即被观察者</span><span>&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span><span class="keyword">function</span><span>&nbsp;Subject(){&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">this</span><span>.observers&nbsp;=&nbsp;[];&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>}&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>Subject.prototype.addObserver&nbsp;=&nbsp;<span class="keyword">function</span><span>(observer){&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">this</span><span>.observers.push(observer);&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>}&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>Subject.prototype.delObserver&nbsp;=&nbsp;<span class="keyword">function</span><span>(observer){&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">for</span><span>&nbsp;(</span><span class="keyword">var</span><span>&nbsp;i&nbsp;=&nbsp;0,&nbsp;len&nbsp;=&nbsp;</span><span class="keyword">this</span><span>.observers.length;&nbsp;i&nbsp;&lt;&nbsp;len;&nbsp;i++)&nbsp;{&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">if</span><span>&nbsp;(</span><span class="keyword">this</span><span>.observers[i]&nbsp;==&nbsp;observer)&nbsp;{&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">this</span><span>.observers.splice(i,1);&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">break</span><span>;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>}&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>Subject.prototype.notifyObserver&nbsp;=&nbsp;<span class="keyword">function</span><span>(data){&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">for</span><span>&nbsp;(</span><span class="keyword">var</span><span>&nbsp;i&nbsp;=&nbsp;0,&nbsp;len&nbsp;=&nbsp;</span><span class="keyword">this</span><span>.observers.length;&nbsp;i&nbsp;&lt;&nbsp;len;&nbsp;i++)&nbsp;{&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">this</span><span>.observers[i].updata(data);&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>}&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span><span class="comment">//主题</span><span>&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span><span class="keyword">function</span><span>&nbsp;WeatherDate(){&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;Subject.apply(<span class="keyword">this</span><span>,arguments);&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">this</span><span>.states&nbsp;=&nbsp;{};&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>}&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>WeatherDate.prototype&nbsp;=&nbsp;<span class="keyword">new</span><span>&nbsp;Subject();&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>WeatherDate.prototype.constructor&nbsp;=&nbsp;WeatherDate;&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>WeatherDate.prototype.getState&nbsp;=&nbsp;<span class="keyword">function</span><span>(){&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">return</span><span>&nbsp;</span><span class="keyword">this</span><span>.states;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>};&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>WeatherDate.prototype.setState&nbsp;=&nbsp;<span class="keyword">function</span><span>(obj){&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">this</span><span>.states&nbsp;=&nbsp;obj&nbsp;||&nbsp;{};&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>};&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>WeatherDate.prototype.stateChanged&nbsp;=&nbsp;<span class="keyword">function</span><span>(){&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">this</span><span>.notifyObserver(</span><span class="keyword">this</span><span>.states);&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>}&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span><span class="comment">//观察者超类</span><span>&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span><span class="keyword">function</span><span>&nbsp;Observer(){&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>}&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>Observer.prototype.updata&nbsp;=&nbsp;<span class="keyword">function</span><span>(data){&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">this</span><span>.data&nbsp;=&nbsp;data;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>};&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span><span class="comment">//观察者1</span><span>&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span><span class="keyword">function</span><span>&nbsp;BBSone(){&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;Observer.apply(<span class="keyword">this</span><span>,arguments);&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>}&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>BBSone.prototype&nbsp;=&nbsp;<span class="keyword">new</span><span>&nbsp;Observer();&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>BBSone.prototype.constructor&nbsp;=&nbsp;BBSone;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>BBSone.prototype.updata&nbsp;=&nbsp;<span class="keyword">function</span><span>(data){&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">this</span><span>.data&nbsp;=&nbsp;data;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">this</span><span>.display();&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>};&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>BBSone.prototype.display&nbsp;=&nbsp;<span class="keyword">function</span><span>(){&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">var</span><span>&nbsp;a&nbsp;=&nbsp;[];&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">for</span><span>(</span><span class="keyword">var</span><span>&nbsp;k&nbsp;</span><span class="keyword">in</span><span>&nbsp;</span><span class="keyword">this</span><span>.data){&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">var</span><span>&nbsp;s&nbsp;=&nbsp;k&nbsp;+&nbsp;</span><span class="string">&quot;:&quot;</span><span>&nbsp;+&nbsp;</span><span class="keyword">this</span><span>.data[k];&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;a.push(s)&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;a.join(<span class="string">&quot;/n&quot;</span><span>);&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;alert(<span class="string">&quot;BBSone:__&quot;</span><span>&nbsp;&nbsp;+&nbsp;&nbsp;a);&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>}&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span><span class="comment">//观察者2</span><span>&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span><span class="keyword">function</span><span>&nbsp;BBStwo(){&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;Observer.apply(<span class="keyword">this</span><span>,arguments);&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>}&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>BBStwo.prototype&nbsp;=&nbsp;<span class="keyword">new</span><span>&nbsp;Observer();&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>BBStwo.prototype.constructor&nbsp;=&nbsp;BBSone;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>BBStwo.prototype.updata&nbsp;=&nbsp;<span class="keyword">function</span><span>(data){&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">this</span><span>.data&nbsp;=&nbsp;data;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">this</span><span>.display();&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>};&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>BBStwo.prototype.display&nbsp;=&nbsp;<span class="keyword">function</span><span>(){&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">var</span><span>&nbsp;a&nbsp;=&nbsp;[];&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">for</span><span>(</span><span class="keyword">var</span><span>&nbsp;k&nbsp;</span><span class="keyword">in</span><span>&nbsp;</span><span class="keyword">this</span><span>.data){&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">var</span><span>&nbsp;s&nbsp;=&nbsp;k&nbsp;+&nbsp;</span><span class="string">&quot;-&quot;</span><span>&nbsp;+&nbsp;</span><span class="keyword">this</span><span>.data[k];&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;a.push(s)&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;a.join(<span class="string">&quot;\n&quot;</span><span>);&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;alert(<span class="string">&quot;BBStwo:__&quot;</span><span>+a);&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>}&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span><span class="keyword">function</span><span>&nbsp;main(){&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">var</span><span>&nbsp;s&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;WeatherDate();&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">var</span><span>&nbsp;a1&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;BBSone();&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">var</span><span>&nbsp;a2&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;BBStwo();&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;s.addObserver(a1);&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;s.addObserver(a2);&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;s.setState({t1:<span class="string">&quot;20&quot;</span><span>,t2:</span><span class="string">&quot;50%&quot;</span><span>,t3:</span><span class="string">&quot;0.5&quot;</span><span>});&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;s.stateChanged();&nbsp;<br />
    &nbsp;&nbsp;&nbsp; s.delObserver(a2);<br />
    &nbsp;&nbsp;&nbsp; s.stateChanged();</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>}&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>main();&nbsp;&nbsp;</span></li>
</ol>
</div>
<p>&nbsp;</p>]]></description>
			<link>http://www.footya.com//?action=show&amp;id=118</link>
			<category domain="http://www.footya.com//?cid=11">学习总结</category>
			<pubDate>2011-09-18 17:33</pubDate>
		</item>
		<item>
			<guid>http://www.footya.com//?action=show&amp;id=117</guid>
			<title>《Head First 设计模式》读书笔记1——设计模式之策略模式</title>
			<author>footya</author>
			<description><![CDATA[<p>最近在读《<span class="Apple-style-span" style="font: 14px/18px 宋体, Arial, Helvetica, sans-serif; text-align: left; color: rgb(102, 102, 102); text-transform: none; text-indent: 0px; letter-spacing: normal; word-spacing: 0px; white-space: normal; orphans: 2; widows: 2; font-size-adjust: none; font-stretch: normal; -webkit-text-decorations-in-effect: none; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px;"><a style="margin: 0px 5px 0px 0px; padding: 0px; color: rgb(26, 102, 179); text-decoration: underline; display: inline; outline-style: none;" target="_blank" kesrc="http://product.dangdang.com/product.aspx?product_id=20021171&amp;ref=search-0-mix" ke-onclick="s('click','%C9%E8%BC%C6%C4%A3%CA%BD','01.54.10.00','53_1_30','','','','20021171_1_84607_q','','','');" href="http://product.dangdang.com/product.aspx?product_id=20021171&amp;ref=search-0-mix" name="p_name"><font color="#1a66b3">Head First<span class="Apple-converted-space"> </span></font><span class="skcolor_ljg" style="margin: 0px; padding: 0px; color: rgb(204, 51, 0); font-weight: bold;">设计模式</span></a></span>》，鉴于我记性不好，写点笔记吧。作为一个半路出家的javascript程序员，没有受过专业的训练，对于业务逻辑的分析大脑里没有一个可以依照的原则和思维模式，时常觉得很吃力。<br />
学习设计模式之前先了解一下什么是模式，以下是从网上抄来的一个定义。<br />
<span class="Apple-style-span" style="font: 13px/19px 宋体; color: rgb(255, 0, 0); text-transform: none; text-indent: 28px; letter-spacing: normal; word-spacing: 0px; white-space: normal; orphans: 2; widows: 2; font-size-adjust: none; font-stretch: normal; background-color: rgb(255, 255, 255); -webkit-text-decorations-in-effect: none; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px;">模式：每一个模式描述了一个在我们周围不断重复发生的问题，以及该问题的解决方案的核心。</span><br />
今天记录第一个设计模式&mdash;&mdash;<strong>策略模式（Strategy）</strong></p>
<p><strong>定义：<span style="font-family: Microsoft YaHei;">策略模式定义了</span><span style="font-family: Arial;"><span style="font-family: Microsoft YaHei;">一系列的算法</span></span><span>，<span style="font-family: Microsoft YaHei;">并将每一个算法封装起来</span>，让它们之间可以互相替换，此模式让算法的变化独立于使用算法的客户。</span></strong></p>
<p><strong><span class="Apple-style-span" style="font: 14px/24px arial, 宋体, sans-serif; color: rgb(0, 0, 0); text-transform: none; text-indent: 0px; letter-spacing: normal; word-spacing: 0px; white-space: normal; orphans: 2; widows: 2; font-size-adjust: none; font-stretch: normal; background-color: rgb(255, 255, 255); -webkit-text-decorations-in-effect: none; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px;">（原文：The Strategy Pattern defines a family of algorithms,encapsulates each one,and makes them interchangeable. Strategy lets the algorithm vary independently from clients that use it.）</span></strong></p>
<p><span class="Apple-style-span" style="font: 14px/24px arial, 宋体, sans-serif; color: rgb(0, 0, 0); text-transform: none; text-indent: 0px; letter-spacing: normal; word-spacing: 0px; white-space: normal; orphans: 2; widows: 2; font-size-adjust: none; font-stretch: normal; background-color: rgb(255, 255, 255); -webkit-text-decorations-in-effect: none; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px;"><strong>UML图示：</strong></span></p>
<p><strong><span class="Apple-style-span" style="font: 14px/24px arial, 宋体, sans-serif; color: rgb(0, 0, 0); text-transform: none; text-indent: 0px; letter-spacing: normal; word-spacing: 0px; white-space: normal; orphans: 2; widows: 2; font-size-adjust: none; font-stretch: normal; background-color: rgb(255, 255, 255); -webkit-text-decorations-in-effect: none; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px;"><a href="http://www.footya.com//attachment.php?id=71" target="_blank"><img src="http://www.footya.com//attachments//date_201109/38dc5fd42bbf18d30a739410bb5cef12.png" border="0" alt="大小: 6.19 K&#13;尺寸: 540 x 171&#13;浏览: 0 次&#13;点击打开新窗口浏览全图" width="540" height="171" /></a></span></strong></p>
<p><strong><span class="Apple-style-span" style="font: 14px/24px arial, 宋体, sans-serif; color: rgb(0, 0, 0); text-transform: none; text-indent: 0px; letter-spacing: normal; word-spacing: 0px; white-space: normal; orphans: 2; widows: 2; font-size-adjust: none; font-stretch: normal; background-color: rgb(255, 255, 255); -webkit-text-decorations-in-effect: none; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px;"><strong><span style="font-family: Microsoft YaHei; font-size: 12pt;">策略模式的组成：</span></strong><br />
抽象策略角色(strategy)： 策略类，通常由一个接口或者抽象类实现。<br />
具体策略角色(concreteStrategyA,..)：包装了相关的算法和行为。<br />
环境角色(context)：持有一个策略类的引用，最终给客户调用。<br />
</span><br />
</strong>引用书里的例子：<br />
<strong>需求1：</strong>设计一个游戏，游戏里有各种鸭子，都会游泳。<br />
<strong> 需求2：</strong>一部分鸭子会飞，一部分鸭子不会飞。<br />
<strong>需求3：</strong>可以动态改变一些鸭子的行为，比如通过道具让一些不会飞的鸭子变得会飞。</p>
<p><br />
<strong>初步设计的UML图如下：</strong></p>
<p><span class="Apple-style-span" style="font: 14px/24px arial, 宋体, sans-serif; color: rgb(0, 0, 0); text-transform: none; text-indent: 0px; letter-spacing: normal; word-spacing: 0px; white-space: normal; orphans: 2; widows: 2; font-size-adjust: none; font-stretch: normal; background-color: rgb(255, 255, 255); -webkit-text-decorations-in-effect: none; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px;"><a href="http://www.footya.com//attachment.php?id=70" target="_blank"><img src="http://www.footya.com//attachments//date_201109/f17955e5250f1fa7de61ff8e62d041d3.png" border="0" alt="大小: 5.51 K&#13;尺寸: 398 x 305&#13;浏览: 0 次&#13;点击打开新窗口浏览全图" width="398" height="305" /></a></span></p>
<p>Ducks是使用飞行算法的客户，也就是上面提到的<span style="font-family: Arial;"><span style="font-family: Microsoft YaHei;">环境角色(context)，持有策略类<span style="font-family: Microsoft YaHei;">FlyBehavior</span>的引用。</span></span></p>
<p><span style="font-family: Arial;"><span style="font-family: Microsoft YaHei;">FlyBehavior就是上面提到的<span style="font-family: Arial;"><span style="font-family: Microsoft YaHei;">抽象策略角色(strategy)，<span style="font-family: Arial;">这里它是一个抽象类，定义了fly方法由子类实现具体的行为</span>。</span></span></span></span></p>
<p><span style="font-family: Arial;"><span style="font-family: Microsoft YaHei;"><span style="font-family: Arial;"><span style="font-family: Microsoft YaHei;">FlyNoWay和FlyNoWay就是上面提到的<span style="font-family: Arial;">具体策略角色，它们继承自FlyBehavior，并实现fly方法的具体行为。</span></span></span></span></span></p>
<p>&nbsp;</p>
<p>以下是js对上述描述的实现</p>
<p>&nbsp;</p>
<div class="codeText">
<div class="codeHead">JavaScript代码</div>
<ol class="dp-c">
    <li class="alt"><span><span class="comment">//抽象策略角色&mdash;&mdash;飞行行为抽象类</span><span>&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span><span class="keyword">function</span><span>&nbsp;FlyBehavior(){&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>}&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>FlyBehavior.prototype.fly&nbsp;=&nbsp;<span class="keyword">function</span><span>(){&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;alert(<span class="string">&quot;please&nbsp;do&nbsp;the&nbsp;fly&nbsp;method&quot;</span><span>);&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>}&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span><span class="comment">//具体策略角色&mdash;&mdash;实现不能飞的策略</span><span>&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span><span class="keyword">function</span><span>&nbsp;FlyNoWay(){&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;FlyBehavior.apply(<span class="keyword">this</span><span>,arguments)&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>}&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>FlyNoWay.prototype&nbsp;=&nbsp;<span class="keyword">new</span><span>&nbsp;FlyBehavior();&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>FlyNoWay.prototype.constructor&nbsp;=&nbsp;FlyNoWay;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>FlyNoWay.prototype.fly&nbsp;=&nbsp;<span class="keyword">function</span><span>(){&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;alert(<span class="string">&quot;I&nbsp;can't&nbsp;fly&quot;</span><span>);&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>}&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span><span class="comment">//具体策略角色&mdash;&mdash;实现能飞的策略</span><span>&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span><span class="keyword">function</span><span>&nbsp;FlyWithWings(){&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;FlyBehavior.apply(<span class="keyword">this</span><span>,arguments)&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;}&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>FlyWithWings.prototype&nbsp;=&nbsp;<span class="keyword">new</span><span>&nbsp;FlyBehavior();&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>FlyWithWings.prototype.constructor&nbsp;=&nbsp;FlyWithWings;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>FlyWithWings.prototype.fly&nbsp;=&nbsp;<span class="keyword">function</span><span>(){&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;alert(<span class="string">&quot;I'm&nbsp;flying&quot;</span><span>);&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>};&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span><span class="comment">//环境角色-使用飞行策略的客户</span><span>&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span><span class="keyword">function</span><span>&nbsp;Ducks(fly){&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">this</span><span>._flyBehavior&nbsp;=&nbsp;fly;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">this</span><span>.fly&nbsp;=&nbsp;</span><span class="keyword">function</span><span>(){&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">this</span><span>._flyBehavior.fly();&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;};&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;}&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;Ducks.prototype.swim&nbsp;=&nbsp;<span class="keyword">function</span><span>(){&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;alert(<span class="string">&quot;I'm&nbsp;swiming&quot;</span><span>);&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;}&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span><span class="comment">//以下执行A可以飞，B不可以飞</span><span>&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span><span class="keyword">var</span><span>&nbsp;DuckA&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;Ducks(</span><span class="keyword">new</span><span>&nbsp;FlyWithWings());&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>DuckA.fly();&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span><span class="keyword">var</span><span>&nbsp;DuckB&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;Ducks(</span><span class="keyword">new</span><span>&nbsp;FlyNoWay());&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>DuckB.fly();&nbsp;&nbsp;</span></li>
</ol>
</div>
<p>&nbsp;<br />
未完待续...(需要加上动态修改具体策略部分的逻辑)</p>
<p>&nbsp;</p>
<p>&nbsp;</p>]]></description>
			<link>http://www.footya.com//?action=show&amp;id=117</link>
			<category domain="http://www.footya.com//?cid=11">学习总结</category>
			<pubDate>2011-09-07 22:46</pubDate>
		</item>
		<item>
			<guid>http://www.footya.com//?action=show&amp;id=116</guid>
			<title>iPad相关的css问题总结</title>
			<author>footya</author>
			<description><![CDATA[<p><span class="Apple-style-span" style="font:/normal Simsun; color: rgb(0, 0, 0); text-transform: none; text-indent: 0px; letter-spacing: normal; word-spacing: 0px; white-space: normal; border-collapse: separate; orphans: 2; widows: 2; -webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; -webkit-text-decorations-in-effect: none; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px;"><span class="Apple-style-span" style="line-height: 16px; font-family: Verdana, arial, sans-serif; font-size: 12px;">
<div id="content">
<div class="wiki-content" style="line-height: 16px; font-size: 11px; margin-right: 10px;">
<h3 style="margin: 3px 0px 0px; padding: 0px; color: rgb(0, 51, 102); line-height: normal; font-family: Arial, sans-serif; font-size: 14pt; font-weight: bold; border-bottom-width: 0px; background-color: rgb(240, 240, 240);"><a name="iPad%E7%9B%B8%E5%85%B3%E7%9A%84css%E9%97%AE%E9%A2%98%E6%80%BB%E7%BB%93-1%E3%80%81ipad%E4%B8%8B%E6%96%87%E5%AD%97%E7%9C%8B%E8%B5%B7%E6%9D%A5%E6%9B%B4%E7%A8%80%E7%96%8F%EF%BC%8C%E5%8D%B3%E6%96%87%E5%AD%97%E9%97%B4%E7%9A%84%E9%97%B4%E8%B7%9D%E6%9B%B4%E5%A4%A7%EF%BC%9A"></a>1、ipad下文字看起来更稀疏，即文字间的间距更大：</h3>
<p style="margin: 16px 0px; padding: 0px; color: rgb(0, 0, 0); line-height: 16px; font-family: Verdana, arial, sans-serif; font-size: 11px; font-weight: normal;">表现：pc正好的文字在ipad下看可能折行<br />
解决办法：缩小ipad的字间距如羡慕css代码</p>
<div class="code panel" style="margin: 0px 10px 10px; padding: 0px; border: 1px dashed rgb(60, 120, 181); color: black; line-height: 13px; font-family: Courier; font-size: 11px; overflow-x: auto; overflow-y: auto; background-color: rgb(255, 255, 255);">
<div class="codeContent panelContent" style="margin: 0px; padding: 5px; text-align: left; color: rgb(0, 0, 0); font-size: 0.95em; background-color: rgb(240, 240, 240);">
<pre class="code-java" style="margin: 5px 5px 5px 15px; padding: 0px; text-align: left; line-height: 1.3; font-family: &quot;Courier New&quot;, Courier, monospace; overflow-x: auto; overflow-y: auto;">/*以下css只有ipad可以识别*/ @media only screen and (min-device-width: 768px) and (max-device-width: 1024px){  .partA .one_r strong{letter-spacing:-1px;} }</pre>
</div>
</div>
<h3 style="margin: 20px 0px 0px; padding: 0px; color: rgb(0, 51, 102); line-height: normal; font-family: Arial, sans-serif; font-size: 14pt; font-weight: bold; border-bottom-width: 0px; background-color: rgb(240, 240, 240);"><a name="iPad%E7%9B%B8%E5%85%B3%E7%9A%84css%E9%97%AE%E9%A2%98%E6%80%BB%E7%BB%93-2%E3%80%81ipad%E4%B8%8B%E7%9A%84%E6%A8%A1%E5%9D%97%E5%B1%85%E4%B8%AD%E6%9C%89%E6%97%B6%E4%B8%8D%E8%B5%B7%E4%BD%9C%E7%94%A8"></a>2、ipad下的模块居中有时不起作用</h3>
<p style="margin: 16px 0px; padding: 0px; color: rgb(0, 0, 0); line-height: 16px; font-family: Verdana, arial, sans-serif; font-size: 11px; font-weight: normal;">表现：pc模块可以居中ipad下有时就不居中<br />
解决办法：模块除了定宽和margin auto后，需要设置overflow:hidden阻止模块内元素溢出</p>
</div>
</div>
</span></span></p>]]></description>
			<link>http://www.footya.com//?action=show&amp;id=116</link>
			<category domain="http://www.footya.com//?cid=2">XHTML/CSS</category>
			<pubDate>2011-08-08 22:33</pubDate>
		</item>
		<item>
			<guid>http://www.footya.com//?action=show&amp;id=115</guid>
			<title>haslayout对动态改变布局的影响</title>
			<author>footya</author>
			<description><![CDATA[<p>最近又碰到一个很诡异的css问题，把下面这段代码用ie6/7运行试试：</p>
<div class="codeText">
<div class="codeHead">XML/HTML代码</div>
<ol class="dp-xml">
    <li class="alt"><span><span>&lt;!DOCTYPE&nbsp;html&nbsp;PUBLIC&nbsp;&quot;-//W3C//DTD&nbsp;XHTML&nbsp;1.0&nbsp;Transitional//EN&quot;&nbsp;&quot;http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd&quot;</span><span class="tag">&gt;</span><span>&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span><span class="tag">&lt;</span><span class="tag-name">html</span><span>&nbsp;</span><span class="attribute">xmlns</span><span>=</span><span class="attribute-value">&quot;http://www.w3.org/1999/xhtml&quot;</span><span class="tag">&gt;</span><span>&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">head</span><span class="tag">&gt;</span><span>&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">meta</span><span>&nbsp;</span><span class="attribute">http-equiv</span><span>=</span><span class="attribute-value">&quot;Content-Type&quot;</span><span>&nbsp;</span><span class="attribute">content</span><span>=</span><span class="attribute-value">&quot;text/html;&nbsp;charset=utf-8&quot;</span><span>&nbsp;</span><span class="tag">/&gt;</span><span>&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;/</span><span class="tag-name">head</span><span class="tag">&gt;</span><span>&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">body</span><span class="tag">&gt;</span><span>&nbsp;</span></span></li>
    <li class="alt"><span><span class="tag">&lt;</span><span class="tag-name">div</span><span>&nbsp;</span><span class="attribute">id</span><span>=</span><span class="attribute-value">&quot;s1&quot;</span><span>&nbsp;</span><span class="attribute">style</span><span>=</span><span class="attribute-value">&quot;&quot;</span><span class="tag">&gt;</span><span>s1</span><span class="tag">&lt;/</span><span class="tag-name">div</span><span class="tag">&gt;</span><span>&nbsp;</span></span></li>
    <li class="alt"><span><span class="tag">&lt;</span><span class="tag-name">div</span><span>&nbsp;</span><span class="attribute">id</span><span>=</span><span class="attribute-value">&quot;s2&quot;</span><span>&nbsp;</span><span class="attribute">style</span><span>=</span><span class="attribute-value">&quot;display:none;position:absolute;left:120px;top:20px;&quot;</span><span class="tag">&gt;</span><span>s2</span><span class="tag">&lt;/</span><span class="tag-name">div</span><span class="tag">&gt;</span><span>&nbsp;</span></span></li>
    <li class="alt"><span><span class="tag">&lt;</span><span class="tag-name">div</span><span>&nbsp;</span><span class="attribute">id</span><span>=</span><span class="attribute-value">&quot;s3&quot;</span><span>&nbsp;</span><span class="attribute">style</span><span>=</span><span class="attribute-value">&quot;margin-top:50px;zoom:1;&quot;</span><span class="tag">&gt;</span><span>s3</span><span class="tag">&lt;/</span><span class="tag-name">div</span><span class="tag">&gt;</span><span>&nbsp;</span></span></li>
    <li class="alt"><span><span class="tag">&lt;/</span><span class="tag-name">body</span><span class="tag">&gt;</span><span>&nbsp;</span></span></li>
    <li class="alt"><span><span class="tag">&lt;</span><span class="tag-name">script</span><span>&nbsp;</span><span class="attribute">type</span><span>=</span><span class="attribute-value">&quot;text/javascript&quot;</span><span class="tag">&gt;</span><span>&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;<span class="attribute">s1</span><span>&nbsp;=&nbsp;</span><span class="attribute-value">document</span><span>.getElementById(&quot;s1&quot;);&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;<span class="attribute">s2</span><span>&nbsp;=&nbsp;</span><span class="attribute-value">document</span><span>.getElementById(&quot;s2&quot;);&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;<span class="attribute">s3</span><span>&nbsp;=&nbsp;</span><span class="attribute-value">document</span><span>.getElementById(&quot;s3&quot;);&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="attribute">s1.onmouseover</span><span>&nbsp;=&nbsp;</span><span class="attribute-value">function</span><span>(e){&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="attribute">s2.style.display</span><span>&nbsp;=&nbsp;</span><span class="attribute-value">&quot;&quot;</span><span>;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="attribute">s1.onmouseout</span><span>&nbsp;=&nbsp;</span><span class="attribute-value">function</span><span>(e){&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="attribute">s2.style.display</span><span>&nbsp;=&nbsp;</span><span class="attribute-value">&quot;none&quot;</span><span>;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span></li>
    <li class="alt"><span><span class="tag">&lt;/</span><span class="tag-name">script</span><span class="tag">&gt;</span><span>&nbsp;</span></span></li>
    <li class="alt"><span><span class="tag">&lt;/</span><span class="tag-name">html</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
</ol>
</div>
<p><strong>现象：</strong><br />
IE6/7下<br />
鼠标滑过s1时，s2显示，s3会向上跳，<br />
鼠标滑出s1时，s2隐藏，s3回到原位，<br />
s3的这个跳动是我们不希望的。<br />
<br />
<strong>原因：</strong><br />
IE6\7下s3元素拥有haslayout后，s2的显示和隐藏会对s3的margin有影响<br />
鼠标滑过s1时，s2显示，s3的margin-top属性会失效<br />
鼠标滑出s1时，s2隐藏，s3的margin-top属性又生效<br />
<br />
<strong>解决办法：</strong><br />
<s>1、去掉s3上的zoom属性，或者再加zoom:0可以消除这个影响;</s>（这个方法只对没有宽高的元素起作用）<br />
2、s3的margin-top属性修改为padding-top;<br />
3、s3和s2之间插入任意字符；<br />
4、s3里面再加一层div s4把margin-top属性写在s4上;
<br />
上面任意一种办法都可以解决这个问题，你可以试着找找，欢迎把有创意的好办法反馈回来</p>]]></description>
			<link>http://www.footya.com//?action=show&amp;id=115</link>
			<category domain="http://www.footya.com//?cid=2">XHTML/CSS</category>
			<pubDate>2011-07-20 23:01</pubDate>
		</item>
		<item>
			<guid>http://www.footya.com//?action=show&amp;id=114</guid>
			<title>伪类对IE9 css透明属性的影响</title>
			<author>footya</author>
			<description><![CDATA[<p>如果不是IE9下遇到诡异的显示问题，怎么也不会把伪类和透明联系起来，最近的项目遇到了这样的问题：<br />
js动态设置一个容器为不透明，但是IE9下鼠标一滑过这个容器这个容器就不见了。各种手段调试了很久才发现，这个问题原来是因为IE9同时支持opacity和filter导致的。<br />
经过反复测试得出如下结论：<br />
1、IE9同时支持filter和opacity；<br />
<br />
2、filter的优先级更高 <br />
&nbsp;filter:alpha(opacity=0)；opacity:1;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 透明 <br />
&nbsp;filter:alpha(opacity=100)；opacity:0;&nbsp; 不透明 <br />
<br />
3、单独使用都可以起作用<br />
&nbsp;filter:alpha(opacity=50) <br />
&nbsp;opacity:0.5 <br />
<br />
4、css伪类(除a:hover)&nbsp;&nbsp;&nbsp; <br />
li:hover{}会触发opacity生效<br />
&nbsp;&nbsp;filter:alpha(opacity=0)；opacity:1;默认不透明<br />
&nbsp;&nbsp;鼠标滑过会触发filter生效，变为不透明&nbsp;<br />
<br />
li:active{} 点击时有类型的表现<br />
&nbsp; filter:alpha(opacity=0)；opacity:1;默认不透明<br />
&nbsp;&nbsp; 鼠标滑过会触发filter生效，变为不透明 <br />
<br />
查看示例：<a target="_blank" href="http://www.footya.com/demo/ie9/hover.html">《IE9 css伪类对透明属性的影响测试》</a></p>]]></description>
			<link>http://www.footya.com//?action=show&amp;id=114</link>
			<category domain="http://www.footya.com//?cid=2">XHTML/CSS</category>
			<pubDate>2011-06-21 22:28</pubDate>
		</item>
		<item>
			<guid>http://www.footya.com//?action=show&amp;id=113</guid>
			<title>apache ssi 配置</title>
			<author>footya</author>
			<description><![CDATA[<p>&nbsp;httpd.conf文件<br />
#AddType text/html .shtml<br />
&nbsp;#AddOutputFilter INCLUDES .shtml<br />
替换成：<br />
AddType text/html .html<br />
AddOutputFilter INCLUDES .html</p>
<p>html文件里这样写就可以引入所需代码<br />
&lt;!--#include file=&quot;gui_Header.html&quot;--&gt;</p>]]></description>
			<link>http://www.footya.com//?action=show&amp;id=113</link>
			<category domain="http://www.footya.com//?cid=11">学习总结</category>
			<pubDate>2011-04-09 08:22</pubDate>
		</item>
		<item>
			<guid>http://www.footya.com//?action=show&amp;id=109</guid>
			<title>apache配置 php中没有php5apache2_2.dll的原因及解决办法</title>
			<author>footya</author>
			<description><![CDATA[<p>在给apache配置php的过程中,如果php安装目录里没有php5apache2_2.dll,一定是下载的版本不对。 <br />
php 5.3.4有v9版和v6好几个版本 <br />
网站左边有几段文字: <br />
which version do i choose?<br />
if you are using php with apache 1 or apache2 from apache.org you need to use the vc6 versions of php <br />
所以要下载v6c versions of php ，<br />
v6c又有两个版本如下：<br />
vc6 x86 non thread safe <br />
vc6 x86 thread safe <br />
以上两个版本中，non thread safe版的php在安装过程中,<br />
没有apache的选项: <br />
select the web server you wish to setup <br />
iis fastcgi <br />
other cgi <br />
do not setup a web server<br />
<br />
而thread safe版的安装过程中有apache 2.2.x module选项:<br />
select the web server you wish to setup<br />
apache 2.2.x module <br />
apache cgi<br />
iis fastcgi <br />
iis cgi <br />
nsapi <br />
xitami<br />
netserve web server <br />
other cgi <br />
do not setup a web server <br />
------------------------- <br />
所以应该下载的版本是 php 5.3.4vc6 x86 thread safe 去php官网下载,http://windows.php.net/download</p>
<p>有关apache的安装和配置请参照：<a target="_blank" href="http://tech.163.com/06/0206/11/299AMBLT0009159K.html">《Apache+php+mysql在windows下的安装与配置图解（最新版）》</a></p>]]></description>
			<link>http://www.footya.com//?action=show&amp;id=109</link>
			<category domain="http://www.footya.com//?cid=11">学习总结</category>
			<pubDate>2011-02-27 10:36</pubDate>
		</item>
		<item>
			<guid>http://www.footya.com//?action=show&amp;id=108</guid>
			<title>Apache的Mode Rewrite模块的简单试用</title>
			<author>footya</author>
			<description><![CDATA[<p><strong>1</strong>、在[Apache安装目录]/conf/httpd.conf中找到<br />
#LoadModule rewrite_module modules/mod_rewrite.so，去掉前面的注释符号#。<br />
<strong>2</strong>、在[Apache安装目录]/conf/httpd.conf中找到<br />
&lt;Directory /&gt;<br />
&nbsp;&nbsp;&nbsp; Options FollowSymLinks<br />
&nbsp;&nbsp;&nbsp; AllowOverride None<br />
&nbsp;&nbsp;&nbsp; Order deny,allow<br />
&nbsp;&nbsp;&nbsp; Deny from all<br />
&lt;/Directory&gt;<br />
把&ldquo;AllowOverride None&rdquo;改成&ldquo;AllowOverride All&rdquo;<br />
<strong>3</strong>、在[Apache安装目录]/conf/httpd.conf中增加<br />
RewriteEngine on <br />
#RewriteBase /<br />
RewriteRule ^/$ /new [R] <br />
<font color="#ff0000">*</font><font color="#ff0000">以上规则的意思是访问根目录时定向到/new文件下</font></p>]]></description>
			<link>http://www.footya.com//?action=show&amp;id=108</link>
			<category domain="http://www.footya.com//?cid=11">学习总结</category>
			<pubDate>2011-02-12 15:58</pubDate>
		</item>
		<item>
			<guid>http://www.footya.com//?action=show&amp;id=107</guid>
			<title>软件设计师培训领悟</title>
			<author>footya</author>
			<description><![CDATA[<p>能有这次培训机会纯属意外，短期的培训不是丰胸，不可能立刻就见效，培训只是提供一些思考方式和思路，为自己以后得设计提供一个参考，总之还是有点用处的。<br />
感悟如下： <br />
1、停止抱怨，不要老是怪需求变更等等；<br />
2、提高自身素质，从小事做起，产品的好坏和程序员的素质息息相关；<br />
3、从重构一步步到优秀；<br />
4、克服代码的不良习惯，避免代码坏味道，避免大泥球；<br />
5、架构和设计没有严格的界限，源代码也是设计；<br />
6、需求的隐形成本需要能够描述清楚； <br />
7、好的设计是1）实现需求，2）便于理解，3）可以应对变化； <br />
8、架构图需要分开维度，不同的人关注不同的东西；<br />
9、好好学习下设计模式，运用到自己的项目里去，及时开始用的很烂也要去尝试；<br />
10、兵熊熊一个，将熊熊一窝，架构设计师的好坏决定着项目的成败；</p>]]></description>
			<link>http://www.footya.com//?action=show&amp;id=107</link>
			<category domain="http://www.footya.com//?cid=6">我参与的</category>
			<pubDate>2010-10-27 23:00</pubDate>
		</item>
		<item>
			<guid>http://www.footya.com//?action=show&amp;id=106</guid>
			<title>[译]iPad css布局在横向和纵向下的定位方法</title>
			<author>footya</author>
			<description><![CDATA[<p><a href="http://www.footya.com//attachment.php?id=69" target="_blank"><img src="http://www.footya.com//attachments//date_201010/bc8c2f8e43997d211e25cdbca1d7ccc4.jpg" border="0" alt="大小: 27.85 K&#13;尺寸: 800 x 230&#13;浏览: 4 次&#13;点击打开新窗口浏览全图" width="800" height="230" /></a><br />
原文：《<a href="http://matthewjamestaylor.com/blog/ipad-layout-with-landscape-portrait-modes"><font face="Comic Sans MS">iPad CSS Layout with landscape / portrait orientation modes</font></a>》</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; iPad今天终于登陆澳大利亚了，尽情<span style="widows: 2; text-transform: none; text-indent: 0px; border-collapse: separate; font: medium Arial, Helvetica, sans-serif; white-space: normal; orphans: 2; letter-spacing: normal; color: rgb(0,0,0); word-spacing: 0px; -webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; -webkit-text-decorations-in-effect: none; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px" class="Apple-style-span"><span style="color: rgb(51,51,51); font-size: 14px" class="Apple-style-span">欢呼吧！我准备尽快入手一台，这样就能继续完善我的css布局了使其尽可能的支持更多的设备了。可惜我现在还得继续使用iPhone SDK提供的iPad仿真器。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 为了庆祝iPad登陆我做了一个特别的 <a href="http://matthewjamestaylor.com/demos/ipad-css-layout/index.html">iPad网站布局</a>，这个布局只用css就能实现iPad 横向和竖向的布局变化。这个布局可以从文章的结尾或者我的iPad示例页免费下载。<br />
下面是这两种布局的一个简单的示意图：<br />
<a href="http://www.footya.com//attachment.php?id=67" target="_blank"><img src="http://www.footya.com//attachments//date_201010/b9bf36ea85620f43a659b960b09f2eda.jpg" border="0" alt="大小: 16.11 K&#13;尺寸: 500 x 303&#13;浏览: 4 次&#13;点击打开新窗口浏览全图" width="500" height="303" /></a><br />
在横向（Landscape）的布局里有两列。主体内容在左边宽的一列里，三个碎块垂直叠在比较拥挤的右侧。当你把iPad竖起来时这个界面变为只有一列的设计。在竖向（Portrait）的布局里，主体内容占据了整个屏的宽度，剩下的三部分按三列横向依次定位到主体内容的下面。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在这两种布局里有一个位于顶端的标头和一个位于地部的页脚。他们在横向时宽1024px，纵向时宽768px。看我的<a href="http://matthewjamestaylor.com/demos/ipad-css-layout/index.html"><font color="#333333">演示页</font></a>可以看到更详细的精确到像素的范围。以下是我的演示页在iPad模拟器里的截图：<br />
</span></span><span style="widows: 2; text-transform: none; text-indent: 0px; border-collapse: separate; font: medium Arial, Helvetica, sans-serif; white-space: normal; orphans: 2; letter-spacing: normal; color: rgb(0,0,0); word-spacing: 0px; -webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; -webkit-text-decorations-in-effect: none; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px" class="Apple-style-span"><span style="color: rgb(51,51,51); font-size: 14px" class="Apple-style-span"><a href="http://www.footya.com//attachment.php?id=68" target="_blank"><img src="http://www.footya.com//attachments//date_201010/b1c84bb32e50c71b70e02c133ba9a244.jpg" border="0" alt="大小: 51.46 K&#13;尺寸: 500 x 269&#13;浏览: 22 次&#13;点击打开新窗口浏览全图" width="500" height="269" /></a><br />
<strong>这是怎么做到的？<br />
</strong>首先我按1:1比例限定了这两种布局下的宽度使得它们能和iPad精确到像素的完全吻合。我用到了下面的META 标签：<br />
</span></span>这个变换布局的方法在没有JavaScript的帮助下就可以非常完美的工作。查看我的iPad布局示例或者直接下载示例文件亲自试一试。<a href="http://matthewjamestaylor.com/demos/ipad-css-layout/index.html">Demo</a>&nbsp;&nbsp; <a href="http://matthewjamestaylor.com/demos/ipad-css-layout/ipad-css-layout.zip"><font color="#00ff00">Download</font></a>(<span style="widows: 2; text-transform: none; text-indent: 0px; border-collapse: separate; font: medium Simsun; white-space: normal; orphans: 2; letter-spacing: normal; color: rgb(0,0,0); word-spacing: 0px; -webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; -webkit-text-decorations-in-effect: none; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px" class="Apple-style-span"><span style="line-height: 48px; font-family: Verdana, Geneva, sans-serif; color: rgb(102,102,102); font-size: 16px" class="Apple-style-span"><font size="2" face="Comic Sans MS">ipad-css-layout.zip - 41kb</font></span></span>)<br />
希望你们能够喜欢这篇文章。如果你正在用你的iPad读这篇文章。。。那么你真是太幸运了：）。</p>
<div class="codeText">
<div class="codeHead">XML/HTML代码</div>
<ol class="dp-xml">
    <li class="alt"><span><span class="tag">&lt;</span><span class="tag-name">meta</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;viewport&quot;</span><span>&nbsp;</span><span class="attribute">content</span><span>=</span><span class="attribute-value">&quot;width=768px,&nbsp;minimum-scale=1.0,&nbsp;maximum-scale=1.0&quot;</span><span>&nbsp;</span><span class="tag">/&gt;</span><span>&nbsp;&nbsp;</span></span></li>
</ol>
</div>
<p>以1:1的比例限定布局可以在iPad旋转时防止放大甚至溢出到正常的屏幕之外（通常，横向时更容易被放大，因为网页的被横跨1024px显示，与横向相比纵向时只有768px的宽度是可用的）。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 接下来结合这些我要利用一些css的规则来改变在竖向和横向下的布局。我能做到这些是利用@media的相关规则在竖向时把横向布局的css样式覆盖掉。下面是一些相关的css片断：</p>
<div class="codeText">
<div class="codeHead">CSS代码</div>
<ol class="dp-css">
    <li class="alt"><span><span class="comment">/*normal&nbsp;styles&nbsp;here&nbsp;*/</span><span>&nbsp;&nbsp;</span></span></li>
    <li><span class="colors">#wrap</span><span>&nbsp;{ &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;</span><span class="keyword">width</span><span>:</span><span class="string">1024px</span><span>; &nbsp;&nbsp;</span></li>
    <li><span>} &nbsp;&nbsp;</span></li>
    <li class="alt"><span>@media&nbsp;only&nbsp;</span><span class="string">screen</span><span>&nbsp;and&nbsp;(orientation:</span><span class="string">portrait</span><span>){ &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;</span><span class="comment">/*&nbsp;portrait&nbsp;styles&nbsp;here&nbsp;*/</span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;</span><span class="colors">#wrap</span><span>&nbsp;{ &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">width</span><span>:</span><span class="string">768px</span><span>; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li><span>}&nbsp;&nbsp;</span></li>
</ol>
</div>
<p>&nbsp;</p>
<p>--------------------------译文完-------------------------</p>
<p>文章并非逐字逐句翻译，很多都是按自己的理解写的，文章里的例子并没有用iPad试过，因为俺还没有：（。<br />
此篇文章献给我曾经拥有过的好运，刚抽中的iPad就被取消了，很是郁闷，希望自己那天能真正拥有iPad的：）。</p>]]></description>
			<link>http://www.footya.com//?action=show&amp;id=106</link>
			<category domain="http://www.footya.com//?cid=2">XHTML/CSS</category>
			<pubDate>2010-10-22 15:23</pubDate>
		</item>
		<item>
			<guid>http://www.footya.com//?action=show&amp;id=102</guid>
			<title>一场关于用户体验的争论</title>
			<author>footya</author>
			<description><![CDATA[<p>今天和同事讨论一个设计的合理性，悟到了一些东西。<br />
先看两张图吧，以下两张图式针对项目里联系人分组模块的两种设计：</p>
<p><a href="http://www.footya.com//attachment.php?id=64" target="_blank"><img src="http://www.footya.com//attachments//date_201009/5f164a6fa6495c88c326b06c9fb8edf4.png" border="0" alt="大小: 10.04 K&#13;尺寸: 476 x 358&#13;浏览: 2 次&#13;点击打开新窗口浏览全图" width="476" height="358" /></a><br />
图1：所有分组放在上面，如果分组个数超出宽度可以容纳的范围，会在两边出现通过点击可以滑动的小箭头。<br />
<a href="http://www.footya.com//attachment.php?id=65" target="_blank"><img src="http://www.footya.com//attachments//date_201009/725ecd137982acecc64e4e7787188164.png" border="0" alt="大小: 11.33 K&#13;尺寸: 543 x 358&#13;浏览: 1 次&#13;点击打开新窗口浏览全图" width="543" height="358" /></a><br />
图2：所有分组放在左边，分组一直向下延伸，有多少个显示多少个。<br />
<br />
<strong>两种设计的对比</strong>：</p>
<p><strong>维度1</strong>【美观程度】：<br />
图1的设计操作看起来更酷一点，喜欢炫酷效果的人可能会更喜欢第一种。<br />
图2的设计简单直观，所有分组一目了然，这样的界面也会赢得很多人的喜欢。</p>
<p><strong>维度2</strong>【操作成本】：<br />
图1的设计要看第一个分组还好说直接点击一下就可以了，但是当分组多了以后，如果要看最后一个的时候就惨了，首先要把鼠标移动到右边那个很小的箭头上，接下来点击这个箭头，如果分组多的话需要点击很多次箭头才能到达最后一个。<br />
图2的设计只需移动鼠标到分组页签，一次点击操作就可以看到自己想看的分组，如果分组多的话最多再滚几下滚轮，相比起来这个设计的操作成本要比图1小很多。</p>
<p><strong>维度3</strong>【搜索】：<br />
图1的设计页签处只能显示固定个数的分组，多出来的分组不点击箭头是不会显示出来的。图2的设计所有分组页签都显示在页面上。如果找不到分组，想要ctrl+F搜索的时候图2的优势就显示出来了。</p>
<p><strong>维度4</strong>【开发成本】：<br />
图1的设计复杂度高于图2，从页面制作到js逻辑实现都要比图2复杂很多，需要些更多的代码才能实现，开发成本不言而喻。</p>
<p>现在看来该选择哪一种设计就一目了然了。其实这个时候再回头看看最原始的设计就会发现上面两个已经是很大的进步了原始的设计如下图3：<br />
<a href="http://www.footya.com//attachment.php?id=66" target="_blank"><img src="http://www.footya.com//attachments//date_201009/b0f7e71a4335e50da9535f7294a90217.png" border="0" alt="大小: 11.18 K&#13;尺寸: 400 x 481&#13;浏览: 1 次&#13;点击打开新窗口浏览全图" width="400" height="481" /></a>。</p>]]></description>
			<link>http://www.footya.com//?action=show&amp;id=102</link>
			<category domain="http://www.footya.com//?cid=10">用户体验</category>
			<pubDate>2010-09-08 00:29</pubDate>
		</item>
		<item>
			<guid>http://www.footya.com//?action=show&amp;id=101</guid>
			<title>琐事</title>
			<author>footya</author>
			<description><![CDATA[<p>看了下上一篇正式博文的时间到现在已经过去9个多月了，期间很长一段时间没有写东西，一方面是因为自己很懒，另一方面是因为域名出了点小问题，被迫关闭了半年多。在这巧无声息的9个月里，曾经有很多感悟和积累想写下来，都因为博客出问题偷懒了，趁着现在有点记忆捡点碎片吧。 <br />
<strong>1、户外</strong>：首先感谢美女格子，带我进入户外这个圈子，让我的业余生活变的丰富多彩，心态也变得更加乐观向上，更重要的是让我遇到了温柔、善良、贤惠等等优点的花花。感悟：&ldquo;你怎么对待生活，生活就会怎么对待你&rdquo;。<br />
<strong> 2、辞职</strong>：在纠结了3个多月以后，最终选择离开待了将近3年的新浪，很怀念那激情澎湃的日子和那些满怀理想的人们，是他们让我快速成长。新浪论坛、新浪吧、新浪页面构建、新浪RIA、新浪邮箱所有的这些都将是我宝贵的经历。 <br />
<strong>3、旅行</strong>：今年到目前为止去过的地方有济南(很暖和，但是不太干净)、青岛(一尘不染的美)、杭州(我的G1被永远的留在了那)、南京(厚重的像一位老人)、漠河(那里拥有目前为止很难见到的朴实人群)、北极村(中国最北，传说可以看到北极光的地方)、哈尔滨(一个很有情调的地方)。。。接下来会去哪我也不知道，总之如果时间和资金允许我不会停下来。 <br />
<strong>4、尊重</strong>：新的工作承担了新的责任，开始压力很大，自己在压力中磨练也在压力中成长。虽然团队在磨合过程中产生了一些冲突，但是只要大家心无恶意互相尊重，一切都不是问题。 <br />
<strong>5、自律</strong>：多与积极向上的人交流，不与满腹牢骚的愤青一起抱怨，环境不会因为抱怨而变好，只会因你积极向上而有所改善，情绪是可以传染的。自己要做的自律自省，不受别人影响也不要传染别人。 <br />
<strong>6、管理</strong>：新的工作有机会尝试一些管理类的事情，从面试、项目评估、任务分配再到一起做事情，学到了很多也结识了不少新朋友。 <br />
<strong>7、运动</strong>：很开心新的公司也开了游泳俱乐部，八中的游泳馆，50m、8泳道、都2M深，太爽了，重来没见过这么宽敞的游泳池。下一步准备参加羽毛球俱乐部，让身体接受全方位的锻炼。</p>]]></description>
			<link>http://www.footya.com//?action=show&amp;id=101</link>
			<category domain="http://www.footya.com//?cid=4">最近心情</category>
			<pubDate>2010-08-30 20:58</pubDate>
		</item>
		<item>
			<guid>http://www.footya.com//?action=show&amp;id=100</guid>
			<title>博客程序修复</title>
			<author>footya</author>
			<description><![CDATA[<p>试试</p>]]></description>
			<link>http://www.footya.com//?action=show&amp;id=100</link>
			<category domain="http://www.footya.com//?cid=4">最近心情</category>
			<pubDate>2010-08-24 23:53</pubDate>
		</item>
		<item>
			<guid>http://www.footya.com//?action=show&amp;id=98</guid>
			<title>《javascript高级程序设计》读书笔记3:事件</title>
			<author>footya</author>
			<description><![CDATA[<div class="Section0" style="layout-grid:  15.6pt none">
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-size: 10.5pt; font-family: 'Times New Roman'; mso-spacerun: 'yes'">js<font face="宋体">和</font><font face="Times New Roman">HTML</font><font face="宋体">直接的交互是通过用户和浏览器操作页面时引发的事件来处理的。页面载入完成时，会出现一个事件。用户点击一个按钮时，点击也是一个事件。</font></span><span style="font-size: 10.5pt; font-family: 'Times New Roman'; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-size: 10.5pt; font-family: 'Times New Roman'; mso-spacerun: 'yes'"><br />
</span><span style="font-size: 10.5pt; font-family: 'Times New Roman'; mso-spacerun: 'yes'">事件流也就是事件发生的顺序，包括</span><span style="font-weight: bold; font-size: 10.5pt; font-family: 'Times New Roman'; mso-spacerun: 'yes'">冒泡型事件</span><span style="font-size: 10.5pt; font-family: 'Times New Roman'; mso-spacerun: 'yes'">和</span><span style="font-weight: bold; font-size: 10.5pt; font-family: 'Times New Roman'; mso-spacerun: 'yes'">捕获型事件</span><span style="font-weight: bold; font-size: 10.5pt; font-family: 'Times New Roman'; mso-spacerun: 'yes'"><br />
</span><span style="font-weight: bold; font-size: 10.5pt; font-family: 'Times New Roman'; mso-spacerun: 'yes'">冒泡型事件</span><span style="font-weight: normal; font-size: 10.5pt; font-family: 'Times New Roman'; mso-spacerun: 'yes'">的基本思想是，事件从最特定的事件目标到最不特定的事件目标（<font face="Times New Roman">document&nbsp;</font><font face="宋体">对象）的顺序触发。事件按照</font><font face="Times New Roman">DOM</font><font face="宋体">层次结构像水泡一样不断上升至顶端。</font></span><span style="font-weight: normal; font-size: 10.5pt; font-family: 'Times New Roman'; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-weight: normal; font-size: 10.5pt; font-family: 'Times New Roman'; mso-spacerun: 'yes'">如果有这样的页面：</span><span style="font-weight: normal; font-size: 10.5pt; font-family: 'Times New Roman'; mso-spacerun: 'yes'"><br />
</span><span style="font-weight: normal; font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">&lt;html&gt;</span><span style="font-weight: normal; font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><br />
</span><span style="font-weight: normal; font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">&lt;head&gt;</span><span style="font-weight: normal; font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><br />
</span><span style="font-weight: normal; font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">&lt;title&gt;test&lt;/title&gt;</span><span style="font-weight: normal; font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-indent: 21pt"><span style="font-weight: normal; font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">&lt;/head&gt;</span><span style="font-weight: normal; font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><br />
</span><span style="font-weight: normal; font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">&lt;body&nbsp;onclick=&quot;fun()&quot;&gt;</span><span style="font-weight: normal; font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><br />
</span><span style="font-weight: normal; font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">&lt;div&nbsp;onclick=&quot;fun()&quot;&gt;click&lt;/div&gt;</span><span style="font-weight: normal; font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-indent: 21pt"><span style="font-weight: normal; font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">&lt;/body&gt;</span><span style="font-weight: normal; font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><br />
</span><span style="font-weight: normal; font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">&lt;/html&gt;</span><span style="font-weight: normal; font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-weight: normal; font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">不同的浏览器冒泡顺序如下：</span><span style="font-weight: normal; font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><br />
</span><span style="font-weight: normal; font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">IE5.5</span><span style="font-weight: normal; font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"> </span><span style="font-weight: normal; font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">&lt;div/&gt;&nbsp;<font face="宋体">&mdash;</font><font face="Times New Roman">&gt;</font></span><span style="font-weight: normal; font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"> </span><span style="font-weight: normal; font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">&lt;body/&gt;</span><span style="font-weight: normal; font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"> </span><span style="font-weight: normal; font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">&mdash;<font face="Times New Roman">&gt;</font></span><span style="font-weight: normal; font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"> </span><span style="font-weight: normal; font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">document</span><span style="font-weight: normal; font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><br />
</span><span style="font-weight: normal; font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">IE6.0</span><span style="font-weight: normal; font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"> </span><span style="font-weight: normal; font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">&lt;div/&gt;&nbsp;<font face="宋体">&mdash;</font><font face="Times New Roman">&gt;</font></span><span style="font-weight: normal; font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"> </span><span style="font-weight: normal; font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">&lt;body/&gt;</span><span style="font-weight: normal; font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"> </span><span style="font-weight: normal; font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">&mdash;<font face="Times New Roman">&gt;</font></span><span style="font-weight: normal; font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"> </span><span style="font-weight: normal; font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">&lt;html/&gt;</span><span style="font-weight: normal; font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"> </span><span style="font-weight: normal; font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">&mdash;<font face="Times New Roman">&gt;</font></span><span style="font-weight: normal; font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"> </span><span style="font-weight: normal; font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">document</span><span style="font-weight: normal; font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><br />
</span><span style="font-weight: normal; font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">&gt;=Mozilla&nbsp;1.0&nbsp;&lt;div/&gt;&nbsp;<font face="宋体">&mdash;</font><font face="Times New Roman">&gt;</font></span><span style="font-weight: normal; font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"> </span><span style="font-weight: normal; font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">&lt;body/&gt;</span><span style="font-weight: normal; font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"> </span><span style="font-weight: normal; font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">&mdash;<font face="Times New Roman">&gt;</font></span><span style="font-weight: normal; font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"> </span><span style="font-weight: normal; font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">&lt;html/&gt;</span><span style="font-weight: normal; font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"> </span><span style="font-weight: normal; font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">&mdash;<font face="Times New Roman">&gt;</font></span><span style="font-weight: normal; font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"> </span><span style="font-weight: normal; font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">document</span><span style="font-weight: normal; font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"> </span><span style="font-weight: normal; font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">&nbsp;&mdash;<font face="Times New Roman">&gt;&nbsp;window</font></span><span style="font-weight: normal; font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><br />
</span><span style="font-weight: normal; font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-weight: bold; font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">捕获型事件</span><span style="font-weight: normal; font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">的基本思想是，事件从最不精确的对象（<font face="Times New Roman">document&nbsp;</font><font face="宋体">对象）开始触发，然后到最精确。事件按照</font><font face="Times New Roman">DOM</font><font face="宋体">层次的顶端开始向下延伸。</font></span><span style="font-weight: normal; font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-weight: normal; font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-weight: bold; font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">DOM<font face="宋体">事件流</font></span><span style="font-weight: normal; font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="margin-top: 112px; z-index: 1; left: 0px; margin-left: -5px; width: 579px; position: absolute; height: 104px"><img height="104" src="file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/ksohtml/wps_clip_image-552.png" width="579" alt="" /></span><span style="margin-top: 175px; z-index: 1; left: 0px; margin-left: 402px; width: 41px; position: absolute; height: 17px"><img height="17" src="file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/ksohtml/wps_clip_image-553.png" width="41" alt="" /></span><span style="margin-top: 175px; z-index: 1; left: 0px; margin-left: 250px; width: 52px; position: absolute; height: 17px"><img height="17" src="file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/ksohtml/wps_clip_image-554.png" width="52" alt="" /></span><span style="margin-top: 175px; z-index: 1; left: 0px; margin-left: 87px; width: 56px; position: absolute; height: 17px"><img height="17" src="file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/ksohtml/wps_clip_image-555.png" width="56" alt="" /></span><span style="margin-top: 159px; z-index: 1; left: 0px; margin-left: 404px; width: 37px; position: absolute; height: 17px"><img height="17" src="file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/ksohtml/wps_clip_image-556.png" width="37" alt="" /></span><span style="margin-top: 157px; z-index: 1; left: 0px; margin-left: 254px; width: 47px; position: absolute; height: 17px"><img height="17" src="file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/ksohtml/wps_clip_image-557.png" width="47" alt="" /></span><span style="margin-top: 157px; z-index: 1; left: 0px; margin-left: 88px; width: 56px; position: absolute; height: 17px"><img height="17" src="file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/ksohtml/wps_clip_image-558.png" width="56" alt="" /></span><span style="margin-top: 141px; z-index: 1; left: 0px; margin-left: 444px; width: 88px; position: absolute; height: 53px"><img height="53" src="file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/ksohtml/wps_clip_image-559.png" width="88" alt="" /></span><span style="margin-top: 142px; z-index: 1; left: 0px; margin-left: 145px; width: 109px; position: absolute; height: 51px"><img height="51" src="file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/ksohtml/wps_clip_image-560.png" width="109" alt="" /></span><span style="margin-top: 142px; z-index: 1; left: 0px; margin-left: 3px; width: 87px; position: absolute; height: 52px"><img height="52" src="file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/ksohtml/wps_clip_image-561.png" width="87" alt="" /></span><span style="margin-top: 141px; z-index: 1; left: 0px; margin-left: 302px; width: 103px; position: absolute; height: 52px"><img height="52" src="file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/ksohtml/wps_clip_image-562.png" width="103" alt="" /></span><span style="font-weight: normal; font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">DOM<font face="宋体">同时支持两种事件模型：捕获型事件和冒泡型事件，但是捕获型事件先发生。两种事件流会触及</font><font face="Times New Roman">DOM</font><font face="宋体">中的所有对象，从</font><font face="Times New Roman">document</font><font face="宋体">对象开始，也在</font><font face="Times New Roman">document</font><font face="宋体">对象结束（大部分兼容标准的浏览器会延续到</font><font face="Times New Roman">window</font><font face="宋体">对象）</font></span><span style="font-weight: normal; font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><br />
</span><span style="font-weight: normal; font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">同样用上面的例子点击<font face="Times New Roman">div</font><font face="宋体">事件顺序如下：</font></span><span style="font-weight: normal; font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><br />
</span><span style="font-weight: normal; font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><br />
</span><span style="font-weight: normal; font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><br />
</span><span style="font-weight: normal; font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><br />
</span><span style="font-weight: normal; font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><br />
</span><span style="font-weight: normal; font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><br />
</span><span style="font-weight: normal; font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><br />
</span><span style="font-weight: normal; font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><br />
</span><span style="font-weight: normal; font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">DOM<font face="宋体">事件最独特的性质是，文本节点也触发事件（在</font><font face="Times New Roman">IE</font><font face="宋体">中不会）。</font></span><span style="font-weight: normal; font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><br />
</span><span style="font-weight: normal; font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><br />
</span><span style="font-weight: bold; font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">事件处理函数<font face="Times New Roman">/</font><font face="宋体">监听函数</font></span><span style="font-weight: bold; font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><br />
</span><span style="font-weight: normal; font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">用户响应某个事件而调用的函数成为事件处理函数（<font face="Times New Roman">event&nbsp;handler</font><font face="宋体">），或者</font><font face="Times New Roman">DOM</font><font face="宋体">称之为事件监听函数（</font><font face="Times New Roman">event&nbsp;listener</font><font face="宋体">）。</font></span><span style="font-weight: normal; font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><br />
</span><span style="font-weight: normal; font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">在<font face="Times New Roman">JavaScript</font><font face="宋体">中分配事件处理函数，如下：</font></span><span style="font-weight: normal; font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><br />
</span><span style="font-weight: normal; font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">var&nbsp;oDiv&nbsp;=&nbsp;document.getElementById(&quot;div&quot;);</span><span style="font-weight: normal; font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><br />
</span><span style="font-weight: normal; font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">oDiv.onclick&nbsp;=&nbsp;function(){</span><span style="font-weight: normal; font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-indent: 21pt"><span style="font-weight: normal; font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">alert(&quot;hello&quot;);</span><span style="font-weight: normal; font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-weight: normal; font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">}</span><span style="font-weight: normal; font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><br />
</span><span style="font-weight: normal; font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">在<font face="Times New Roman">HTML</font><font face="宋体">中分配事件处理函数如下：</font></span><span style="font-weight: normal; font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><br />
</span><span style="font-weight: normal; font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">&lt;div&nbsp;onclick=&quot;alert('hello')&quot;&gt;&lt;/div&gt;</span><span style="font-weight: normal; font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><br />
</span><span style="font-weight: normal; font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><br />
</span><span style="font-weight: bold; font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">IE<font face="宋体">的事件处理函数</font></span><span style="font-weight: normal; font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">：</span><span style="font-weight: normal; font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-indent: 21pt"><span style="font-weight: normal; font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">两个参数<font face="Times New Roman">----</font><font face="宋体">要分配的事件处理函数的名字、一个函数</font></span><span style="font-weight: normal; font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><br />
</span><span style="font-weight: normal; font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">oDiv.attachEvent(&quot;onclick&quot;,fun);</span><span style="font-weight: normal; font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-weight: normal; font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">oDiv.detachEvent(&quot;onclick&quot;,fun);</span><span style="font-weight: normal; font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><br />
</span><span style="font-weight: bold; font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">DOM<font face="宋体">的事件处理函数：</font></span><span style="font-weight: bold; font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-indent: 21pt"><span style="font-weight: normal; font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">三个参数<font face="Times New Roman">----</font><font face="宋体">事件名称、要分配的函数和处理函数是用于冒泡阶段</font><font face="Times New Roman">(false)</font><font face="宋体">还是捕获阶段</font><font face="Times New Roman">(true)</font></span><span style="font-weight: normal; font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><br />
</span><span style="font-weight: normal; font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">oDiv.addEventListener(&quot;click&quot;,&nbsp;fun,false);</span><span style="font-weight: normal; font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-weight: normal; font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">oDiv.removeEventListener(&quot;click&quot;,&nbsp;fun,false);</span><span style="font-weight: normal; font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><br />
</span><span style="font-weight: normal; font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">如果使用<font face="Times New Roman">addEventListener()</font><font face="宋体">将事件处理函数加入到捕获阶段，则必须在</font><font face="Times New Roman">removeEventListener()</font><font face="宋体">中指明是捕获阶段，才能正确地将这个事件处理函数删除。</font></span><span style="font-weight: normal; font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><br />
</span><span style="font-weight: normal; font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><br />
</span><span style="font-weight: bold; font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">事件对象</span><span style="font-weight: bold; font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><br />
</span><span style="font-weight: normal; font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">发生的事件的信息的事件对象，包含的信息：</span><span style="font-weight: normal; font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><br />
</span><span style="font-weight: normal; font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">1<font face="宋体">、引起事件的对象；</font></span><span style="font-weight: normal; font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><br />
</span><span style="font-weight: normal; font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">2<font face="宋体">、事件发生时鼠标的信息；</font></span><span style="font-weight: normal; font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-weight: normal; font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">3、</span><span style="font-weight: normal; font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">事件发生时键盘的信息；</span><span style="font-weight: normal; font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><br />
</span><span style="font-weight: normal; font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">事件对象只在发生事件时才被创建，且只有事件处理函数才能访问。所有事件处理函数执行完毕后，事件对象就被销毁。</span><span style="font-weight: normal; font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-align: justify"><span style="font-weight: bold; font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">定位</span><span style="font-weight: bold; font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><br />
</span><span style="font-weight: normal; font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">IE<font face="宋体">中，事件对象是</font><font face="Times New Roman">window</font><font face="宋体">对象的一个属性</font><font face="Times New Roman">event</font><font face="宋体">。</font></span><span style="font-weight: normal; font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><br />
</span><span style="font-weight: normal; font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">oDiv.onclick&nbsp;=function(){</span><span style="font-weight: normal; font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-indent: 21pt; text-align: justify"><span style="font-weight: normal; font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">var&nbsp;oEvent&nbsp;=&nbsp;window.event;</span><span style="font-weight: normal; font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-align: justify"><span style="font-weight: normal; font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">}</span><span style="font-weight: normal; font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><br />
</span><span style="font-weight: normal; font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">DOM<font face="宋体">标准说，</font><font face="Times New Roman">event</font><font face="宋体">对象必须作为唯一的参数传给事件处理函数。</font></span><span style="font-weight: normal; font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><br />
</span><span style="font-weight: normal; font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">oDiv.onclick&nbsp;=&nbsp;function(){</span><span style="font-weight: normal; font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-indent: 21pt; text-align: justify"><span style="font-weight: normal; font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">var&nbsp;oEvent&nbsp;=&nbsp;arguments[0];</span><span style="font-weight: normal; font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-align: justify"><span style="font-weight: normal; font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">}</span><span style="font-weight: normal; font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-align: justify"><span style="font-weight: normal; font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">或</span><span style="font-weight: normal; font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><br />
</span><span style="font-weight: normal; font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">oDiv.onclick&nbsp;=&nbsp;function(oEvent){</span><span style="font-weight: normal; font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-align: justify"><span style="font-weight: normal; font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">}</span><span style="font-weight: normal; font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><br />
</span><span style="font-weight: bold; font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">相似性</span><span style="font-weight: bold; font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><br />
</span><span style="font-weight: bold; font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">1<font face="宋体">、获取事件类型</font></span><span style="font-weight: bold; font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><br />
</span><span style="font-weight: normal; font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">oEvent.type</span><span style="font-weight: normal; font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><br />
</span><span style="font-weight: bold; font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">2<font face="宋体">、获取按键代码（</font><font face="Times New Roman">keydown/keyup</font><font face="宋体">事件）</font></span><span style="font-weight: bold; font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><br />
</span><span style="font-weight: normal; font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">oEvent.keyCode&nbsp;&nbsp;<font face="宋体">属性总包含代表按下按键的数值代码</font></span><span style="font-weight: normal; font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><br />
</span><span style="font-weight: bold; font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">3<font face="宋体">、检测</font><font face="Times New Roman">shift</font><font face="宋体">、</font><font face="Times New Roman">alt</font><font face="宋体">、</font><font face="Times New Roman">ctrl</font><font face="宋体">键</font></span><span style="font-weight: bold; font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><br />
</span><span style="font-weight: normal; font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">oEvent.shiftKey</span><span style="font-weight: normal; font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><br />
</span><span style="font-weight: normal; font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">oEvent.altKey</span><span style="font-weight: normal; font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-align: justify"><span style="font-weight: normal; font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">oEvent.ctrlKey</span><span style="font-weight: normal; font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-align: justify"><span style="font-weight: normal; font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">每个属性包含一个表示按键是否被按下的<font face="Times New Roman">Boolean</font><font face="宋体">值</font></span><span style="font-weight: normal; font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><br />
</span><span style="font-weight: bold; font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">4<font face="宋体">、获取客户端坐标</font></span><span style="font-weight: bold; font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><br />
</span><span style="font-weight: normal; font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">oEvent.clientX</span><span style="font-weight: normal; font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><br />
</span><span style="font-weight: normal; font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">oEvent.clientY</span><span style="font-weight: normal; font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><br />
</span><span style="font-weight: normal; font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">这些属性描述鼠标在该区域内的位置离边界有多远</span><span style="font-weight: normal; font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><br />
</span><span style="font-weight: bold; font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">5<font face="宋体">、获取屏幕坐标</font></span><span style="font-weight: bold; font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><br />
</span><span style="font-weight: normal; font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">oEvent.screenX</span><span style="font-weight: normal; font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><br />
</span><span style="font-weight: normal; font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">oEvent.screenY</span><span style="font-weight: normal; font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><br />
</span><span style="font-weight: normal; font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">这些属性返回表示离用户屏幕的边界有多远</span><span style="font-weight: normal; font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><br />
</span><span style="font-weight: normal; font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><br />
</span><span style="font-weight: bold; font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">区别</span><span style="font-weight: bold; font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><br />
</span><span style="font-weight: bold; font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">1<font face="宋体">、获取目标</font></span><span style="font-weight: bold; font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><br />
</span><span style="font-weight: normal; font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">IE</span><span style="font-weight: normal; font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"> </span><span style="font-weight: normal; font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">oEvent.srcElement</span><span style="font-weight: normal; font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-align: justify"><span style="font-weight: normal; font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">DOM</span><span style="font-weight: normal; font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"> </span><span style="font-weight: normal; font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">oEvent.target</span><span style="font-weight: normal; font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-align: justify"><span style="font-weight: bold; font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">2<font face="宋体">、获取字符代码</font></span><span style="font-weight: bold; font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><br />
</span><span style="font-weight: normal; font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">IE</span><span style="font-weight: bold; font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"> </span><span style="font-weight: normal; font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">oEvent.keyCode&nbsp;&nbsp;<font face="宋体">返回字符的代码等于他的</font><font face="Times New Roman">Unicode</font><font face="宋体">值</font></span><span style="font-weight: normal; font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><br />
</span><span style="font-weight: normal; font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">DOM</span><span style="font-weight: normal; font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"> </span><span style="font-weight: normal; font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">oEvent.charCode</span><span style="font-weight: normal; font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"> </span><span style="font-weight: normal; font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">返回字符的代码等于他的<font face="Times New Roman">Unicode</font><font face="宋体">值</font></span><span style="font-weight: normal; font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><br />
</span><span style="font-weight: normal; font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">String.formCharCode(oEvent.charCode)&nbsp;<font face="宋体">返回时机的字符</font></span><span style="font-weight: normal; font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><br />
</span><span style="font-weight: normal; font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">如果不确定按下的按键是否是字符，可以用<font face="Times New Roman">isChar</font><font face="宋体">属性来进行判断：</font></span><span style="font-weight: normal; font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><br />
</span><span style="font-weight: normal; font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">if(oEvent.isChar){</span><span style="font-weight: normal; font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><br />
</span><span style="font-weight: normal; font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">var&nbsp;iCharCode&nbsp;=&nbsp;oEvent.charCode;</span><span style="font-weight: normal; font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; margin-left: 21pt; text-indent: 21pt; text-align: justify"><span style="font-weight: normal; font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">}</span><span style="font-weight: normal; font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-align: justify"><span style="font-weight: bold; font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">3<font face="宋体">、阻止某个事件的默认行为</font></span><span style="font-weight: bold; font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><br />
</span><span style="font-weight: normal; font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">IE</span><span style="font-weight: normal; font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"> </span><span style="font-weight: normal; font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">oEvent.returnValue&nbsp;=&nbsp;false<font face="宋体">；</font></span><span style="font-weight: normal; font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><br />
</span><span style="font-weight: normal; font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">DOM</span><span style="font-weight: normal; font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"> </span><span style="font-weight: normal; font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">oEvent.preventDefault();</span><span style="font-weight: normal; font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><br />
</span><span style="font-weight: bold; font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">4<font face="宋体">、停止事件复制（冒泡）</font></span><span style="font-weight: bold; font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><br />
</span><span style="font-weight: normal; font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">IE</span><span style="font-weight: normal; font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"> </span><span style="font-weight: normal; font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">oEvent.cancelBubble&nbsp;=&nbsp;true</span><span style="font-weight: normal; font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><br />
</span><span style="font-weight: normal; font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">DOM</span><span style="font-weight: normal; font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"> </span><span style="font-weight: normal; font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">oEvent.stopPropagation()</span><span style="font-weight: normal; font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-align: justify"><span style="font-weight: bold; font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><br />
</span><span style="font-weight: bold; font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">事件的类型</span><span style="font-weight: bold; font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><br />
</span><span style="font-weight: normal; font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">DOM<font face="宋体">标准定义了以下几组事件：</font></span><span style="font-weight: normal; font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><br />
</span><span style="font-weight: normal; font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">+&nbsp;<font face="宋体">鼠标事件：用户使用鼠标进行特定操作时触发；</font></span><span style="font-weight: normal; font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-align: justify"><span style="font-weight: normal; font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">+&nbsp;<font face="宋体">键盘事件：用户在键盘上敲击、输入时触发；</font></span><span style="font-weight: normal; font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><br />
</span><span style="font-weight: normal; font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">+&nbsp;HTML<font face="宋体">事件：窗口发生变动或者发生特定的客户端</font><font face="Times New Roman">--</font><font face="宋体">服务器端交互时触发；</font></span><span style="font-weight: normal; font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><br />
</span><span style="font-weight: normal; font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">+&nbsp;<font face="宋体">突变事件：底层的</font><font face="Times New Roman">DOM</font><font face="宋体">结构发生改变时触发</font></span><span style="font-weight: normal; font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><br />
</span><span style="font-weight: bold; font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">鼠标事件</span><span style="font-weight: bold; font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><br />
</span><span style="font-weight: bold; font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">1<font face="宋体">、事件的属性</font></span><span style="font-weight: bold; font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><br />
</span><span style="font-weight: normal; font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">坐标属性</span><span style="font-weight: normal; font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><br />
</span><span style="font-weight: normal; font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">type<font face="宋体">属性</font></span><span style="font-weight: normal; font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><br />
</span><span style="font-weight: normal; font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">target<font face="宋体">或</font><font face="Times New Roman">srcElement</font><font face="宋体">属性</font></span><span style="font-weight: normal; font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><br />
</span><span style="font-weight: normal; font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">shiftKey<font face="宋体">、</font><font face="Times New Roman">ctrlKey</font><font face="宋体">、</font><font face="Times New Roman">altKey</font><font face="宋体">和</font><font face="Times New Roman">metaKey</font><font face="宋体">属性</font></span><span style="font-weight: normal; font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><br />
</span><span style="font-weight: normal; font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">button<font face="宋体">属性</font></span><span style="font-weight: normal; font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-align: justify"><span style="font-weight: bold; font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">2、</span><span style="font-weight: bold; font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">顺序</span><span style="font-weight: bold; font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-align: justify"><span style="font-weight: normal; font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">要触发<font face="Times New Roman">dblclick</font><font face="宋体">事件，在同一个目标上要按顺序发生以下事件：</font><font face="Times New Roman">mousedown</font><font face="宋体">、</font><font face="Times New Roman">mouseup</font><font face="宋体">、</font><font face="Times New Roman">click</font><font face="宋体">、</font><font face="Times New Roman">mousedown</font><font face="宋体">、</font><font face="Times New Roman">mouseup</font><font face="宋体">、</font><font face="Times New Roman">click</font><font face="宋体">、</font><font face="Times New Roman">dblclick</font></span><span style="font-weight: normal; font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><br />
</span><span style="font-weight: bold; font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">键盘事件</span><span style="font-weight: bold; font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><br />
</span><span style="font-weight: normal; font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">keydown</span><span style="font-weight: normal; font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><br />
</span><span style="font-weight: normal; font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">keypress</span><span style="font-weight: normal; font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><br />
</span><span style="font-weight: normal; font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">keyup</span><span style="font-weight: normal; font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><br />
</span><span style="font-weight: bold; font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">1<font face="宋体">、事件的属性</font></span><span style="font-weight: bold; font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><br />
</span><span style="font-weight: normal; font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">keyCode<font face="宋体">属性</font></span><span style="font-weight: normal; font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><br />
</span><span style="font-weight: normal; font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">charCode<font face="宋体">属性</font></span><span style="font-weight: normal; font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><br />
</span><span style="font-weight: normal; font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">target<font face="宋体">或者</font><font face="Times New Roman">srcElement</font><font face="宋体">属性</font></span><span style="font-weight: normal; font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><br />
</span><span style="font-weight: normal; font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">shiftKey<font face="宋体">、</font><font face="Times New Roman">ctrlKey</font><font face="宋体">、</font><font face="Times New Roman">altKey</font><font face="宋体">和</font><font face="Times New Roman">metaKey</font><font face="宋体">属性</font></span><span style="font-weight: bold; font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><br />
</span><span style="font-weight: bold; font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><br />
</span><span style="font-weight: bold; font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">2<font face="宋体">、顺序</font></span><span style="font-weight: bold; font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-align: justify"><span style="font-weight: normal; font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">用户按一次某字符按键时，会按以下顺序发生事件：</span><span style="font-weight: normal; font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-align: justify"><span style="font-weight: normal; font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">keydown</span><span style="font-weight: normal; font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><br />
</span><span style="font-weight: normal; font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">keypress</span><span style="font-weight: normal; font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-align: justify"><span style="font-weight: normal; font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">Keyup</span><span style="font-weight: normal; font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-align: justify"><span style="font-weight: normal; font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">如果用户按一次某非字符按键，会按以下属性发生事件</span><span style="font-weight: normal; font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-align: justify"><span style="font-weight: normal; font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">keydown</span><span style="font-weight: normal; font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><br />
</span><span style="font-weight: normal; font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">keyup</span><span style="font-weight: normal; font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt; text-align: justify"><span style="font-weight: normal; font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><br />
</span><span style="font-weight: bold; font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">HTML<font face="宋体">事件</font></span><span style="font-weight: bold; font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><br />
</span><span style="font-weight: normal; font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">load<font face="宋体">事件</font></span><span style="font-weight: normal; font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><br />
</span><span style="font-weight: normal; font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">unload<font face="宋体">事件</font></span><span style="font-weight: normal; font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><br />
</span><span style="font-weight: normal; font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">abort<font face="宋体">事件</font></span><span style="font-weight: normal; font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><br />
</span><span style="font-weight: normal; font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">error<font face="宋体">事件</font></span><span style="font-weight: normal; font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><br />
</span><span style="font-weight: normal; font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">select<font face="宋体">事件</font></span><span style="font-weight: normal; font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><br />
</span><span style="font-weight: normal; font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">change<font face="宋体">事件</font></span><span style="font-weight: normal; font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><br />
</span><span style="font-weight: normal; font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">submit<font face="宋体">事件</font></span><span style="font-weight: normal; font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><br />
</span><span style="font-weight: normal; font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">reset<font face="宋体">事件</font></span><span style="font-weight: normal; font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><br />
</span><span style="font-weight: normal; font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">resize<font face="宋体">事件</font></span><span style="font-weight: normal; font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><br />
</span><span style="font-weight: normal; font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">scroll<font face="宋体">事件</font></span><span style="font-weight: normal; font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><br />
</span><span style="font-weight: normal; font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">focus<font face="宋体">事件</font></span><span style="font-weight: normal; font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><br />
</span><span style="font-weight: normal; font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'">blur<font face="宋体">事件</font></span><span style="font-weight: normal; font-size: 10.5pt; font-family: '宋体'; mso-spacerun: 'yes'"><o:p></o:p></span></p>
</div>
<!--EndFragment-->]]></description>
			<link>http://www.footya.com//?action=show&amp;id=98</link>
			<category domain="http://www.footya.com//?cid=3">AJAX/Javascript</category>
			<pubDate>2009-12-30 23:48</pubDate>
		</item>
		<item>
			<guid>http://www.footya.com//?action=show&amp;id=95</guid>
			<title>call和apply的一个简单的例子</title>
			<author>footya</author>
			<description><![CDATA[<p>先看下手册上的解释:</p>
<h1><a name="jsmthcall"></a>call 方法</h1>
<p>调用一个对象的一个方法，以另一个对象替换当前对象。</p>
<p><code><strong>call(</strong>[<em>thisObj</em>[,<em>arg1</em>[<em>, arg2</em>[<em>,&nbsp;&nbsp; </em>[<em>,.argN</em>]]]]]<strong>)</strong></code></p>
<h4>参数</h4>
<p class="dt">thisObj</p>
<p class="indent">可选项。将被用作当前对象的对象。</p>
<p class="dt">arg1, arg2,&nbsp; , argN</p>
<p class="indent">可选项。将被传递方法参数序列。</p>
<h4>说明</h4>
<p><strong>call</strong> 方法可以用来代替另一个对象调用一个方法。<strong>call</strong> 方法可将一个函数的对象上下文从初始的上下文改变为由 <em>thisObj</em> 指定的新对象。</p>
<p>如果没有提供 <em>thisObj</em> 参数，那么 <strong>Global </strong>对象被用作 <em>thisObj</em>。</p>
<h1><a name="jsmthapply"></a>apply 方法</h1>
<p>应用某一对象的一个方法，用另一个对象替换当前对象。</p>
<p><code><strong>apply(</strong>[<em>thisObj</em>[,<em>argArray</em>]]<strong>)</strong></code></p>
<h4>参数</h4>
<p class="dt">thisObj</p>
<p class="indent">可选项。将被用作当前对象的对象。</p>
<p class="dt">argArray</p>
<p class="indent">可选项。将被传递给该函数的参数数组。</p>
<h4>说明</h4>
<p>如果 <em>argArray</em> 不是一个有效的数组或者不是 <strong>arguments</strong> 对象，那么将导致一个 TypeError。</p>
<p>如果没有提供 <em>argArray</em> 和 <em>thisObj</em> 任何一个参数，那么 <strong>Global </strong>对象将被用作 <em>thisObj，</em> 并且无法被传递任何参数。</p>
<p>从手册的解释来看，call和apply的作用是一样的：<strong>调用一个对象的一个方法，以另一个对象替换当前对象。<br />
不同之处：<br />
</strong>call 的参数为 将被传递方法参数序列。<br />
apply的参数为 将被传递给该函数的参数数组<br />
<br />
1、先来看一个没参数的<br />
<div class="codeText">
<div class="codeHead">JavaScript代码</div>
<ol start="1" class="dp-c">
    <li class="alt"><span><span class="keyword">function</span><span>&nbsp;a(){&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">this</span><span>.name&nbsp;=&nbsp;</span><span class="string">&quot;wo&quot;</span><span>;&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">this</span><span>.showName&nbsp;=&nbsp;</span><span class="keyword">function</span><span>(){&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;alert(<span class="keyword">this</span><span>.name);&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li>
    <li class=""><span>}&nbsp;&nbsp;</span></li>
    <li class="alt"><span><span class="comment">//&nbsp;a&nbsp;通过使用apply方法临时把自身的this替换为b，使得b拥有了a的属性和方法</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span><span class="keyword">function</span><span>&nbsp;b(){&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;a.apply(<span class="keyword">this</span><span>);</span><span class="comment">//call&nbsp;和&nbsp;apply起的作用是一样的</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">this</span><span>.name&nbsp;=&nbsp;</span><span class="string">&quot;ta&quot;</span><span>;</span><span class="comment">//</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>}&nbsp;&nbsp;</span></li>
    <li class=""><span><span class="keyword">var</span><span>&nbsp;bb&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;b();&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>bb.showName();<span class="comment">//&nbsp;out&nbsp;&quot;ta&quot;</span><span>&nbsp;&nbsp;</span></span></li>
</ol>
</div>
<br />
【未完待续】</p>]]></description>
			<link>http://www.footya.com//?action=show&amp;id=95</link>
			<category domain="http://www.footya.com//?cid=3">AJAX/Javascript</category>
			<pubDate>2009-10-20 11:11</pubDate>
		</item>
		<item>
			<guid>http://www.footya.com//?action=show&amp;id=93</guid>
			<title>判短form表单是否被修改的一个方法</title>
			<author>footya</author>
			<description><![CDATA[<p>最近在开发中有这样一个需求：<br />
如果在进行操作但未保存的情况下点击顶部其它页面链接，则弹出提示框，<br />
<a href="http://www.footya.com//attachment.php?id=63" target="_blank"><img src="http://www.footya.com//attachments//date_200909/c3c7fd1cb190090448f3e2946b2b99ca.gif" border="0" alt="大小: 6.06 K&#13;尺寸: 327 x 153&#13;浏览: 12 次&#13;点击打开新窗口浏览全图" width="327" height="153" /></a><br />
1、点击&ldquo;确定&rdquo;进入所有点页面并关闭本窗口；<br />
2、点击&ldquo;取消&rdquo;或&ldquo;x&rdquo;，取消本次跳转操作并关闭本窗口。<br />
不知道别人怎么做，我想出来的算法是：<br />
1、取到form内所有表单的值，<br />
2、把表单键值对转化为hash对象，<br />
3、把hash对像转化为数组，<br />
4、把数组拼接成字符串，<br />
5、然后比较两个字符串是否相等。</p>
<div class="codeText">
<div class="codeHead">JavaScript代码</div>
<ol class="dp-c">
    <li class="alt"><span><span class="comment">/** </span>&nbsp;</span></li>
    <li class=""><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;把表单内容转换为hash对象 </span>&nbsp;</span></li>
    <li class="alt"><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@public </span>&nbsp;</span></li>
    <li class=""><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@param&nbsp;{HTMLElement}&nbsp;form对象 </span>&nbsp;</span></li>
    <li class="alt"><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@return&nbsp;{oHash} </span>&nbsp;</span></li>
    <li class=""><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@author&nbsp;footya&nbsp;|&nbsp;yongsheng2@staff.sina.com.cn&nbsp;</span>&nbsp;</span></li>
    <li class="alt"><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@update&nbsp;2009-8-10&nbsp;</span>&nbsp;</span> 修改自alz框架</li>
    <li class=""><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@example </span>&nbsp;</span></li>
    <li class="alt"><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;formToHash(document.forms[0]); </span>&nbsp;</span></li>
    <li class=""><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">function</span><span>&nbsp;formToHash(form){ &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">var</span><span>&nbsp;oHash&nbsp;=&nbsp;{}; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">var</span><span>&nbsp;el; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">for</span><span>(</span><span class="keyword">var</span><span>&nbsp;i&nbsp;=&nbsp;0,len&nbsp;=&nbsp;form.elements.length;i&nbsp;&lt;&nbsp;len;i++){ &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;el&nbsp;=&nbsp;form.elements[i]; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>(el.name&nbsp;==&nbsp;</span><span class="string">&quot;&quot;</span><span>)&nbsp;</span><span class="keyword">continue</span><span>; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>(el.disabled)&nbsp;</span><span class="keyword">continue</span><span>; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">switch</span><span>(el.tagName.toLowerCase()){ &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">case</span><span>&nbsp;</span><span class="string">&quot;fieldset&quot;</span><span>: &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">break</span><span>; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">case</span><span>&nbsp;</span><span class="string">&quot;input&quot;</span><span>: &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">switch</span><span>(el.type){ &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">case</span><span>&nbsp;</span><span class="string">&quot;radio&quot;</span><span>: &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>(el.checked) &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;oHash[el.name]&nbsp;=&nbsp;el.value; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">break</span><span>; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">case</span><span>&nbsp;</span><span class="string">&quot;checkbox&quot;</span><span>: &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>(el.checked){ &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>(!oHash[el.name]) &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;oHash[el.name]&nbsp;=&nbsp;[el.value]; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">else</span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;oHash[el.name].push(el.value); &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">break</span><span>; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">case</span><span>&nbsp;</span><span class="string">&quot;button&quot;</span><span>: &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">break</span><span>; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">case</span><span>&nbsp;</span><span class="string">&quot;image&quot;</span><span>: &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">break</span><span>; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">default</span><span>: &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;oHash[el.name]&nbsp;=&nbsp;el.value; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">break</span><span>; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">break</span><span>; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">case</span><span>&nbsp;</span><span class="string">&quot;select&quot;</span><span>: &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>(el.multiple){ &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//alert(el.name); </span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">for</span><span>(</span><span class="keyword">var</span><span>&nbsp;j&nbsp;=&nbsp;0,&nbsp;lens&nbsp;=&nbsp;el.options.length;j&nbsp;&lt;&nbsp;lens;&nbsp;j++){ &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>(el.options[j].selected){ &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>(!oHash[el.name]) &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;oHash[el.name]&nbsp;=&nbsp;[el.options[j].value]; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">else</span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;oHash[el.name].push(el.options[j].value); &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span><span class="keyword">else</span><span>{ &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;oHash[el.name]&nbsp;=&nbsp;el.value; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">break</span><span>; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">default</span><span>: &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;oHash[el.name]&nbsp;=&nbsp;el.value; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">break</span><span>; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;el&nbsp;=&nbsp;</span><span class="keyword">null</span><span>; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>&nbsp;oHash; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li>
</ol>
</div>
<div class="codeText">
<div class="codeHead">JavaScript代码</div>
<ol class="dp-c">
    <li class="alt"><span><span class="comment">/** </span>&nbsp;</span></li>
    <li class=""><span><span class="comment">&nbsp;*&nbsp;把含有表单数据的hash对象转化为数组 </span>&nbsp;</span></li>
    <li class="alt"><span><span class="comment">&nbsp;*&nbsp;@public </span>&nbsp;</span></li>
    <li class=""><span><span class="comment">&nbsp;*&nbsp;@param&nbsp;{obj}&nbsp;hash对象 </span>&nbsp;</span></li>
    <li class="alt"><span><span class="comment">&nbsp;*&nbsp;@return&nbsp;{Array} </span>&nbsp;</span></li>
    <li class=""><span><span class="comment">&nbsp;*&nbsp;@author&nbsp;footya&nbsp;|&nbsp;yongsheng2@staff.sina.com.cn </span>&nbsp;</span></li>
    <li class="alt"><span><span class="comment">&nbsp;*&nbsp;@update&nbsp;2009-8-10&nbsp;</span>&nbsp;</span> 修改自alz框架</li>
    <li class=""><span><span class="comment">&nbsp;*&nbsp;@example </span>&nbsp;</span></li>
    <li class="alt"><span><span class="comment">&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;aData&nbsp;=&nbsp;formHashToArray(hash); </span>&nbsp;</span></li>
    <li class=""><span><span class="comment">&nbsp;*/</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span class="keyword">function</span><span>&nbsp;formHashToArray(hash){ &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">var</span><span>&nbsp;a&nbsp;=&nbsp;[]; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">for</span><span>(</span><span class="keyword">var</span><span>&nbsp;k&nbsp;</span><span class="keyword">in</span><span>&nbsp;hash){ &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>(</span><span class="keyword">typeof</span><span>(hash[k])&nbsp;==&nbsp;</span><span class="string">&quot;string&quot;</span><span>){ &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;a.push(k&nbsp;+&nbsp;</span><span class="string">&quot;=&quot;</span><span>&nbsp;+&nbsp;encodeURIComponent(hash[k])); &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">else</span><span>{ &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">for</span><span>(</span><span class="keyword">var</span><span>&nbsp;i&nbsp;=&nbsp;0,&nbsp;len&nbsp;=&nbsp;hash[k].length;&nbsp;i&nbsp;&lt;&nbsp;len;&nbsp;i++){ &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;a.push(&nbsp;k&nbsp;+&nbsp;</span><span class="string">&quot;=&quot;</span><span>&nbsp;+&nbsp;encodeURIComponent(hash[k][i])); &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>&nbsp;a; &nbsp;&nbsp;</span></li>
    <li class=""><span>}&nbsp;&nbsp;</span></li>
</ol>
</div>
<p><br />
调用这两个方法来实现字符串对比</p>
<div class="codeText">
<div class="codeHead">JavaScript代码</div>
<ol class="dp-c">
    <li class="alt"><span><span class="keyword">var</span><span>&nbsp;FormHashin&nbsp;=&nbsp;formToHash(FILTERFORM);</span><span class="comment">//记录表单的初始状态 </span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">/***change&nbsp;window***/</span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">function</span><span>&nbsp;outWrite(e){ &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">var</span><span>&nbsp;event&nbsp;=&nbsp;window.event||e; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;event.returnValue&nbsp;=&nbsp;</span><span class="string">&quot;您修改的设置尚未保存，确定要离开吗？&quot;</span><span>; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;window.onbeforeunload&nbsp;=&nbsp;</span><span class="keyword">function</span><span>(e){</span><span class="comment">//卸载页面时再获取一次表单状态 </span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">var</span><span>&nbsp;FormHashout&nbsp;=&nbsp;formToHash(FILTERFORM); &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>(!compareHash(FormHashin,&nbsp;FormHashout)){ &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">try</span><span>{outWrite(e)}</span><span class="keyword">catch</span><span>(exp){}; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;}; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//比较两个hash对象是否相等。 </span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">function</span><span>&nbsp;compareHash(hash1,hash2){ &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">var</span><span>&nbsp;h1&nbsp;=&nbsp;formHashToArray(hash1).join(</span><span class="string">&quot;-&quot;</span><span>); &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">var</span><span>&nbsp;h2&nbsp;=&nbsp;formHashToArray(hash2).join(</span><span class="string">&quot;-&quot;</span><span>); &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>(h1&nbsp;==&nbsp;h2){ &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>&nbsp;</span><span class="keyword">true</span><span>; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span><span class="keyword">else</span><span>{ &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>&nbsp;</span><span class="keyword">false</span><span>; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li>
</ol>
</div>]]></description>
			<link>http://www.footya.com//?action=show&amp;id=93</link>
			<category domain="http://www.footya.com//?cid=3">AJAX/Javascript</category>
			<pubDate>2009-09-24 14:01</pubDate>
		</item>
	</channel>
</rss>

