亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > JavaScript > 正文

js原生實現FastClick事件的實例

2019-11-19 18:55:02
字體:
來源:轉載
供稿:網友

注明:本人學習javascript時間不長,最近一直在做web端的手機網頁和微信應用,由于最近有用到類似fastclick的功能,在原來的程序中用touchstart和touchend事件模擬,現在嘗試將其封裝,得到了以下兩種有問題的方案。分享給大家,另求大神指導

在手機端Web app開發中,click事件的300ms的延遲,會造成響應緩慢,尤其在低端機中尤為明顯。而使用touchstart或者touchend事件,會和默認的滾輪事件發生沖突,這也不是我們所期望的。

所以,自己動手,豐衣足食,寫了一個快速點擊事件的原生js代碼(考慮到web app開發的環境,我們暫時無需考慮對IE等瀏覽器的兼容)。

實現方法1如下:

function FastClickEvent(handler){  var fastclick = {    handler : handler,    bind : function(query){      var targetList = document.querySelectorAll(query);      for(var i=0,len=targetList.length;i<len;i++)      {        targetList[i].addEventListener('touchstart',handleEvent);        targetList[i].addEventListener('touchend',handleEvent);      }    },    unbind : function(query){      var targetList = document.querySelectorAll(query);      for(var i=0,len=targetList.length;i<len;i++)      {        targetList[i].removeEventListener('touchstart',handleEvent);        targetList[i].removeEventListener('touchend',handleEvent);      }    }    }  var touchX = 0 ,touchY = 0;  function handleEvent(event){    switch(event.type)    {      case 'touchstart':        touchX = event.touches[0].clientX;        touchY = event.touches[0].clientY;        break;      case 'touchend':        var x = event.changedTouches[0].clientX;        var y = event.changedTouches[0].clientY;        if(Math.abs(touchX-x)<5||Math.abs(touchY-y)<5)          fastclick.handler(event);        break;    }  };  return fastclick;};

原理:根據連續touchstart和touchend事件發生時位置的變化,來判斷是否是一次點擊

調用:用一個handler函數來注冊一個FastClickEvent事件。然后將注冊好的FastClickEvent事件,通過bind方法,綁定到對應的元素上去。如下:

var handler = function(event){  console.log(event.target.id+" fastclicked");}var fastClick = new FastClickEvent(handler);fastClick.bind("div");

這段代碼,我們給所有的div元素注冊了fastclick的handler事件。調用fastClick.unbind來解除元素的綁定。

但是這段代碼有一個問題,為了讓handleEvent事件能夠訪問到touchX,touchY。我采用了閉包的手法,這意味著每次new一個FastClickEvent事件對象,都要在內存中再次注入重復的handleEvent函數。至于重復的touchX,touchY,更是不必多說了。

新手求助:原本是想把handleEvent函數寫到原型里,但是產生的一個問題是handleEvent(event)的this對象是windows,也就是說,我取不到touchX和touchY以及handler對象,造成訪問錯誤。

有一種比較簡單的解決思路,就是只注冊一個fastClickEvent事件,然后在處理程序中根據event.target的實際值(即發生事件的對象上)來決定響應的內容。

但是,這意味著你必須對所有的fastclick事件都非常熟悉。

用這種方法帶來的好處在于,由于你只有一個handleEvent函數,所以基本來說,在頁面釋放之前,除非是你不想再觸發fastclick事件,否則無需去解綁任何元素的fastclick事件(即使你解綁了,內存中仍然存在該handler函數)。而且,你可以很方便的用bind(query)來添加任何動態生成的元素的fastclick事件,只要你在handler函數中已經寫好相應的處理程序。

如果你想添加多個fastclick事件,而且可能要在多個地方注冊,那么也只要new一個新的FastClickEvent對象,然后綁定到對應的元素中去就可以了。

下面,介紹一種使用EventTarget類的方法。首先看一下EventTarget

function EventTarget(){  this.handlers = {};}EventTarget.prototype = {  constructor: EventTarget,  addHandler : function(type,handler){    if(typeof this.handlers[type] == "undefined"){      this.handlers[type]=[];    }    this.handlers[type].push(handler);  },  fire : function(event){    if(!event.target){      event.target = this;    }    if(this.handlers[event.type] instanceof Array){      var handlers = this.handlers[event.type];      for(var i=0,len=handlers.length;i<len;i++){        handlers[i](event);      }    }  },  removeHandler : function(type,handler){    if(this.handlers[type] instanceof Array){      var handlers = this.handlers[type];      for(var i=0,len=handler.length;i<len;i++){        if(handlers[i]==handler){          break;        }      }      handlers.splice(i,1);    }  }}

這個類,是一個用來添加、移除以及實現自定義類的接口。參考《JavaScript高級程序設計第三版》P616-617

那么,如何把這個類,變成我們的fastclick事件接口呢?

定義一個全局變量,用這個變量來完成所有的fastclick事件注冊、刪除以及添加

var FastClick = function(){  var fastclick = new EventTarget(),     touchX = 0 ,    touchY = 0;  function handleEvent(event){    switch(event.type)    {      case 'touchstart':        touchX = event.touches[0].clientX;        touchY = event.touches[0].clientY;        break;      case 'touchend':        var x = event.changedTouches[0].clientX;        var y = event.changedTouches[0].clientY;        if(Math.abs(touchX-x)<5||Math.abs(touchY-y)<5)          fastclick.fire({type:'fastclick',target:event.target});        break;    }  };  fastclick.bind = function(query)  {    var targetList = document.querySelectorAll(query);    for(var i=0,len=targetList.length;i<len;i++)    {      targetList[i].addEventListener('touchstart',handleEvent);      targetList[i].addEventListener('touchend',handleEvent);    }  }  Fastclick.unbind = function(query){    var targetList = document.querySelectorAll(query);    for(var i=0,len=targetList.length;i<len;i++)    {      targetList[i].removeEventListener('touchstart',handleEvent);      targetList[i].removeEventListener('touchend',handleEvent);    }  }  return fastclick;}();

這個全局變量FastClick可以用來添加任意的fastclick事件。

下面來講講如何調用。

添加事件函數:

FastClick.addHandler('fastclick',function(event){});

刪除事件函數://匿名事件無法刪除

FastClick.removeHandler('fastclick',handler);

綁定元素

FastClick.bind("div");

解綁

FastClick.unbind("div");

這個方法,同樣需要我們在handler事件中對event.target做預判,因為雖然這種方法可以添加多個fastclick事件,但是,事件在執行的過程中是按順序一個一個執行的,也就是說,可能會執行你并不想執行的函數。

帶來的好處在于,可以注冊多個fastclick事件,而且無需再次綁定,就可以執行了。
比如說,

FastClick.bind("div");FastClick.addHandler(handler1);FastClick.addHandler(handler2);

那么,當快速點擊事件發生在任一div元素時,就會順序執行handler1和handler2。

如果我們調用removeHandler來刪除handler1或handler2,那么相應的函數就不會再執行了。

另外,需要注意的是,在handler函數中,this對象是FastClick.handlers['fastclick']這個數組,一般情況下,我們用event.target來獲取發生事件的對象。

用這種方法,基本克服了上面方法的問題,而且,對這個對象重復new并沒有多大的意義,除非你不想對event.target做預判,從而生成一大堆的FaskClick類,但這顯然是不高效的。

新手求助:如何能夠實現特定的元素的綁定執行的函數,也就是: 能夠調用FastClick.bind(query,handler);實現對符合query條件的元素添加handler的fastclick事件。

以上就是小編為大家帶來的js原生實現FastClick事件的實例全部內容了,希望大家多多支持武林網~

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲美女av在线播放| 欧美巨乳美女视频| 欧美高清理论片| 国内精品中文字幕| 久热爱精品视频线路一| 国产精品偷伦一区二区| 欧美极品在线播放| 久热精品在线视频| 国外成人在线播放| 97av在线视频免费播放| 国产精品欧美日韩久久| 26uuu日韩精品一区二区| 亚洲自拍偷拍第一页| 一区二区在线视频播放| 91九色国产社区在线观看| 茄子视频成人在线| 亚洲精品在线看| 欧美xxxx18国产| 国产日韩换脸av一区在线观看| 亚洲欧美日韩爽爽影院| 亚洲毛片一区二区| 国产精品老牛影院在线观看| 国产精品成人国产乱一区| 国产精品一区二区av影院萌芽| 欧美www视频在线观看| 亚洲一区亚洲二区亚洲三区| 亚洲天堂av女优| 亚洲精品视频二区| 久久夜色精品国产| 亚洲色图狂野欧美| 国产精品久久久久久中文字| 日韩风俗一区 二区| 91亚洲人电影| 精品久久久久久久久久| 久热精品视频在线观看一区| 亚洲无限av看| 亚洲午夜精品久久久久久久久久久久| 国产精品视频公开费视频| 丝袜美腿精品国产二区| 国内精品久久久久久久久| 欧美乱大交做爰xxxⅹ性3| 国产做受69高潮| 久久精品视频网站| 欧美肥臀大乳一区二区免费视频| 亚洲国产精品中文| 国内精品400部情侣激情| 色综合久久久久久中文网| 国产日韩欧美视频在线| 精品国产91久久久| 日韩中文字幕国产精品| 91在线无精精品一区二区| 国产激情久久久| 国产精品扒开腿做爽爽爽的视频| 亚洲欧洲在线视频| 日韩中文字幕在线观看| 欧美视频中文在线看| 欧美午夜宅男影院在线观看| 欧美丝袜一区二区| 亚洲区中文字幕| 一色桃子一区二区| 国产日本欧美视频| 亚洲91av视频| 国产精品aaa| 97视频国产在线| 久久久久久久久久久免费精品| 欧美精品情趣视频| 日韩在线精品视频| 久久精品电影网站| 欧美性极品xxxx娇小| 国产精品久久二区| 日韩电影免费观看在线| 色狠狠久久aa北条麻妃| 久久精品99久久香蕉国产色戒| 久久精品国产亚洲| 蜜月aⅴ免费一区二区三区| 91成人免费观看网站| 日韩电影大全免费观看2023年上| 国产999在线观看| 亚洲精品97久久| 欧美另类交人妖| 91视频国产精品| 国产精品h在线观看| 2019国产精品自在线拍国产不卡| 5566成人精品视频免费| 日韩欧美中文在线| y97精品国产97久久久久久| 成人女保姆的销魂服务| 久久久中文字幕| 国产日韩欧美在线视频观看| 亚洲bt欧美bt日本bt| 国产精品大片wwwwww| 2020欧美日韩在线视频| 欧美一区二区三区四区在线| 欧美激情精品久久久久久变态| 国产精品日本精品| 亚洲国产精品中文| 亚洲有声小说3d| 久久久999精品| 国产精品入口夜色视频大尺度| 国产精品久久久久久超碰| 久久久精品美女| 欧美激情精品久久久久| 国产精品免费一区豆花| 国产精品永久免费| 国产精品视频yy9099| 国产精品精品视频一区二区三区| 日韩精品亚洲元码| 91香蕉亚洲精品| 亚洲欧美中文日韩v在线观看| 国产精品欧美一区二区三区奶水| 日韩欧美大尺度| 中文字幕在线亚洲| 国产欧亚日韩视频| 国模私拍视频一区| 久久亚洲精品国产亚洲老地址| 中文字幕国内精品| 中文字幕欧美日韩| 亚洲精品色婷婷福利天堂| 亚洲永久免费观看| 国产精品三级美女白浆呻吟| 日韩av在线精品| 成人免费福利视频| 日韩在线一区二区三区免费视频| 久久久中精品2020中文| 668精品在线视频| 一区二区三区 在线观看视| 亚洲欧美中文字幕| 国产精品99久久久久久人| 国产一区二区色| 精品日本高清在线播放| 国产成人精品a视频一区www| 久久av中文字幕| 法国裸体一区二区| 最新国产精品亚洲| 欧美大片在线看| 亚洲美女福利视频网站| 久久久成人av| 国产精品a久久久久久| 亚洲国产成人久久| 欧美综合第一页| 国产欧美日韩中文字幕在线| 国产精品入口免费视| 成人欧美在线视频| 久久深夜福利免费观看| 亚洲精品福利资源站| 精品视频偷偷看在线观看| 久久综合久中文字幕青草| 亚洲高清一二三区| 欧美日韩国产精品一区二区不卡中文| 欧美视频在线看| 在线观看中文字幕亚洲| 中文字幕在线国产精品| 韩国日本不卡在线| 亚洲第一免费播放区| 九九热这里只有精品免费看| 88xx成人精品| 6080yy精品一区二区三区| 精品国产精品自拍| 久久99久久99精品中文字幕| 精品露脸国产偷人在视频| 中文字幕久久亚洲| 黑人狂躁日本妞一区二区三区| 成人免费自拍视频| 91久久精品国产91久久性色|