1. 程式人生 > >JavaScript實現監聽移動端上下左右滑動事件

JavaScript實現監聽移動端上下左右滑動事件

Introduction

最近剛入坑web前端,學了一點基礎,便準備寫個簡單的2048小遊戲試試手。開發過程中發現,
PC端可以直接監聽鍵盤輸入,但是移動端就不得不監聽螢幕上的滑動事件了。

  • 現有的js庫中沒有可以直接滿足上述要求的封裝
  • 在JQuery Mobile 中 可以通過 .on 的方式監聽左右滑動事件,但是沒有上下滑動事件(而且我想寫一個PC端和移動端都通用的網頁的話,就必須引入Jquery,同時引入Jquery和Jquery Mobile 使得Bootstrap中的按鈕樣式改變了,這顯然不是想要的結果)
  • 所以為了保持PC端和移動端的一致性,決定直接封裝一下js的移動端的觸控事件,實現上述需求

2048

可以在手機上開啟,仍然具有不錯的互動

JS 觸控事件(event)

  • ### event的型別
    • touchstart: 當手指觸控式螢幕幕時觸發(相當於Android中的ACTION_DOWN事件)
    • touchmove: 當手指在螢幕上滑動時連續觸發(相當於Android中的ACTION_MOVE事件)— 期間呼叫preventDefault()可以遮蔽事件的預設行為,達到阻止滾動的效果
    • touchend: 當手指從螢幕上移開時觸發(相當與Android中的ACTION_UP)
    • touchcancel: 當系統停止跟蹤觸控時觸發。關於此事件的觸發時機,文件中沒有明確說明(我們在接下來的過程中也用不到)
  • event用於跟蹤觸控的屬性

    • touches: 表示當前跟蹤的觸控操作的Touch物件的陣列
    • targetTouches: 特定於事件目標的Touch物件陣列
    • changeTouches: 表示子上次觸控以來發生了什麼改變的Touch物件的陣列

    注意: 在touchend事件發生時,event的touches物件中就沒有元素了,需要到changeTouches中去獲取觸控離開時的位置資訊

  • Touch物件包含的陣列

    • clentX: 觸控目標在視窗中的x座標
    • clientY: 觸控目標在視窗中的y座標
    • identifier: 標識觸控的唯一ID
    • pageX: 觸控目標在頁面中的x座標
    • pageY: 觸控目標在頁面中的y座標
    • screenX: 觸控目標在螢幕中的x座標
    • screenY: 觸控目標在螢幕中的y座標
    • target:觸控的DOM節點目標
  • 封裝一個操作物件

    該物件的封裝,前兩個函式參考書籍《JavaScript 高階程式設計》(第三版)

    var EventUtil = {
        addHandler: function (element, type, handler) {
            if (element.addEventListener)
                element.addEventListener(type, handler, false);
            else if (element.attachEvent)
                element.attachEvent("on" + type, handler);
            else
                element["on" + type] = handler;
        },
        removeHandler: function (element, type, handler) {
            if(element.removeEventListener)
                element.removeEventListener(type, handler, false);
            else if(element.detachEvent)
                element.detachEvent("on" + type, handler);
            else
                element["on" + type] = handler;
        },
        /**
         * 監聽觸控的方向
         * @param target            要繫結監聽的目標元素
         * @param isPreventDefault  是否遮蔽掉觸控滑動的預設行為(例如頁面的上下滾動,縮放等)
         * @param upCallback        向上滑動的監聽回撥(若不關心,可以不傳,或傳false)
         * @param rightCallback     向右滑動的監聽回撥(若不關心,可以不傳,或傳false)
         * @param downCallback      向下滑動的監聽回撥(若不關心,可以不傳,或傳false)
         * @param leftCallback      向左滑動的監聽回撥(若不關心,可以不傳,或傳false)
         */
        listenTouchDirection: function (target, isPreventDefault, upCallback, rightCallback, downCallback, leftCallback) {
            this.addHandler(target, "touchstart", handleTouchEvent);
            this.addHandler(target, "touchend", handleTouchEvent);
            this.addHandler(target, "touchmove", handleTouchEvent);
            var startX;
            var startY;
            function handleTouchEvent(event) {
                switch (event.type){
                    case "touchstart":
                        startX = event.touches[0].pageX;
                        startY = event.touches[0].pageY;
                        break;
                    case "touchend":
                        var spanX = event.changedTouches[0].pageX - startX;
                        var spanY = event.changedTouches[0].pageY - startY;
    
                        if(Math.abs(spanX) > Math.abs(spanY)){      //認定為水平方向滑動
                            if(spanX > 30){         //向右
                                if(rightCallback)
                                    rightCallback();
                            } else if(spanX < -30){ //向左
                                if(leftCallback)
                                    leftCallback();
                            }
                        } else {                                    //認定為垂直方向滑動
                            if(spanY > 30){         //向下
                                if(downCallback)
                                    downCallback();
                            } else if (spanY < -30) {//向上
                                if(upCallback)
                                    upCallback();
                            }
                        }
    
                        break;
                    case "touchmove":
                        //阻止預設行為
                        if(isPreventDefault)
                            event.preventDefault();
                        break;
                }
            }
        }
    };
    • 使用

      //使用的時候很簡單,只需要向下面這樣呼叫即可
      //其中下面監聽的是整個DOM
      //up, right, down, left為四個回撥函式,分別處理上下左右的滑動事件
      EventUtil.listenTouchDirection(document, true, up, right, down, left)

    相關推薦

    原生JavaScript實現移動上下左右滑動事件

    /** * @author W.Dong * @date 2018/10/26 * @Description: 監聽觸控的方向 */ var EventUtil = { addHandler: function (element, type, handler) { if

    JavaScript實現移動上下左右滑動事件

    Introduction 最近剛入坑web前端,學了一點基礎,便準備寫個簡單的2048小遊戲試試手。開發過程中發現, PC端可以直接監聽鍵盤輸入,但是移動端就不得不監聽螢幕上的滑動事件了。 現有的js庫中沒有可以直接滿足上述要求的

    HTML5 移動瀏覽器返回鍵兼容版本

    list 歷史記錄 記錄 pop 移動 pushstate 移動端 sta listener   // 往windosw對象中的歷史記錄註入URL的方法 function addUrl() { var state = { title: "title

    js移動左右滑動事件

    edt efault nbsp ret rip chm width idt touchend 1 <div id="box" style="width:100%;height:100%;border:1px solid red;"></div>

    [Xcode10 實際操作]七、檔案與資料-(6 )通過通知中心,實現和處理程式退出事件的功能

    本文將演示通過通知中心,實現監聽和處理程式退出事件的功能。在專案導航區,開啟檢視控制器的程式碼檔案【ViewController.swift】 1 import UIKit 2 3 class ViewController: UIViewController { 4 5

    [Xcode10 實際操作]七、文件與數據-(6 )通過通知中心,實現和處理程序退出事件的功能

    英雄 idl ide active xcod end 控制 .sh Once 本文將演示通過通知中心,實現監聽和處理程序退出事件的功能。在項目導航區,打開視圖控制器的代碼文件【ViewController.swift】 1 import UIKit 2 3

    移動頁面滑動事件穿透問題及其解決方案

    滑動事件穿透: 在一個可滾動的列表頁中開啟彈窗,底部的頁面理論上是不可滾動的,但是當滑動彈窗時,底部頁面會跟隨滾動,這就是所謂的頁面滾動穿透的問題。 解決方案一: 當彈窗顯示時,在父元素上新增fix類來禁用滾動;當彈窗隱藏時,移除fix類。 .fix{

    Android實現控制元件點選事件

    Android實現監聽控制元件點選事件 引言          這篇文章主要想寫一下Android實現監聽點選事件的幾種方法,Activity和Fragment實現起來有些方法上會有些不同,這裡也略做介紹。     &nbs

    用css巧妙實現移動橫向滑動展示功能

    公司需要做一個手機橫向滑動的效果,不想用js外掛,太麻煩,匯入程式碼也多。所以去網上找了一下,用css就能實現,挺方便的。主要利用了display:-webkit-box來實現。 <!DOCTYPE html> <html> <head> <ti

    【原創】實現一個簡單的移動左右滑動翻頁+ 點選下標翻頁 利用:HTML5+CSS+Js

    //【如何做一個簡單的手機端頁面的翻頁】//第一步:建立移動端頁面內  HTML + CSS  【注】可用彈性佈局   但需要注意的是  外層盒子的定位//第二步: 思考問題  要實現怎樣的效果?//1. 手指滑動時觸發事件【左右】兩個方向  //2.點選footer部分的下

    1、js原生實現移動手指滑動輪播圖效果

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width

    js原生實現移動手指滑動輪播圖效果

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=dev

    vue 移動鍵盤搜尋事件

    1、首先注意,input的type="serch" <input @keypress="searchGoods" type="serch" placeholder="搜尋商品"> 2、監聽keypress事件 (1)KeyDown、KeyUp 事件 這

    頁面返回事件或者移動返回按鈕事件

    sta lis tle tor tlist 需求 url () history pushHistory(); window.addEventListener("popstate", function(e) { // pushHistory();

    jquery touch 移動上下滑動加載

    hang blog change ldl scrollto jquery scroll edt end var touchStart, touchEnd, touchDiff = 80; $(window).on({ ‘touchs

    js移動客戶-----取消滑動事件(親測好用)

    問題 density chm 阻止默認行為 logs 高度 頭上 function 禁止滑動 現在做的響應式網站,遇到一問題: 網站頭上的側邊欄點開始,向下滑動會出現空白,於是,想到要把body禁止滑動 網上搜了很多辦法,也不好用 註意: 手指在滑動整個屏幕時,會影響瀏覽器

    rabbitMq與spring boot搭配實現

    address app caching prefix 前段時間 ever 不用 理解 its   在我前面有一篇博客說到了rabbitMq實現與zk類似的watch功能,但是那一篇博客沒有代碼實例,後面自己補了一個demo,便於理解。demo中主要利用spring boot

    @WebListener 註解方式實現

    sun listener etc 修改 tom imp exti .get xsd 1.創建 Dynamic Web Project ,Dynamic Web module version選擇3.0 2.在自動生成 的web.xml配置,增加 metadata-com

    16.4 配置Tomcat80口 16.5/16.6/16.7 配置Tomcat虛擬主機 16.8 Tomcat日誌

    16.4 配置tomcat監聽80端口 16.5/16.6/16.7 配置tomcat虛擬主機 16.8 tomcat日誌16.4 配置Tomcat監聽80端口16.5/16.6/16.7 配置Tomcat虛擬主機16.8 Tomcat日誌擴展邱李的tomcat文檔 https://www.linuser

    C程序實現長按物理power鍵3秒關機功能

    c程序間監聽power按鍵關機要實現的功能:在android Framework層被裁剪掉的情況下,實現監聽長按的物理power按鍵,實現長按3秒後關機功能;思路:使用event epoll,非阻塞式IO操作,同時避免無差別輪詢,做到避免忙輪和無差別輪詢提高效率;要用到的epoll函數:epoll_creat