亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專(zhuān)欄INFORMATION COLUMN

移動(dòng)端VUE點(diǎn)擊、滑動(dòng)和長(zhǎng)按等事件處理(自定義指令)

niuxiaowei111 / 2691人閱讀

摘要:?jiǎn)栴}移動(dòng)設(shè)備上的觸摸事件如何利用它們?nèi)齻€(gè)來(lái)處理點(diǎn)擊長(zhǎng)按滑動(dòng)等操作,以及如何在測(cè)試用例中模擬它們的操作參考了實(shí)現(xiàn)方法上這位大哥的思路移動(dòng)設(shè)備的點(diǎn)擊優(yōu)化參考了感謝解決使用自定義指令來(lái)干這件事來(lái)記錄開(kāi)始點(diǎn)擊的位置和時(shí)間,并在這里邊判斷長(zhǎng)按操作來(lái)確

問(wèn)題:

移動(dòng)設(shè)備上的觸摸事件:touchstart、touchmove、touchend
如何利用它們?nèi)齻€(gè)來(lái)處理點(diǎn)擊、長(zhǎng)按、滑動(dòng)等操作,以及如何在測(cè)試用例中模擬它們的操作

參考了:

實(shí)現(xiàn)方法上 https://blog.csdn.net/qq_1775... 這位大哥的思路

移動(dòng)設(shè)備的點(diǎn)擊優(yōu)化參考了MUI

//感謝!?。?/pre>
解決

使用vue自定義指令來(lái)干這件事

touchstart來(lái)記錄開(kāi)始點(diǎn)擊的位置和時(shí)間,并在這里邊判斷 長(zhǎng)按 操作

touchend來(lái)確定結(jié)束點(diǎn)擊的位置和時(shí)間,來(lái)區(qū)分 點(diǎn)擊 操作以及 不同方向的滑動(dòng) 操作

需要有v-on一樣的修飾符來(lái)處理不同的觸發(fā)條件(.stop .prevent .self .once)

移動(dòng)設(shè)備上人類(lèi)手指太粗導(dǎo)致的點(diǎn)擊位置的問(wèn)題的修正(使用Touch事件中的changeTouches來(lái)確定點(diǎn)擊的中心位置)

移動(dòng)設(shè)備滑動(dòng)方向的判斷(思路來(lái)自mui源碼)

然后直接上操作類(lèi)

class VueTouch {
  /**
   * @param el 綁定的DOM
   * @param binding 自定義指令中的binding對(duì)象
   * @param type 綁定的事件類(lèi)型
   */
  constructor(el, binding, type) {
    
    let g = this;
    
    g.obj = el;
    g.binding = binding;
    g.touchType = type;
    
    g.firstTouchPosition = {x: 0, y: 0};
    g.firstTouchTime = 0;
    
   /**
     * =========================================
     * 事件綁定有兩種方式
     * @example
     *  1. v-tap="showDialog" 綁定一個(gè)方法對(duì)象
     *  2. v-tap="{fn:click123, param1:1, param2:2, param3:{aaa:"123"} ...}"
     *      綁定一個(gè)JSON字面量,fn是執(zhí)行的方法,后邊的是需要傳遞的參數(shù)
     * 事件回調(diào)參數(shù)
     * @param 第一個(gè)參數(shù)是event,事件對(duì)象
     * @param 第二個(gè)參數(shù)是 binding.value,也就是v-tap=""雙引號(hào)中的部分(如示例2,第二個(gè)參數(shù)就是 {fn:click123, param1:1, param2:2, param3:{aaa:"123"} ...})
     * =========================================
     */   
    g.callBack = typeof(binding.value) === "object" ? binding.value.fn : binding.value;
    
    // 事件監(jiān)聽(tīng)回調(diào)集合
    let _listener = Object.create(null);
    
    // 事件方法
    let _listen = (type) => {
      return function (e) {
      
        /**
         * 取出修飾符(和v-on的一樣)
         */
        let {stop, prevent, self, once} = g.binding.modifiers;
        
        // 配置判斷
        if (stop) e.stopPropagation();
        if (prevent) e.preventDefault();
        if (once) g.obj.removeEventListener("touch" + type, _listener[type]);
        if (self && e.target !== e.currentTarget) return;
        
        g[type](e);
      }
    };
    
    _listener.start = _listen("start");
    _listener.end = _listen("end");
    _listener.move = _listen("move");
    
    // 事件綁定
    this.obj.addEventListener("touchstart", _listener.start, false);
    this.obj.addEventListener("touchend", _listener.end, false);
    this.obj.addEventListener("touchmove", _listener.move, false);
  }
  
