js原生實作FastClick事件的實例
註明:自己學習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事件,透過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('fastclickHandler('fastclick);
綁定元素FastClick.bind("div");解綁FastClick.unbind("div");用這個方法,同樣需要我們在handtarler事件中對event. ,因為雖然這個方法可以加入多個fastclick事件,但是,事件在執行的過程中是按順序一個一個執行的,也就是說,可能會執行你並不想執行的函數。 帶來的好處在於,可以註冊多個fastclick事件,而且無需再次綁定,就可以執行了。比如說,
FastClick.bind("div"); FastClick.addHandler(handler1); FastClick.addHandler(handler2);

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

熱門話題

如何使用JS和百度地圖實現地圖平移功能百度地圖是一款廣泛使用的地圖服務平台,在Web開發中經常用於展示地理資訊、定位等功能。本文將介紹如何使用JS和百度地圖API實作地圖平移功能,並提供具體的程式碼範例。一、準備工作使用百度地圖API前,首先需要在百度地圖開放平台(http://lbsyun.baidu.com/)上申請一個開發者帳號,並建立一個應用程式。創建完成

人臉偵測辨識技術已經是一個比較成熟且應用廣泛的技術。而目前最廣泛的網路應用語言非JS莫屬,在Web前端實現人臉偵測辨識相比後端的人臉辨識有優勢也有弱勢。優點包括減少網路互動、即時識別,大大縮短了使用者等待時間,提高了使用者體驗;弱勢是:受到模型大小限制,其中準確率也有限。如何在web端使用js實現人臉偵測呢?為了實現Web端人臉識別,需要熟悉相關的程式語言和技術,如JavaScript、HTML、CSS、WebRTC等。同時也需要掌握相關的電腦視覺和人工智慧技術。值得注意的是,由於Web端的計

股票分析必備工具:學習PHP和JS繪製蠟燭圖的步驟,需要具體程式碼範例隨著網路和科技的快速發展,股票交易已成為許多投資者的重要途徑之一。而股票分析是投資人決策的重要一環,其中蠟燭圖被廣泛應用於技術分析。學習如何使用PHP和JS繪製蠟燭圖將為投資者提供更多直觀的信息,幫助他們更好地做出決策。蠟燭圖是一種以蠟燭形狀來展示股票價格的技術圖表。它展示了股票價格的

如何使用PHP和JS創建股票蠟燭圖股票蠟燭圖是股票市場中常見的技術分析圖形,透過繪製股票的開盤價、收盤價、最高價和最低價等數據,幫助投資者更直觀地了解股票的價格波動情形。本文將教你如何使用PHP和JS創建股票蠟燭圖,並附上具體的程式碼範例。一、準備工作在開始之前,我們需要準備以下環境:1.一台運行PHP的伺服器2.一個支援HTML5和Canvas的瀏覽器3

如何使用JS和百度地圖實現地圖熱力圖功能簡介:隨著互聯網和行動裝置的快速發展,地圖成為了普遍的應用場景。而熱力圖作為一種視覺化的展示方式,能夠幫助我們更直觀地了解數據的分佈。本文將介紹如何使用JS和百度地圖API來實現地圖熱力圖的功能,並提供具體的程式碼範例。準備工作:在開始之前,你需要準備以下事項:一個百度開發者帳號,並建立一個應用,取得到對應的AP

如何使用JS和百度地圖實現地圖點擊事件處理功能概述:在網路開發中,經常需要使用地圖功能來展示地理位置和地理資訊。而地圖上的點擊事件處理是地圖功能中常用且重要的一環。本文將介紹如何使用JS和百度地圖API來實現地圖的點擊事件處理功能,並給出具體的程式碼範例。步驟:匯入百度地圖的API檔案首先,要在HTML檔案中匯入百度地圖API的文件,可以透過以下程式碼實現:

隨著網路金融的快速發展,股票投資已經成為了越來越多人的選擇。而在股票交易中,蠟燭圖是常用的技術分析方法,它能夠顯示股票價格的變動趨勢,幫助投資人做出更精準的決策。本文將透過介紹PHP和JS的開發技巧,帶領讀者了解如何繪製股票蠟燭圖,並提供具體的程式碼範例。一、了解股票蠟燭圖在介紹如何繪製股票蠟燭圖之前,我們首先需要先了解什麼是蠟燭圖。蠟燭圖是由日本人

如何使用JS和百度地圖實現地圖多邊形繪製功能在現代網頁開發中,地圖應用程式已成為常見的功能之一。而地圖上繪製多邊形,可以幫助我們將特定區域標記,方便使用者進行檢視和分析。本文將介紹如何使用JS和百度地圖API實現地圖多邊形繪製功能,並提供具體的程式碼範例。首先,我們需要引入百度地圖API。可以利用以下程式碼在HTML檔案中導入百度地圖API的JavaScript
