Skip to content

Instantly share code, notes, and snippets.

@dolvik
Created May 26, 2016 14:14
Show Gist options
  • Save dolvik/2e132af0d1e7a92be6e96144e746817c to your computer and use it in GitHub Desktop.
Save dolvik/2e132af0d1e7a92be6e96144e746817c to your computer and use it in GitHub Desktop.
Long tap event
//Добавить событие longtap, которое возникает при длительном (1с) нажатии на элемент
//Переопределяется метод addEventListener у прототипа Element, таким образом, что:
//Если новый метод вызывается для события touchstart, то callback метода декорируется:
//- у элемента проставляется флаг isTouched
//- перед вызовом исходного callback запускается timeout, по окончании которого проверится флаг isTouched и вызовется запуск события longtap
//Если новый метод вызывается для события touchend, то callback метода декорируется:
//- снимается флаг isTouched
const longtapEvent = new Event("longtap");
//сохранить оригинальный addEventListener
const addEventListener = Element.prototype.addEventListener;
const newAddEventListener = function(type, callback, ...params) {
let nextCallback;
//если добавляем событие touchstart, переопределить callback
if (type === "touchstart") {
nextCallback = (...params) => {
//проставить флаг касания
this.isTouched = true;
//запустить timeout
setTimeout(() => {
if (!this.isTouched) {
return;
}
//вызвать событие longtap, если касание еще происходит
this.dispatchEvent(longtapEvent);
}, 1000);
//вызвать оригинальный callback
callback.call(this, ...params);
};
}
else {
//если добавляем событие touchend, переопределить callback
if (type === "touchend") {
nextCallback = (...params) => {
//снять флаг касания
this.isTouched = false;
//вызвать оригинальный callback
callback.call(this, ...params);
}
}
}
//вызвать оригинальный addEventListener
return addEventListener.call(this, type, nextCallback || callback, ...params);
};
//переопределить оригинальный addEventListener
Element.prototype.addEventListener = newAddEventListener;
//тест
const elm = document.getElementById("elm");
elm.addEventListener("longtap", function(event) {
console.log(`Long tap on ${event.target.id}!`);
});
elm.addEventListener("touchstart", function() {
console.log("touchstart");
});
elm.addEventListener("touchend", function() {
console.log("touchend");
});
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment