不同設(shè)備的click

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的事件再讓遮罩層消失。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 這兩天自己在寫一個手機(jī)網(wǎng)頁,用到了觸屏滑動的特效,就是往右滑動的時候左側(cè)隱藏的菜單從左邊劃出來。做完之后在手機(jī)原生...
    yzc123446閱讀 4,511評論 0 3
  • 以前聽到前輩們說移動端盡量不要使用click,click會比較遲鈍,能用touchstart還是用touchsta...
    極樂君閱讀 817評論 0 2
  • 本節(jié)介紹各種常見的瀏覽器事件。 鼠標(biāo)事件 鼠標(biāo)事件指與鼠標(biāo)相關(guān)的事件,主要有以下一些。 click 事件,dblc...
    許先生__閱讀 2,840評論 0 4
  • 這是我目前不愿提及的一樁事,緣由不在父母,不在對象,而在于我,對自我的認(rèn)定。 一如既往地沒關(guān)懷我太多,就是簡簡單單...
    靜水流深091700閱讀 217評論 0 0
  • 人的世界從最簡單到復(fù)雜,最終又會回歸簡單。極簡主義是很多趟過歲月流金河的前輩在對岸回望時,給來者最衷心的告誡。然而...
    寄人間語閱讀 321評論 0 0

友情鏈接更多精彩內(nèi)容