<?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>Hpyer 的未知空间 &#187; dblclick</title>
	<atom:link href="http://hpyer.cn/tag/dblclick/feed" rel="self" type="application/rss+xml" />
	<link>http://hpyer.cn</link>
	<description>现实的世界里寻找点滴的未知空间</description>
	<lastBuildDate>Wed, 01 Feb 2012 02:16:21 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Javascript 中 click 和 dblclick 事件冲突问题的解决办法</title>
		<link>http://hpyer.cn/solution-for-javascript-of-click-and-dblclick-event.html</link>
		<comments>http://hpyer.cn/solution-for-javascript-of-click-and-dblclick-event.html#comments</comments>
		<pubDate>Sat, 27 Sep 2008 14:21:34 +0000</pubDate>
		<dc:creator>Hpyer</dc:creator>
				<category><![CDATA[Web 技术]]></category>
		<category><![CDATA[click]]></category>
		<category><![CDATA[dblclick]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[事件]]></category>

		<guid isPermaLink="false">http://hpyer.cn/?p=234</guid>
		<description><![CDATA[　　一个DOM元素，如：div，既绑定了 click 事件，又绑定了 dblclick 事件，这两个事件分别要做独立的事情。事件处理上没有冲突，都可以各自完成各自的操作。双击的时候虽然是执行了 dblclick 事件，但是在这之前，也执行了 click 事件，那么，如何来禁止或者说屏蔽这次多余的 click 事件呢？本文将提供给您一个比较好的解决办法。]]></description>
			<content:encoded><![CDATA[<p>　　一个DOM元素，如：div，既绑定了 click 事件，又绑定了 dblclick 事件，这两个事件分别要做独立的事情。事件处理上没有冲突，都可以各自完成各自的操作。双击的时候虽然是执行了 dblclick 事件，但是在这之前，也执行了 click 事件，那么，如何来禁止或者说屏蔽这次多余的 click 事件呢？本文将提供给您一个比较好的解决办法。<span id="more-234"></span></p>
<p><strong>情况分析</strong>：<br />
　　首先，来了解一下点击事件发生的先后顺序：</p>
<ul>
<li>单击：mousedown, mouseup, click</li>
<li>双击：mousedown, mouseup, click, mousedown, mouseup, click, dblclick</li>
</ul>
<p>　　由此看来，dblclick 事件发生之前，实际上发生了两次 click 事件。其中，第一次的 click 是会被屏蔽掉，但是第二次则不会，所以就出现在双击的时候，也触发 click 事件。</p>
<p><strong>解决办法</strong>：<br />
　　知道了原因，接下来自然就是想办法把这次 click 给屏蔽掉，但是由于各浏览器均未提供直接去停止事件的方法，所以值得改变思路。<br />
　　由于我们只需要屏蔽一次 click 事件即可，由此联想到，可以利用 setTimeout() 方法来延时完成 click 事件的处理，在需要停止 click 的时候利用 clearTimeout() 方法停止这一事件的处理。这样，就可以比较容易的写出如下的 javascript 代码：</p>
<div class="hl-surround"><ol class="hl-main ln-show" title="Double click to hide line number." ondblclick = "linenumber(this)"><li class="hl-firstline"><span style="color: Green;">var</span><span style="color: Gray;"> </span><span style="color: Blue;">timer</span><span style="color: Gray;"> = </span><span style="color: Green;">null</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp;</span></li>
<li><span style="color: Green;">function</span><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">do_click</span><span style="color: Olive;">(</span><span style="color: Blue;">event</span><span style="color: Olive;">)</span><span style="color: Gray;"> </span><span style="color: Olive;">{</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Blue;">clearTimeout</span><span style="color: Olive;">(</span><span style="color: Blue;">timer</span><span style="color: Olive;">)</span><span style="color: Gray;">; </span><span style="color: #ffa500;">// 这里加一句是为了兼容 Gecko 的浏览器</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: #ffa500;">// if (event.detail == 2) return ; // 同上句的作用</span></li>
<li><span style="color: Gray;">&nbsp;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Blue;">timer</span><span style="color: Gray;"> = </span><span style="color: Blue;">setTimeout</span><span style="color: Olive;">(</span><span style="color: Green;">function</span><span style="color: Olive;">()</span><span style="color: Gray;">&nbsp;</span><span style="color: Olive;">{</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: #ffa500;">// click 事件的处理</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Olive;">}</span><span style="color: Gray;">, </span><span style="color: Maroon;">300</span><span style="color: Olive;">)</span><span style="color: Gray;">;</span></li>
<li><span style="color: Olive;">}</span></li>
<li><span style="color: Gray;">&nbsp;</span></li>
<li><span style="color: Green;">function</span><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">do_dblclick</span><span style="color: Olive;">(</span><span style="color: Blue;">event</span><span style="color: Olive;">)</span><span style="color: Gray;"> </span><span style="color: Olive;">{</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Blue;">clearTimeout</span><span style="color: Olive;">(</span><span style="color: Blue;">timer</span><span style="color: Olive;">)</span><span style="color: Gray;">;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: #ffa500;">// dblclick 事件的处理</span></li>
<li><span style="color: Olive;">}</span></li></ol></div>
<p><strong>测试代码</strong>：<br />
需要 jQuery 类库，你可以从 <a href="http://jquery.com/" target="_blank">jquery.com</a> 获取到最新版本</p>
<div class="hl-surround"><ol class="hl-main ln-show" title="Double click to hide line number." ondblclick = "linenumber(this)"><li class="hl-firstline"><span style="color: Olive;">&lt;</span><span style="color: Gray;">!</span><span style="color: #00008b;">DOCTYPE</span><span style="color: Gray;"> </span><span style="color: #00008b;">html</span><span style="color: Gray;"> </span><span style="color: #00008b;">PUBLIC</span><span style="color: Gray;"> </span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">-//W3C//DTD XHTML 1.0 Transitional//EN</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;"> </span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">&gt;</span></li>
<li><span style="color: Olive;">&lt;</span><span style="color: Green;">html</span><span style="color: Gray;">&nbsp;</span><span style="color: #00008b;">xmlns</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">http://www.w3.org/1999/xhtml</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">&gt;</span></li>
<li><span style="color: Olive;">&lt;</span><span style="color: Green;">head</span><span style="color: Olive;">&gt;</span></li>
<li><span style="color: Olive;">&lt;</span><span style="color: Green;">title</span><span style="color: Olive;">&gt;</span><span style="color: Gray;">Test</span><span style="color: Olive;">&lt;/</span><span style="color: Green;">title</span><span style="color: Olive;">&gt;</span></li>
<li><span style="color: Olive;">&lt;</span><span style="color: Green;">script</span><span style="color: Gray;">&nbsp;</span><span style="color: #00008b;">type</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">text/javascript</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;"> </span><span style="color: #00008b;">src</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">jquery.js</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">&gt;&lt;/</span><span style="color: Green;">script</span><span style="color: Olive;">&gt;</span></li>
<li><span style="color: Olive;">&lt;</span><span style="color: Green;">script</span><span style="color: Gray;">&nbsp;</span><span style="color: #00008b;">type</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">text/javascript</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">&gt;</span></li>
<li><span style="color: Gray;">var Test = {</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; times: 0,</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; timer: null,</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; logs: [],</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; first: null,</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; last: null,</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; do_click: function() {</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; var self = Test;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; self.start();</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; clearTimeout(self.timer);</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; self.times++;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; self.timer = setTimeout(function() {</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; self.logs.push('click');</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; self.echo();</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; }, 300);</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; },</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; do_dblclick: function() {</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; var self = Test;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; clearTimeout(self.timer);</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; self.logs.push('dblclick');</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; self.echo();</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; },</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; start: function() {</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; if (this.first == null) {</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; this.first = new Date().getTime();</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; }</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; },</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; end: function() {</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; if (this.last == null) {</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; this.last = new Date().getTime();</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; }</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; },</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; get_time: function() {</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; return (this.last - this.first) || 0;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; },</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; echo: function() {</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; var self = Test;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; self.end();</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; var log = 'No.' + self.times + '; Use time: ' + self.get_time() + 'ms; Event: ' + self.logs.join(', ') + ';</span><span style="color: Olive;">&lt;</span><span style="color: Green;">br</span><span style="color: Gray;">&nbsp;</span><span style="color: Olive;">/&gt;</span><span style="color: Gray;">\n';</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; $('#log').prepend(log);</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; self.first = null;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; self.last = null;</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; self.logs = [];</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; },</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; init: function() {</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; $(document).ready(function() {</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $('div').click(Test.do_click).dblclick(Test.do_dblclick);</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; });</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; }</span></li>
<li><span style="color: Gray;">};</span></li>
<li><span style="color: Gray;">Test.init();</span></li>
<li><span style="color: Olive;">&lt;/</span><span style="color: Green;">script</span><span style="color: Olive;">&gt;</span></li>
<li><span style="color: Olive;">&lt;/</span><span style="color: Green;">head</span><span style="color: Olive;">&gt;</span></li>
<li><span style="color: Olive;">&lt;</span><span style="color: Green;">body</span><span style="color: Olive;">&gt;</span></li>
<li><span style="color: Olive;">&lt;</span><span style="color: Green;">div</span><span style="color: Gray;">&nbsp;</span><span style="color: #00008b;">style</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">width:200px; height:50px; border:1px solid #999;</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">&gt;</span><span style="color: Gray;">Click / DblClick Me!</span><span style="color: Olive;">&lt;/</span><span style="color: Green;">div</span><span style="color: Olive;">&gt;</span></li>
<li><span style="color: Gray;">Log:</span><span style="color: Olive;">&lt;</span><span style="color: Green;">br</span><span style="color: Gray;">&nbsp;</span><span style="color: Olive;">/&gt;</span></li>
<li><span style="color: Olive;">&lt;</span><span style="color: Green;">textarea</span><span style="color: Gray;">&nbsp;</span><span style="color: #00008b;">id</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">log</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;"> </span><span style="color: #00008b;">rows</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">20</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;"> </span><span style="color: #00008b;">cols</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">50</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">&gt;&lt;/</span><span style="color: Green;">textarea</span><span style="color: Olive;">&gt;</span></li>
<li><span style="color: Olive;">&lt;/</span><span style="color: Green;">body</span><span style="color: Olive;">&gt;</span></li>
<li><span style="color: Olive;">&lt;/</span><span style="color: Green;">html</span><span style="color: Olive;">&gt;</span></li></ol></div>
<p><strong>问题总结</strong>：<br />
　　从测试结果来看，如果前后两次点击的时间在 300ms 左右的时候，还是很容易出现 click 和 dblclick 事件被“同时”调用的情况，而如果间隔的时间更短或更长，则只会有 click 或 dblclick 事件。<br />
　　所以，应该说这个方法已经在很大程度上，避免了 click 和 dblclick 事件的“同时”存在问题。当然，它还没有达到完全解决的程度。</p>
<p><strong>需要注意的地方</strong>：</p>
<ul>
<li>windows 的控制面板里是可以调鼠标的双击速度的（Linux 等系统下能不能调，俺就不清楚了），这点对于程序还是有一定影响，大家可以自己调节下试试看～</li>
<li>经过测试，延时 300ms 是一个比较理想的事件，既考虑到对鼠标操作并不十分顺利的朋友，也兼顾 click 事件的响应速度</li>
<li>以上代码，只在 IE6、FF3、Chrome 中测试过，并未出现问题</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://hpyer.cn/solution-for-javascript-of-click-and-dblclick-event.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

