Created
May 26, 2016 14:14
-
-
Save dolvik/2e132af0d1e7a92be6e96144e746817c to your computer and use it in GitHub Desktop.
Long tap event
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
//Добавить событие 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