iScroll中事件點(diǎn)擊觸發(fā)兩次解決方案
之前也看了很多朋友的文章里有講這個(gè)問(wèn)題。比如使用一個(gè)變量記錄執(zhí)行的間隔時(shí)間什么的。感覺(jué)每次都要去擼一下,比較累人。本人喜歡搬磚前先選工具。其實(shí)解決這個(gè)方法很簡(jiǎn)單。iScroll呢其實(shí)是截獲了點(diǎn)擊瀏覽器時(shí)的touchstart和touchend事件。在touchend的時(shí)候使用js去觸發(fā)元素的onclick事件(_end這個(gè)函數(shù))。而在實(shí)際操作中,先執(zhí)行了touchend,然后再執(zhí)行了一次onclick的相關(guān)函數(shù)。這樣就形成了頭疼的一次點(diǎn)擊兩次觸發(fā)。這本來(lái)就一個(gè)不是問(wèn)題的問(wèn)題。之所以說(shuō)這是個(gè)問(wèn)題,是因?yàn)檫@樣是我們不得不去看一看iScroll的源代碼。解決這個(gè)問(wèn)題的途徑就是拒絕第二次執(zhí)行函數(shù)。而我的邏輯也正是如此。我們可以在執(zhí)行完_end函數(shù)中的觸發(fā)click事件的代碼后,移除onclick事件上綁定的函數(shù)。然后在定時(shí)幾百毫秒之后在重新把這個(gè)事件添加上去。舉個(gè)例子:
//處理之前
<span onclick="test()">雙擊測(cè)試</span>
//處理之后
<span onclick="void(0)">雙擊測(cè)試</span>
在移除onclick相關(guān)函數(shù)之后這個(gè)第二次就自然不會(huì)再觸發(fā)test函數(shù)了。為了下一次還能繼續(xù)使用我們可以使用setTimeout的方式把onclick的內(nèi)容還原回去。
改造后的iscroll源代碼(約550行~570行的樣子,_end函數(shù)中):
that.doubleTapTimer = setTimeout(function () {
that.doubleTapTimer = null;
// Find the last touched element
target = point.target;
while (target.nodeType != 1) target = target.parentNode;
if (target.tagName != 'SELECT' && target.tagName != 'INPUT' && target.tagName != 'TEXTAREA') {
ev = doc.createEvent('MouseEvents');
ev.initMouseEvent('click', true, true, e.view, 1,
point.screenX, point.screenY, point.clientX, point.clientY,
e.ctrlKey, e.altKey, e.shiftKey, e.metaKey,
0, null);
ev._fake = true;
target.dispatchEvent(ev);
/**以下代碼為新增代碼**/
//找到綁定click事件的元素。
var obj = $(target).attr("onclick") != null ? $(target) : $(target).parents("[onclick]")[0];
if (obj != null) {
var clickContent = $(obj).attr("onclick");
if (clickContent != "void(0)") {
//利用新的屬性來(lái)存儲(chǔ)原有的click函數(shù)
$(obj).attr("data-clickbak", $(obj).attr("onclick"));
//改變onclick屬性值。
$(obj).attr("onclick", "void(0)");
//防止暴力點(diǎn)擊
if (that.hashBox.length>0) {
for (var _i = 0; _i < that.hashBox.length; _i++)
{
if (that.hashBox[_i] == $(obj)) {
that.hashBox.splice(_i, 1);
break;
}
}
}
that.hashBox.push($(obj));
that._clickBack();
}
}//end
}
}, that.options.zoom ? 250 : 0);
_clickBack函數(shù)及hashBox代碼片段(加在_end函數(shù)之前)
hashBox: [],
/*還原被點(diǎn)擊對(duì)象的事件*/
_clickBack: function () {
var that = this;
setTimeout(function () {
if (that.hashBox.length > 0) {
var obj = that.hashBox.pop();
obj.attr("onclick", obj.attr("data-clickbak"));
if (that.hashBox.length > 0) that._clickBack();
}
}, 500);
}
當(dāng)然,也可以不修改 iscroll源代碼,通過(guò)一個(gè)公共函數(shù)來(lái)實(shí)現(xiàn)。
以上就是本文所講述的全部?jī)?nèi)容了,希望對(duì)大家學(xué)習(xí)使用iscroll滑動(dòng)控件有所幫助
- JQuery插件iScroll實(shí)現(xiàn)下拉刷新,滾動(dòng)翻頁(yè)特效
- IScroll5 中文API參數(shù)說(shuō)明和調(diào)用方法
- iscroll.js的上拉下拉刷新時(shí)無(wú)法回彈的解決方法
- 學(xué)習(xí)使用jquery iScroll.js移動(dòng)端滾動(dòng)條插件
- 基于HTML5上使用iScroll實(shí)現(xiàn)下拉刷新,上拉加載更多
- iScroll.js 使用方法參考
- jQuery iScroll.js 移動(dòng)端滾動(dòng)條美化插件
- 基于iscroll.js實(shí)現(xiàn)下拉刷新和上拉加載效果
- iscroll碰到Select無(wú)法選擇下拉刷新的解決辦法
- 利用iscroll4實(shí)現(xiàn)輪播圖效果實(shí)例代碼
相關(guān)文章
JS實(shí)現(xiàn)點(diǎn)擊發(fā)送驗(yàn)證碼 xx秒后重新發(fā)送功能
在一些注冊(cè)類的網(wǎng)站,經(jīng)常遇到這樣的需求,點(diǎn)擊發(fā)送驗(yàn)證碼,xx秒后重新發(fā)送,這樣的功能怎么實(shí)現(xiàn)呢,接下來(lái)通過(guò)本文給大家分享js點(diǎn)擊發(fā)送驗(yàn)證碼 xx秒后重新發(fā)送功能,需要的朋友參考下吧2019-07-07
深入探討如何利用Canvas實(shí)現(xiàn)圖片壓縮與Base64轉(zhuǎn)換
隨著Web應(yīng)用的日益普及,圖片的處理和優(yōu)化已經(jīng)成為現(xiàn)代開(kāi)發(fā)的關(guān)鍵部分,本文主要介紹了如何利用Canvas技術(shù),將圖片進(jìn)行壓縮,并將其轉(zhuǎn)換為Base64格式,感興趣的小伙伴可以學(xué)習(xí)下2023-10-10
zepto.js 實(shí)時(shí)監(jiān)聽(tīng)輸入框的方法
今天小編就為大家分享一篇zepto.js 實(shí)時(shí)監(jiān)聽(tīng)輸入框的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-12-12
javascript的回調(diào)函數(shù)應(yīng)用示例
回調(diào)函數(shù)就是一個(gè)通過(guò)函數(shù)指針調(diào)用的函數(shù)。下面以示例的方式為大家介紹下其具體的使用2014-02-02
仿谷歌主頁(yè)js動(dòng)畫效果實(shí)現(xiàn)代碼
昨天看到谷歌的主頁(yè)上出現(xiàn)了幾個(gè)動(dòng)畫,發(fā)現(xiàn)不是flash做的,而是用js+圖片實(shí)現(xiàn)的!今天把拷貝到的圖片,用js實(shí)現(xiàn)了動(dòng)畫效果!2013-07-07
JavaScript對(duì)象封裝的簡(jiǎn)單實(shí)現(xiàn)方法(3種方法)
這篇文章主要介紹了JavaScript對(duì)象封裝的簡(jiǎn)單實(shí)現(xiàn)方法,結(jié)合實(shí)例形式分析了3種簡(jiǎn)單實(shí)現(xiàn)方法與相關(guān)注意事項(xiàng),需要的朋友可以參考下2017-01-01
uni-app?中清除定時(shí)器實(shí)現(xiàn)方法詳解
這篇文章主要為大家介紹了uni-app?中清除定時(shí)器實(shí)現(xiàn)方法詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-07-07
詳解如何使用JSZip實(shí)現(xiàn)在瀏覽器中操作文件與文件夾
這篇文章主要介紹了如何使用JSZip實(shí)現(xiàn)在瀏覽器中操作文件與文件夾,文中的示例代碼講解詳細(xì),具有一定的借鑒價(jià)值,有需要的小伙伴可以參考一下2024-04-04

