国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > JavaScript > 正文

iScroll中事件點擊觸發兩次解決方案

2019-11-20 12:59:20
字體:
來源:轉載
供稿:網友

  之前也看了很多朋友的文章里有講這個問題。比如使用一個變量記錄執行的間隔時間什么的。感覺每次都要去擼一下,比較累人。本人喜歡搬磚前先選工具。其實解決這個方法很簡單。iScroll呢其實是截獲了點擊瀏覽器時的touchstart和touchend事件。在touchend的時候使用js去觸發元素的onclick事件(_end這個函數)。而在實際操作中,先執行了touchend,然后再執行了一次onclick的相關函數。這樣就形成了頭疼的一次點擊兩次觸發。這本來就一個不是問題的問題。之所以說這是個問題,是因為這樣是我們不得不去看一看iScroll的源代碼。解決這個問題的途徑就是拒絕第二次執行函數。而我的邏輯也正是如此。我們可以在執行完_end函數中的觸發click事件的代碼后,移除onclick事件上綁定的函數。然后在定時幾百毫秒之后在重新把這個事件添加上去。舉個例子:

復制代碼 代碼如下:

//處理之前
<span onclick="test()">雙擊測試</span>
//處理之后
<span onclick="void(0)">雙擊測試</span>

在移除onclick相關函數之后這個第二次就自然不會再觸發test函數了。為了下一次還能繼續使用我們可以使用setTimeout的方式把onclick的內容還原回去。

改造后的iscroll源代碼(約550行~570行的樣子,_end函數中):

復制代碼 代碼如下:

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)") {
                                        //利用新的屬性來存儲原有的click函數
                                        $(obj).attr("data-clickbak", $(obj).attr("onclick"));
                                        //改變onclick屬性值。
                                        $(obj).attr("onclick", "void(0)");
                                        //防止暴力點擊
                                        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函數及hashBox代碼片段(加在_end函數之前)

復制代碼 代碼如下:

       hashBox: [],
       /*還原被點擊對象的事件*/
        _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);
        }

當然,也可以不修改 iscroll源代碼,通過一個公共函數來實現。

以上就是本文所講述的全部內容了,希望對大家學習使用iscroll滑動控件有所幫助

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 香格里拉县| 东海县| 宜城市| 建瓯市| 榕江县| 龙岩市| 京山县| 延津县| 苏州市| 通辽市| 德江县| 焉耆| 土默特左旗| 酒泉市| 轮台县| 广汉市| 内黄县| 衡水市| 加查县| 嘉祥县| 大邑县| 清原| 三门峡市| 海城市| 建瓯市| 芜湖市| 文山县| 类乌齐县| 金华市| 阜南县| 静安区| 佛学| 阿瓦提县| 新宁县| 阳曲县| 双峰县| 河南省| 遵义县| 盐源县| 常山县| 图们市|