HTML and CSS:
<div id="something">Click or double click me</div>
<hr/>
<div id="good">Click or double click me</div>
<style>
#something, #good {
background-color: lemonchiffon;
}
</style>
JS:
addGlobalEventListener(
'click',
'#something',
debounceSingleClickOnly(sayHello)
);
addGlobalEventListener(
'dblclick',
'#something',
sayWorld
);
addGlobalEventListener(
'click',
'#good',
debounceSingleClickOnly(sayHello)
);
addGlobalEventListener(
'dblclick',
'#good',
sayWorld
);
let counter = 0;
function sayHello({target: {id}}) {
++counter;
console.log(`${counter}. clicked ${id}`);
}
function sayWorld({target: {id}}) {
++counter;
console.log(`${counter}. double-clicked ${id}`);
}
function addGlobalEventListener(type, selector, callback) {
document.addEventListener(type, (e) => {
if (e.target.matches(selector)) {
callback(e);
}
});
}
function debounce(func, wait, immediate) {
let timeout;
return function () {
const context = this,
args = arguments;
const later = function () {
timeout = null;
if (!immediate) func.apply(context, args);
};
const callNow = immediate && !timeout;
clearTimeout(timeout);
timeout = setTimeout(later, wait);
if (callNow) func.apply(context, args);
};
}
function debounceSingleClickOnly(func, timeout = 500) {
function eventHandler(event) {
const { detail } = event;
if (detail > 1) {
return;
}
func.apply(this, arguments);
}
return debounce(eventHandler, timeout);
}
No comments:
Post a Comment