Javascript: обнаружение долгого нажатия - PullRequest
0 голосов
/ 24 июня 2018

Чтобы различать прокрутку и перетаскивание на сенсорных устройствах, я решил учесть, что событие перетаскивания произошло, если оно следует после долгого нажатия.

Есть ли способ сделать код ниже чище?

const listItem = document.getElementById("listItem");
listItem.addEventListener("touchstart", onTouchstart);
listItem.addEventListener("touchmove", onTouchmove);
listItem.addEventListener("touchend", onTouchend);

const longpress = false;
const longpressStart = 0;
const longpressChecked = false;
const LONGPRESS_DURATION = 100;

function onTouchstart() {
    longpress = false;
    longpressStart = Date.now();
}

function isLongPress() {
    if (longpressChecked) {
        return longpress;
    }
    if (Date.now() - longpressStart >= LONGPRESS_DURATION) {
        longpress = true;
    }
    longpressChecked = true;
    return longpress;
}

function onTouchmove() {

    if (isLongPress()) {
        // drag and drop logic
    }
}

function onTouchend() {
    longpress = false;
    longpressStart = 0;
    longpressChecked = false;
}

Спасибо за помощь

Ответы [ 2 ]

0 голосов
/ 24 июня 2018
const listItem = document.getElementById("listItem");

listItem.addEventListener("touchstart", onTouchstart);
listItem.addEventListener("touchmove", onTouchmove);
listItem.addEventListener("touchend", onTouchend);

var onlongtouch = false;

function onTouchstart() {
  timer = setTimeout(function() {
    onlongtouch = true;
  }, 100);
}

function onTouchmove() {
  if(onlongtouch) {
    // do something
  }
}

function onTouchend() {
  if (timer)
    clearTimeout(timer);
  onlongtouch = false; 
}
0 голосов
/ 24 июня 2018

Вы можете украсить это с помощью некоторых функций карри стрелки:

const listen (el, name) => handler => el.addEventListener(name, handler);

const since = (onStart, onEnd) => {
  let last = 0;
  onStart(() => last = Date.now());
  onEnd(() => last = 0);
  return time => Date.now() - last < time;
};

Так что вы можете просто сделать:

const longPress = since(
   listen(listItem, "touchstart"),
   listen(listItem, "touchend")
);

listen(listItem, "touchmove")(evt => {
  if(longPress(100)) {
    //...
   }
});
...