  // 點(diǎn)擊開(kāi)始
  start(e) {
    
    let g = this;
    
    // @update 2018.3.26 這里做了一個(gè)修改
    g.moved = false; //是否移動(dòng)了
    g.leaved = false; //是否離開(kāi)了 
    g.longTouched = false; //是否執(zhí)行了長(zhǎng)按操作
    
    // 獲取開(kāi)始點(diǎn)擊位置和時(shí)間
    g.firstTouchPosition = g.getMultiCenter(e.changedTouches);
    g.firstTouchTime = e.timeStamp;
    
    // 判斷長(zhǎng)按操作 @TODO 稍微有點(diǎn)觸發(fā)時(shí)機(jī)上的問(wèn)題,待修正
    g.time = setTimeout(function () {
      if (!g.leaved && !g.moved) {
        g.touchType === "longtap" && g.callBack(e, g.binding.value);
        g.longTouched = true;
      }
    }.bind(g), 1000);
  }
  
  // 點(diǎn)擊結(jié)束
  end(e) {
    
    let g = this;
    
    // 點(diǎn)擊結(jié)束獲取點(diǎn)擊位置并計(jì)算位移和時(shí)差
    let {x, y} = g.getMultiCenter(e.changedTouches);
    let _disX = x - g.firstTouchPosition.x;
    let _disY = y - g.firstTouchPosition.y;
    let _dis = Math.sqrt(_disX * _disX + _disY * _disY);
    let _timeDis = e.timeStamp - g.firstTouchTime;
    
    clearTimeout(g.time);
    
    // 計(jì)算滑動(dòng)角度
    let _angle = this.getAngle(_disX, _disY);
    
    // 判斷滑動(dòng)方向
    if (_dis > 18 && _timeDis < 300) {
      g.touchType === "swipe" && g.callBack(e, g.binding.value);
      if (_angle >= 60 && _angle <= 120)
        g.touchType === "swipedown" && g.callBack(e, g.binding.value);
      if (_angle <= -60 && _angle >= -120)
        g.touchType === "swipeup" && g.callBack(e, g.binding.value);
      if (_angle <= 20 && _angle >= -20)
        g.touchType === "swipeleft" && g.callBack(e, g.binding.value);
      if ((_angle <= -160 && _angle > -180) || (_angle >= 160 && _angle <= 180))
        g.touchType === "swiperight" && g.callBack(e, g.binding.value);
    } else {
      if (!g.longTouched && !g.moved) {
        g.touchType === "tap" && g.callBack(e, g.binding.value);
        g.leaved = true;
      }
    }
  }
  
  move() {
    this.moved = true;
  }
  
  /**
   * 獲取點(diǎn)擊集合的中心坐標(biāo)
   * @param touches touch對(duì)象集合
   * @return {{x: number, y: number}}
   */
  getMultiCenter(touches) {
    
    let g = this, x = 0, y = 0;
    
    const _length = touches.length;
    
    for (let i = 0; i < _length; i++) {
      x += touches[i].pageX;
      y += touches[i].pageY;
    }
    
    return {
      x: Math.round(x / _length),
      y: Math.round(y / _length)
    };
  };
  
  /**
   * 獲取滑動(dòng)的角度
   * @param disX X軸的位移
   * @param disY Y軸的位移
   * @return 角度
   */
  getAngle(disX, disY) {
    let g = this;
    
    if (typeof disX !== "number" || typeof disY !== "number")
      return 45;
    
    return Math.atan2(disY, disX) * 180 / Math.PI;
  }
}

然后執(zhí)行生成指令

Vue.directive("tap", {
    bind: function (el, binding) {
      new VueTouch(el, binding, "tap");
    }
  });
  Vue.directive("swipe", {
    bind: function (el, binding) {
      new VueTouch(el, binding, "swipe");
    }
  });
  Vue.directive("swipeleft", {
    bind: function (el, binding) {
      new VueTouch(el, binding, "swipeleft");
    }
  });
  Vue.directive("swiperight", {
    bind: function (el, binding) {
      new VueTouch(el, binding, "swiperight");
    }
  });
  Vue.directive("swipedown", {
    bind: function (el, binding) {
      new VueTouch(el, binding, "swipedown");
    }
  });
  Vue.directive("swipeup", {
    bind: function (el, binding) {
      new VueTouch(el, binding, "swipeup");
    }
  });
  Vue.directive("longtap", {
    bind: function (el, binding) {
      new VueTouch(el, binding, "longtap");
    }
  });

