1. onclick是綁定事件,click是方法
click本身是方法作用是觸發(fā)onclick事件,只要執(zhí)行了元素的click()方法,就會觸發(fā)onclick事件。如上訴代碼所示,當(dāng)點(diǎn)擊'ee'按鈕時,會觸發(fā)'dd'的onclick事件(正常來說得按'dd'按鈕才觸發(fā)'dd'的onclick事件),原因就是因?yàn)辄c(diǎn)擊'ee'按鈕時,代碼內(nèi)部調(diào)用了'dd'的click()方法,從而觸發(fā)了'dd'的onclick事件。
$("#btn1").click(function(){
$("#btn2").click();
});
2. click與tap
click為了能區(qū)分單擊與雙擊在每次點(diǎn)擊之后加了300ms的延遲,但是這種延遲會造成反應(yīng)遲鈍的感覺。為了解決這一問題,可以使用zepto的tap事件,singleTap和doubleTap 分別代表單次點(diǎn)擊和雙次點(diǎn)擊。在使用zepto框架的tap來移動設(shè)備瀏覽器內(nèi)的點(diǎn)擊事件,來規(guī)避click事件的延遲響應(yīng)時,有可能出現(xiàn)點(diǎn)透的情況,即點(diǎn)擊會觸發(fā)非當(dāng)前層的點(diǎn)擊事件。
github上有一個叫做fastclick的庫,它也能規(guī)避移動設(shè)備上click事件的延遲響應(yīng),fastclick
將它用script標(biāo)簽引入頁面(該庫支持AMD,于是你也可以按照AMD規(guī)范,用諸如require.js的模塊加載器引入),并且在dom ready時初始化在body上。實(shí)踐開發(fā)中發(fā)現(xiàn),當(dāng)元素綁定fastclick后,click響應(yīng)速度比tap還要快一點(diǎn)點(diǎn)。
3. touch事件
touch事件touch是針對觸屏手機(jī)上的觸摸事件?,F(xiàn)今大多數(shù)觸屏手機(jī)webkit內(nèi)核提供了touch事件的監(jiān)聽,讓開發(fā)者可以獲取用戶觸摸屏幕時的一些信息。其中包括:touchstart,touchmove,touchend,touchcancel 這四個事件,touchstart,touchmove,touchend事件可以類比于mousedown,mouseover
,mouseup的觸發(fā)。
- touchstart : 當(dāng)手指觸摸到屏幕會觸發(fā);
- touchmove : 當(dāng)手指在屏幕上移動時,會觸發(fā);
- touchend : 當(dāng)手指離開屏幕時,會觸發(fā);
- touchcancel:許多人不知道它在什么時候會被觸發(fā)而忽略它,其實(shí)當(dāng)你的手指還沒有離開屏幕時,有系統(tǒng)級的操作發(fā)生時就會觸發(fā)touchcancel,例如alert和confirm彈框,又或者是android系統(tǒng)的功能彈窗。
在一個移動端設(shè)備,手指點(diǎn)擊一個元素,會經(jīng)過:touchstart --> touchmove -> touchend --》click 幾個過程。
4. 點(diǎn)透問題
$('.div1').addEventListener('touchstart', function(e) {
$('.div1).style.display = 'none';
})
$('.div2).onclick = function() {
console.log('click事件')
}
其中div1覆蓋在 div2 之上, 按理說點(diǎn)擊 div1 的時候,div1 會阻擋所有的事件,事件不會傳遞給 div1,當(dāng)點(diǎn)擊 div1 的時候,實(shí)際上 div2 也發(fā)生了點(diǎn)擊事件,即上面的輸出結(jié)果為 div1 消失, 輸出 ‘click事件’ 莫名被點(diǎn)擊了, 這就是點(diǎn)透。
這是因?yàn)椋寒?dāng)手指觸摸到屏幕的時候,系統(tǒng)生成兩個事件,一個是touch 一個是click,touch先執(zhí)行,touch執(zhí)行完成后,A從文檔樹上面消失了,而且由于移動端click還有延遲200-300ms的關(guān)系,當(dāng)系統(tǒng)要觸發(fā)click的時候,發(fā)現(xiàn)在用戶點(diǎn)擊的位置上面,目前離用戶最近的元素是B,所以就直接把click事件作用在B元素上面了。
那么怎么去解決這個問題呢?其實(shí)系統(tǒng)提供了先觸發(fā)的touch事件去取消系統(tǒng)生成的click事件,所以只要在touch事件的某個處理函數(shù)中 執(zhí)行 e.preverDefault即可, 一般我們在touchend中執(zhí)行:
$('.div1').addEventListener('touchstart', function(e) {
$('.div1).style.display = 'none';
e.preventDefault();
})
其他解決方案:1. 使用系統(tǒng)的click事件; 2. 黨touch事件發(fā)生后持續(xù)大于300ms的事件再讓遮罩層消失。