<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>CSSrainbow.cn &#187; Event Delegation</title>
	<atom:link href="http://cssrainbow.cn/tag/event-delegation/feed" rel="self" type="application/rss+xml" />
	<link>http://cssrainbow.cn</link>
	<description>Sharing what I know and learn about (X)HTML,CSS,JavaScript,MooTools,Dojo,jQuery,PHP,ASP,Java,Python and ∞.</description>
	<lastBuildDate>Sun, 05 Sep 2010 15:08:02 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>如何在事件代理中正确使用 focus 和 blur 事件</title>
		<link>http://cssrainbow.cn/code-snippets/javascript-code-snippets/1058.html</link>
		<comments>http://cssrainbow.cn/code-snippets/javascript-code-snippets/1058.html#comments</comments>
		<pubDate>Sun, 31 Jan 2010 04:20:20 +0000</pubDate>
		<dc:creator>Rainbow</dc:creator>
				<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Event Delegation]]></category>

		<guid isPermaLink="false">http://cssrainbow.cn/?p=1058</guid>
		<description><![CDATA[让focus 和 blur 都支持冒泡事件的解决方案]]></description>
			<content:encoded><![CDATA[<p class="node">
<strong>让focus 和 blur 都支持冒泡事件的解决方案来自：</strong></p>
<p class="note">怿飞的《<a href="http://www.planabc.net/2010/01/30/how_to_use_focus_and_blur_event_in_event_delegation/">如何在事件代理中正确使用 focus 和 blur 事件</a>》文章。 </p>
<h2>什么是事件代理（Event Delegation）？</h2>
<blockquote>
<p><strong>如果不太了解的朋友，可详细阅读以下文章：</strong></p>
<ul>
<li><a href="http://www.nczonline.net/blog/2009/06/30/event-delegation-in-javascript/" target="_blank" title="Event delegation in JavaScript">Event delegation in JavaScript</a></li>
<li><a href="http://www.cnblogs.com/rubylouvre/archive/2009/08/09/1542174.html">JavaScript的事件代理</a></li>
<li>  <a href="http://developer.51cto.com/art/200901/107183.htm">如何使用JavaScript的事件代理</a></li>
<p><span id="more-1058"></span></p>
</ul>
</blockquote>
<h2>首先让我们一起来回顾一些常识：</h2>
<ol>
<li>通常支持事件冒泡（Event Bubbling）的事件类型为鼠标事件和键盘事件，例如：<strong>mouseover, mouseout, click, keydown, keypress</strong>。</li>
<li>接口事件则通常不支持事件冒泡（Event Bubbling），例如：<strong>load, change, submit, focus, blur</strong>。</li>
</ol>
<p>很明显：focus 和 blur 都属于不支持冒泡的接口事件。既然都不支持冒泡，那又如何实现事件代理呢？</p>
<p>可以换个角度，逆向思维，尝试事件捕获（Event Capturing，除了IE，现在流行的标准浏览器均支持）。</p>
<p>测试后会发现，如果你捕获 focus 或 blur 事件，目标元素的祖先元素均执行事件函数。至于为什么？或许是实现的一个 BUG。</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
</pre></td><td class="code"><pre class="javascript" style="font-family:monospace;">el.<span style="color: #660066;">addEventListener</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'focus'</span><span style="color: #339933;">,</span> focusHandler<span style="color: #339933;">,</span> <span style="color: #003366; font-weight: bold;">true</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
el.<span style="color: #660066;">addEventListener</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'blur'</span><span style="color: #339933;">,</span> blurHandler<span style="color: #339933;">,</span> <span style="color: #003366; font-weight: bold;">true</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

<h3>那对于 IE ，我们如何实现呢？</h3>
<p>非常幸运，IE 下支持 focusin 和 focusout 事件，非常类似于 focus 和 blur 事件，唯一不同的是，这两种事件支持事件冒泡（Event Bubbling）。</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
</pre></td><td class="code"><pre class="javascript" style="font-family:monospace;">el.<span style="color: #660066;">onfocusin</span> <span style="color: #339933;">=</span> focusHandler<span style="color: #339933;">;</span>
el.<span style="color: #660066;">onfocusout</span> <span style="color: #339933;">=</span> blurHandler<span style="color: #339933;">;</span></pre></td></tr></table></div>

<h3>很完美的解决方案：</h3>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
</pre></td><td class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>document.<span style="color: #660066;">addEventListener</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    el.<span style="color: #660066;">addEventListener</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'focus'</span><span style="color: #339933;">,</span> focusHandler<span style="color: #339933;">,</span> <span style="color: #003366; font-weight: bold;">true</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    el.<span style="color: #660066;">addEventListener</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'blur'</span><span style="color: #339933;">,</span> blurHandler<span style="color: #339933;">,</span> <span style="color: #003366; font-weight: bold;">true</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span> <span style="color: #000066; font-weight: bold;">else</span> <span style="color: #009900;">&#123;</span>
    el.<span style="color: #660066;">onfocusin</span> <span style="color: #339933;">=</span> focusHandler<span style="color: #339933;">;</span>
    el.<span style="color: #660066;">onfocusout</span> <span style="color: #339933;">=</span> blurHandler<span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p>&nbsp;</p>
<h3>知识扩展：</h3>
<blockquote>
<p><strong>主流类库的事件代理</strong>：</p>
<ul>
<li>  <a href="http://davidwalsh.name/mootools-event-delegation">Event Delegation with MooTools</a></li>
<li>
<a href="http://www.danwebb.net/2008/2/8/event-delegation-made-easy-in-jquery">Event delegation with jQuery</a>
</li>
<li>
<a href="http://devthatweb.com/view/basic-event-delegation-in-prototype">Event delegation with Prototype</a>
</li>
<li>
<a href="http://icant.co.uk/sandbox/eventdelegation/">Event delegation with YUI</a>
</li>
</ul>
</blockquote>
<p>&nbsp;</p>
<h3  class="related_post_title">相关日志 »</h3><ul class="related_post"><li>2010/08/29 -- <a href="http://cssrainbow.cn/tutorials/javascript/1368.html" title="怎么写Tab?基于JavaScript实现的">怎么写Tab?基于JavaScript实现的</a> (0)</li><li>2010/07/27 -- <a href="http://cssrainbow.cn/tutorials/javascript/1354.html" title="本地图片预览二三事">本地图片预览二三事</a> (1)</li><li>2010/03/30 -- <a href="http://cssrainbow.cn/tutorials/jquery/1225.html" title="关于‘TOP’置顶链接的那些事儿">关于‘TOP’置顶链接的那些事儿</a> (0)</li><li>2010/03/22 -- <a href="http://cssrainbow.cn/code-snippets/javascript-code-snippets/1187.html" title="简单的斑马纹表格">简单的斑马纹表格</a> (2)</li><li>2010/01/26 -- <a href="http://cssrainbow.cn/tutorials/javascript/1027.html" title="理解JavaScript中的事件处理">理解JavaScript中的事件处理</a> (3)</li><li>2009/10/29 -- <a href="http://cssrainbow.cn/tutorials/jquery/790.html" title="Lightbox Clones &#8211; 基于主流JavaScript库的Lightbox项目大集合">Lightbox Clones &#8211; 基于主流JavaScript库的Lightbox项目大集合</a> (0)</li><li>2009/09/10 -- <a href="http://cssrainbow.cn/tutorials/jquery/706.html" title="窥探jQuery — 面向JavaScript程序员(收藏)">窥探jQuery — 面向JavaScript程序员(收藏)</a> (1)</li><li>2009/09/08 -- <a href="http://cssrainbow.cn/tutorials/javascript/703.html" title="有滑动效果的导航条，基于JavaScript">有滑动效果的导航条，基于JavaScript</a> (0)</li><li>2009/09/04 -- <a href="http://cssrainbow.cn/tutorials/javascript/693.html" title="FireBug 控制台指令">FireBug 控制台指令</a> (0)</li><li>2009/08/31 -- <a href="http://cssrainbow.cn/articles/resources/671.html" title="Opera的Web标准课程（推荐）">Opera的Web标准课程（推荐）</a> (1)</li></ul>]]></content:encoded>
			<wfw:commentRss>http://cssrainbow.cn/code-snippets/javascript-code-snippets/1058.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
