js不完美解決click和dblclick事件沖突問題
更新時間:2012年07月16日 01:16:18 作者:
當某個元素,如:div,同時綁定了click事件和dblclick事件,而這兩個事件又要處理相對獨立的業(yè)務,也就是click的時候不能觸發(fā)dblclick,dblclick的時候不能觸發(fā)click
情況描述
當某個元素,如:div,同時綁定了click事件和dblclick事件,而這兩個事件又要處理相對獨立的業(yè)務,也就是click的時候不能觸發(fā)dblclick,dblclick的時候不能觸發(fā)click。在實際測試中發(fā)現(xiàn),當dblclick的時候,總會出現(xiàn)1次click。下文將要解決的就是這個問題。
情況分析
首先我們要清楚click和dblclick的執(zhí)行順序,測試過程略,下面是測試結(jié)果:
click:mousedown -- mouseup -- click
dblclick:mousedown -- mouseup -- click -- mousedown -- mouseup -- click -- dblclick
由此看來,在dblclick觸發(fā)之前,實際上是執(zhí)行了2次click,而第一次的click是會屏蔽掉的(為什么?好把,我也不知道)。
解決方案
最先想到的是否可以停止事件,但發(fā)現(xiàn)瀏覽器并未提供相應方法,如果自己去實現(xiàn)難度太大,因為單擊事件所關(guān)聯(lián)的行為必須做成是可以被cancel的才行。
于是考慮用延遲,也是我唯一能想到的解決辦法,利用setTimeout()來延遲完成click事件的處理,然后在需要屏蔽click的時候用clearTimeout()來停止。
具體代碼
var test = (function(){
var clickText = 'click<br>';
var dblclickText = 'dblclick<br>';
var timer = null;
return {
click: function(){
clearTimeout(timer);
timer = setTimeout(function(){
$('body').append(clickText);
}, 300);
},
dblclick: function(){
clearTimeout(timer);
$('body').append(dblclickText);
},
init: function(){
$(function(){
$('div').click(test.click).dblclick(test.dblclick);
});
}
}
})();
test.init();
html代碼
<div style="width:100px;height:100px;background:red;text-align:center;line-height:33px;-moz-user-select:none;-khtml-user-select:none;user-select:none">click<br>or<br>dblclick</div>
后續(xù)
文章標題里就說了,是不完美的,因為windows下,控制面板里是可以調(diào)鼠標的雙擊速度的(其他系統(tǒng)不清楚),所以我設(shè)置系統(tǒng)設(shè)置的雙擊速度較慢,則上面那個demo就不生效了。所以300毫秒只是一個大概的。
作者:胡尐睿
當某個元素,如:div,同時綁定了click事件和dblclick事件,而這兩個事件又要處理相對獨立的業(yè)務,也就是click的時候不能觸發(fā)dblclick,dblclick的時候不能觸發(fā)click。在實際測試中發(fā)現(xiàn),當dblclick的時候,總會出現(xiàn)1次click。下文將要解決的就是這個問題。
情況分析
首先我們要清楚click和dblclick的執(zhí)行順序,測試過程略,下面是測試結(jié)果:
click:mousedown -- mouseup -- click
dblclick:mousedown -- mouseup -- click -- mousedown -- mouseup -- click -- dblclick
由此看來,在dblclick觸發(fā)之前,實際上是執(zhí)行了2次click,而第一次的click是會屏蔽掉的(為什么?好把,我也不知道)。
解決方案
最先想到的是否可以停止事件,但發(fā)現(xiàn)瀏覽器并未提供相應方法,如果自己去實現(xiàn)難度太大,因為單擊事件所關(guān)聯(lián)的行為必須做成是可以被cancel的才行。
于是考慮用延遲,也是我唯一能想到的解決辦法,利用setTimeout()來延遲完成click事件的處理,然后在需要屏蔽click的時候用clearTimeout()來停止。
具體代碼
復制代碼 代碼如下:
var test = (function(){
var clickText = 'click<br>';
var dblclickText = 'dblclick<br>';
var timer = null;
return {
click: function(){
clearTimeout(timer);
timer = setTimeout(function(){
$('body').append(clickText);
}, 300);
},
dblclick: function(){
clearTimeout(timer);
$('body').append(dblclickText);
},
init: function(){
$(function(){
$('div').click(test.click).dblclick(test.dblclick);
});
}
}
})();
test.init();
html代碼
復制代碼 代碼如下:
<div style="width:100px;height:100px;background:red;text-align:center;line-height:33px;-moz-user-select:none;-khtml-user-select:none;user-select:none">click<br>or<br>dblclick</div>
后續(xù)
文章標題里就說了,是不完美的,因為windows下,控制面板里是可以調(diào)鼠標的雙擊速度的(其他系統(tǒng)不清楚),所以我設(shè)置系統(tǒng)設(shè)置的雙擊速度較慢,則上面那個demo就不生效了。所以300毫秒只是一個大概的。
作者:胡尐睿
相關(guān)文章
使用bootstrap實現(xiàn)下拉框搜索功能的實例講解
今天小編就為大家分享一篇使用bootstrap實現(xiàn)下拉框搜索功能的實例講解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-08-08將Datatable轉(zhuǎn)化成json發(fā)送前臺實現(xiàn)思路
將Datatable轉(zhuǎn)化成json可以將dt序列化成json,放到前臺的隱藏控件hidBoundary中,具體的實現(xiàn)如下,有類似需求的朋有可以參考下2013-09-09JavaScript數(shù)據(jù)可視化:ECharts制作地圖
這篇文章主要介紹了Echarts實現(xiàn)可視化地圖,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2021-08-08