源碼參看:https://github.com/LylaYuKako...

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/93614.html

相關(guān)文章

  • vue移動(dòng)體驗(yàn)上的優(yōu)化解決方案

    摘要:去年年底自己搭了一個(gè)在移動(dòng)端的開(kāi)發(fā)框架,感覺(jué)體驗(yàn)不是很好。路由懶加載首頁(yè)終于寫(xiě)完了,以上這些就是我在移動(dòng)端體驗(yàn)優(yōu)化的實(shí)戰(zhàn)。去年年底自己搭了一個(gè)vue在移動(dòng)端的開(kāi)發(fā)框架,感覺(jué)體驗(yàn)不是很好。上個(gè)星期又要做移動(dòng)端的項(xiàng)目了。所以我花了兩天時(shí)間對(duì)之前的那個(gè)開(kāi)發(fā)框架做了以下優(yōu)化 自定義vuex-plugins-loading 路由切換動(dòng)畫(huà) + keep alive 動(dòng)態(tài)管理緩存組件 better-sc...

    godlong_X 評(píng)論0 收藏0
  • 微信開(kāi)發(fā)之微信jssdk錄音功能開(kāi)發(fā)

    項(xiàng)目需求簡(jiǎn)單描述 用戶(hù)長(zhǎng)按錄音,松手后直接結(jié)束錄音,結(jié)束錄音后,用戶(hù)可以選擇重新錄音、播放剛才的錄音,上傳錄音(這里的上傳錄音指上傳到自己服務(wù)器,上傳步驟是,前端調(diào)用wx.uploadVoice,后臺(tái)再到微信服務(wù)器下載音頻文件,上傳到自己的服務(wù)器)。注意,音頻文件自上傳時(shí)間算起在微信服務(wù)器的有效期為3天。由于后臺(tái)從微信服務(wù)器下載的音頻文件是amr格式的,需要后臺(tái)先把a(bǔ)mr文件轉(zhuǎn)換成MP3,前端用a...

    bingchen 評(píng)論0 收藏0
  • vue移動(dòng)側(cè)滑面板組件

    摘要:里邊涉及到的指令是自定義的指令,為了處理移動(dòng)端的點(diǎn)擊操作,我還整理了一片陋文移動(dòng)點(diǎn)擊長(zhǎng)按滑動(dòng)指令然后這個(gè)組件的源碼我放在了我出來(lái)的項(xiàng)目上謝謝各位品嘗, 以下這段都是廢話(huà),請(qǐng)?zhí)^(guò) 公司移動(dòng)端開(kāi)發(fā)平臺(tái)進(jìn)行了大變革,前端架構(gòu)由DCloud大生態(tài)轉(zhuǎn)換為VUE,所以移動(dòng)端的UI組件庫(kù)從MUI改為使用MintUI,然后開(kāi)始大刀闊斧的把MintUI組件改成MUI組件的樣子,然后發(fā)現(xiàn)少了幾個(gè)較為常用的...

    TNFE 評(píng)論0 收藏0
  • 單點(diǎn)手勢(shì)庫(kù)

    摘要:?jiǎn)吸c(diǎn)手勢(shì)庫(kù)分析手勢(shì)是什么有哪些方法實(shí)現(xiàn)首先我這里指的手勢(shì)是指我們?cè)谝苿?dòng)端進(jìn)行觸屏交互的時(shí)候,用戶(hù)操作的一些手勢(shì)??梢钥吹刂房偨Y(jié)這是我挺久之前做的移動(dòng)端單點(diǎn)手勢(shì)庫(kù)學(xué)習(xí)時(shí)參考劇中人你可以在這里找到我個(gè)人網(wǎng)站 單點(diǎn)手勢(shì)庫(kù) 分析 手勢(shì)是什么? 有哪些方法實(shí)現(xiàn)? 首先我這里指的手勢(shì)是指我們?cè)谝苿?dòng)端進(jìn)行觸屏交互的時(shí)候,用戶(hù)操作的一些手勢(shì)。在我們?cè)谝苿?dòng)端需要一些交互的時(shí)候。難免有時(shí)候需要左滑右...

    jollywing 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<