vue自定義事件???

背景

是這樣子滴,有時候我們用vue框架的時候,要用到很多手勢,像tap、doubletap、longtap……,當然現在網上有很多手勢褲什麼的,拿來改一下也是可以實現自己想要的效果滴,我是希望用vue 的時候類似於

<p @tap="aaa" @longtap="bbb">{{msg}}---長按(longtap)點擊(tap)事件</p>

這麼用那好了,左思右想寫了一個小栗子,用來拋磚引玉。

原理

首先要理解js的自定義事件。Events 可以使用 Event構造函數 創建如下:
// 事件對象
var event = new Event(‘build’);

// 監聽事件
elem.addEventListener('build', function (e) { ... }, false);

// 分發事件
elem.dispatchEvent(event);

當然可以,添加自定義數據

var event = new CustomEvent('build', { 'detail': elem.dataset.time });

好了,看了上面的原理之後直接上源碼,簡單封裝一個tap和longtap事件,

實現

先寫個打架都熟悉的vue的小代碼

<!DOCTYPE html>
<html>

    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width,initial-scale=1,minimum-scale=1,maximum-scale=1,user-scalable=no" />
        <title></title>
        <style type="text/css">
            p{
                background: #168dd2;
                padding: 15px;
                color: #FFFFFF;
            }
        </style>
        <script type="text/javascript" src="vue.js"></script>
        <script type="text/javascript" src="tap.js"></script>
    </head>

    <body>
        <div id="app">
            <p @tap="aaa" @longtap="bbb">{{msg}}---長按(longtap)點擊(tap)事件</p>

            <p @tap="aaa">{{msg}}---點擊(tap)事件</p>

            <p @longtap="bbb">{{msg}}---長按(longtap)事件</p>

            <p @touchstart="aaa">{{msg}}---touchstart事件</p>

            <p>{{msg}}---沒有事件跟風用~~~</p>
        </div>
    </body>
    <script type="text/javascript">
        new Vue({
            el: '#app',
            data: {
                msg: 'hello'
            },
            methods: {
                aaa: function(e) {
                    console.log(e);
                },
                bbb: function(e) {
                    console.log('loooongtap');
                    console.log(e);
                }
            }
        })
    </script>

</html>

上面引入了一個tap.js, 下面我們就去補全這個js就好了。

tap.js

(function() {
    var TOUCHSTART, TOUCHMOVE, TOUCHEND;
    if(typeof(window.ontouchstart) != 'undefined') {
        TOUCHSTART = 'touchstart';
        TOUCHEND = 'touchend';
        TOUCHMOVE = 'touchmove';

    } else if(typeof(window.onmspointerdown) != 'undefined') {
        TOUCHSTART = 'MSPointerDown';
        TOUCHEND = 'MSPointerUp';
        TOUCHMOVE = 'MSPointerMove';
    } else {
        TOUCHSTART = 'mousedown';
        TOUCHEND = 'mouseup';
        TOUCHMOVE = 'mousemove';
    }

    function tap(node) {
        var x, y, startTime = 0,
            endTime = 0,
            in_dis = false;
        node.oncontextmenu = function() {
            return false;
        }
        node.addEventListener(TOUCHSTART, function(e) {
            x = e.touches[0].pageX;
            y = e.touches[0].pageY;
            startTime = (new Date()).getTime();
        });

        node.addEventListener(TOUCHEND, function(e) {
            e.stopPropagation();
            e.preventDefault();
            var curx = e.changedTouches[0].pageX;
            var cury = e.changedTouches[0].pageY;
            if(Math.abs(curx - x) < 6 && Math.abs(cury - y) < 6) {
                in_dis = true;
            } else {
                in_dis = false;
            }
            endTime = (new Date()).getTime();
            if(endTime - startTime > 300 && in_dis) {
                e.target.dispatchEvent(new CustomEvent('longtap', {
                    'detail': e
                }));
            } else {
                e.target.dispatchEvent(new CustomEvent('tap', {
                    'detail': e
                }));
            }
        });
    }

    tap(document);
})();

也先不管了 直接掛載到document上面(人懶~~~~)。
這樣子就好了 直接預覽下效果,

圖片描述

能正常調用aaa(), bbb(),還行還行~~~!!!

醬紫之後會不會好一點????,寫的不好~~~道友們輕噴~~~~

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