移動端上下滑動事件之--坑爹的touch.js

移動端頁面的盛行,微信的便利的頁面推廣等等,讓越來越多的css3效果和html5在手機端大放異彩。

於是乎,各式各樣的簡約酷炫的html5頁面層出不窮,最多的就是視差滾動+css3動畫。

接下來就說說自己在搞這些頁面裏面碰到的一個小問題-------zepto.js裏面,坑爹的touch.js的上下滑動(swipe)事件失效。


在舉例之前,先科普一下如何在pc端,查看html5頁面在各種分辨率的手機的展示情況。

最常見的就是利用谷歌的手機模擬器。


步驟1:打開谷歌瀏覽器,按F12.

步驟2:然後按截圖裏面的步驟,選擇各種分辨率,在刷新一下頁面,就可以看到效果。


注:各種手機的選擇



開始描述問題之前,先提供幾個網址,

讓你們試試能不能看到效果。




能在谷歌模擬器看到不同分辨率的效果。截幾個圖看一下。






好了,進入正題。
做這類html5頁面,最主要的事件就是滑動事件。
分別是左右滑動和上下滑動。
說到這裏,可能很多人都會脫口而出。用zepto.js就可以簡單搞定啦。

我也是這麼想的。於是很快的,就用zepto.js加上它的touch組件,touch.js實現了相應的效果。
在谷歌瀏覽器的模擬器也能很好的兼容。

後來放上測試服務器,用手機一看,問題來了!!!!
手機上的uc,騰訊,微信自帶瀏覽器,QQ自帶瀏覽器器,蘋果系統的瀏覽器,安卓的原生瀏覽器,上下滑動的事件都失效!
只有谷歌瀏覽器是有事件相應的。坑爹啊!!!!

zepto.js用的人估計不少,想不到touch.js竟然兼容這麼差,還是我打開的方式不對?!!!
這裏就不貼這個js裏面的代碼出來了。

遇到問題,只好尋求其他解決方法。
解決方法先列幾個吧。
第一個:jquery mobile裏面的touch組件。
第二個:百度的童鞋們實現的touch.js.網址也貼一下吧:http://touch.code.baidu.com/

第三個就是技術羣裏面的一些童鞋提供,親測是有效的:

(function($) {
    var options, Events, Touch;
    options = {
        x: 20,
        y: 20
    };
    Events = ['swipe', 'swipeLeft', 'swipeRight', 'swipeUp', 'swipeDown', 'tap', 'longTap', 'drag'];
    Events.forEach(function(eventName) {
        $.fn[eventName] = function() {
            var touch = new Touch($(this), eventName);
            touch.start();
            if (arguments[1]) {
                options = arguments[1]
            }
            return this.on(eventName, arguments[0])
        }
    });
    Touch = function() {
        var status, ts, tm, te;
        this.target = arguments[0];
        this.e = arguments[1]
    };
    Touch.prototype.framework = function(e) {
        e.preventDefault();
        var events;
        if (e.changedTouches) events = e.changedTouches[0];
        else events = e.originalEvent.touches[0];
        return events
    };
    Touch.prototype.start = function() {
        var self = this;
        self.target.on("touchstart",
        function(event) {
            event.preventDefault();
            var temp = self.framework(event);
            var d = new Date();
            self.ts = {
                x: temp.pageX,
                y: temp.pageY,
                d: d.getTime()
            }
        });
        self.target.on("touchmove",
        function(event) {
            event.preventDefault();
            var temp = self.framework(event);
            var d = new Date();
            self.tm = {
                x: temp.pageX,
                y: temp.pageY
            };
            if (self.e == "drag") {
                self.target.trigger(self.e, self.tm);
                return
            }
        });
        self.target.on("touchend",
        function(event) {
            event.preventDefault();
            var d = new Date();
            if (!self.tm) {
                self.tm = self.ts
            }
            self.te = {
                x: self.tm.x - self.ts.x,
                y: self.tm.y - self.ts.y,
                d: (d - self.ts.d)
            };
            self.tm = undefined;
            self.factory()
        })
    };
    Touch.prototype.factory = function() {
        var x = Math.abs(this.te.x);
        var y = Math.abs(this.te.y);
        var t = this.te.d;
        var s = this.status;
        if (x < 5 && y < 5) {
            if (t < 300) {
                s = "tap"
            } else {
                s = "longTap"
            }
        } else if (x < options.x && y > options.y) {
            if (t < 250) {
                if (this.te.y > 0) {
                    s = "swipeDown"
                } else {
                    s = "swipeUp"
                }
            } else {
                s = "swipe"
            }
        } else if (y < options.y && x > options.x) {
            if (t < 250) {
                if (this.te.x > 0) {
                    s = "swipeLeft"
                } else {
                    s = "swipeRight"
                }
            } else {
                s = "swipe"
            }
        }
        if (s == this.e) {
            this.target.trigger(this.e);
            return
        }
    }
})(window.jQuery || window.Zepto);


總結:爲什麼要把這個作爲一篇博客發出去,就是因爲之前碰到這個問題的時候,問度娘問谷歌都很少答案。所以把這個小問題說出來,讓碰到類似問題的童鞋,能夠有一些啓發。








發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章