成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

關于移動web開發過程中的”點透“問題

開發 前端
A是遮罩層,B是正常的DOM,C是B上的某個元素,這里是鏈接。場景是點擊A的時候A消失,結果點到了C,頁面發生了跳轉,這顯然不是咱想要的~

先說說故事發生的場景,舉個栗子如下圖:

A是遮罩層,B是正常的DOM,C是B上的某個元素,這里是鏈接。場景是點擊A的時候A消失,結果點到了C,頁面發生了跳轉,這顯然不是咱想要的~

下面我們來監測點擊事件:

  1. var div1 = document.getElementById("div1"); 
  2. var div2 = document.getElementById('div2'); 
  3. var con = document.getElementById('console'); 
  4. function handle(e){ 
  5.     var tar = e.target, eve = e.type; 
  6.    var ele = document.createElement("p"); 
  7.    ele.innerHTML = "target:"+ tar.id + " event:" + eve ; 
  8.    con.appendChild(ele); 
  9.    if(tar.id === "div1"){  
  10.        div1.style.display = "none"
  11.    } 
  12. div1.addEventListener("touchend",handle); 
  13. div1.addEventListener("touchstart",handle); 

只要你不點擊C處,一切都很平靜,貌似沒有問題,事件順序是這樣的:

  1. target:div1 event:touchstart 
  2. target:div2 event:touchend 

但是如果你在C處點擊A,你會發現頁面跳轉了,為了更清楚的看到這個過程,我們為B綁定click事件,即如果B觸發了click事件,那么說明,在A上的點擊最終點到了B上。在上面javascript清單上添加一行代碼如下:

  1. div2.addEventListener('click',handle); 

點擊B區域,可以看到頁面下方的log記錄控制臺內出現如下內容:

  1. target:div1 event:touchstarttarget:div1 event:touchendtarget:div2 event:click 

可見,在div1的事件觸發完畢后,div2也就是B區域神奇的捕獲到了click事件,而事實上我們只點擊了div1。這就是”點透“了,隔山打牛!

點透現象出現的場景:

剛才舉例說明了什么是點透,其實點透的出現場景可以總結如下:

  1. A/B兩個層上下z軸重疊。

  2. 上層的A點擊后消失或移開。(這一點很重要)

  3. B元素本身有默認click事件(如a標簽) 或 B綁定了click事件。

在以上情況下,點擊A/B重疊的部分,就會出現點透的現象。

為什么會出現”點透“現象

在移動端不使用click而用touch事件代替觸摸是因為click事件有著明顯的延遲,具體touchstart與click的區別如下:

  1. touchstart:在這個DOM(或冒泡到這個DOM)上手指觸摸開始即能立即觸發

  2. click:在這個DOM(或冒泡到這個DOM)上手指觸摸開始,且手指未曾在屏幕上移動(某些<a href=”http://www.it165.net/edu/ewl/” target=”_blank” class=”keylink”>瀏覽器</a>允許移動一個非常小的位移值),且在這個在這個dom上手指離開屏幕,且觸摸和離開屏 幕之間的間隔時間較短(某些瀏覽器不檢測間隔時間,也會觸發click)才能觸發

也就是說,事件的觸發時間按由早到晚排列為:touchstart 早于 touchend 早于 click。亦即click的觸發是有延遲的,這個時間大概在300ms左右。

由于我們在touchstart階段就已經隱藏了罩層A,當click被觸發時候,能夠被點擊的元素則是其下的B元素,由于B綁定了click事件(或者B本身默認存在click事件),所以B的click事件被觸發,產生了點透的情況。

解決方案

對于B元素本身沒有默認click事件的情況(無a標簽等),應統一使用touch事件,統一代碼風格,并且由于click事件在移動端的延遲要大很多,不利于用戶體驗,所以關于觸摸事件應盡量使用touch相關事件。

對于B元素本身存在默認click事件的情況,應及時取消A元素的默認點擊事件,從而阻止click事件的產生。即應在上例的handle函數中添加代碼如下:

  1. e.preventDefault();
責任編輯:王雪燕 來源: 博客園
相關推薦

2010-03-04 09:54:24

Android開發

2009-06-17 14:33:08

java項目開發

2011-04-14 15:35:53

嵌入式系統嵌入式

2009-06-17 16:10:37

Java網站優勢

2011-07-06 16:00:28

ASP

2015-09-25 10:02:52

BlocksDelegates開發

2009-11-23 20:39:21

ibmdw敏捷開發

2011-01-26 09:40:42

.NET開發

2009-06-10 15:36:25

ubuntu netb開發過程

2010-04-06 17:26:26

Windows Pho

2010-08-10 15:09:55

Flex開發

2016-12-30 11:10:32

Hadoop開發JVM

2015-07-09 10:36:40

iOS

2011-01-04 10:05:45

敏捷開發

2010-07-15 14:47:05

Perl開發

2020-10-23 10:31:59

開發開源工具開源

2012-06-25 10:13:00

Java.NET

2012-11-13 11:27:16

詳細設計

2022-07-31 19:59:42

文檔管理工具互聯網

2015-07-15 12:29:34

技術周刊
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 色久电影 | 激情欧美日韩一区二区 | 日韩视频一区二区 | 精品视频在线观看 | 成人国内精品久久久久一区 | 激情五月综合网 | 一区二区三区视频免费看 | 婷婷久久五月天 | 久久激情网 | 国产精品视频网址 | 日韩成人免费av | 国产亚洲欧美日韩精品一区二区三区 | 九九热这里只有精品在线观看 | 噜噜噜噜狠狠狠7777视频 | 国产精品久久久久免费 | 国产乱人伦精品一区二区 | 免费一级片 | 奇米影视首页 | 欧美日韩手机在线观看 | 99re在线 | 99久久中文字幕三级久久日本 | 免费观看一级视频 | 久久精品久久久久久 | 一二区成人影院电影网 | 成人网址在线观看 | 国产91 在线播放 | 中文字幕精品一区二区三区精品 | 日韩精品一区二区在线观看 | 亚洲成人一区 | 亚洲成人精品久久 | 一级黄色av电影 | 久久久久久高潮国产精品视 | 伊人网综合在线观看 | 中文字幕日本一区二区 | 日韩视频免费 | 国产精品一区二区福利视频 | 久久精品二区 | sese视频在线观看 | 亚洲国产高清高潮精品美女 | ww 255hh 在线观看 | 精品视频一区二区三区在线观看 |