Например, внутри одного класса можно реализовать логику "preventDefault для события onContextMenu должен случаться только когда есть подписка на onHold" через отдельный обработчик события onContextMenu и расположить его рядом с обработчиком события onHold:
setup: function(element) {
const $element = $(element);
eventsEngine.on($element, CONTEXTMENU this._contextMenuHandler.bind(this));
if(touch || devices.isSimulator()) {
eventsEngine.on($element, HOLD, this._holdHandler.bind(this));
eventsEngine.on($element, CONTEXTMENU, (e) => {e.preventDefault();});
}
},
_contextMenuHandler: function(e) {
this._fireContextMenu(e);
},
На мой взгляд это очень маленькая группировка и я ее не применяю.
Хотя она конечно возможна и это конечно группировка и даже выделение независимого кода в отдельные блоки (один обработчик предназначен для одной логики, а другой обработчик - для другой).
Но если бы я применял этот прием внутри одного класса, то мне пришлось бы подозревать подобные двойные обработчики в каждом классе и в каждом классе проверять "нет ли в этом классе еще обработчиков на интересующее меня событие?"
Ведь там может быть важный код, влияющий на весь алгоритм работы события: "e.preventDefault()"
Вместо такой группировки я делаю единственный обработчик и добавляю в него код с условиями и коротким комментарием:
setup: function(element) {
const $element = $(element);
eventsEngine.on($element, CONTEXTMENU this._contextMenuHandler.bind(this));
if(touch || devices.isSimulator()) {
eventsEngine.on($element, HOLD, this._holdHandler.bind(this));
}
},
_contextMenuHandler: function(e) {
if(touch || devices.isSimulator()) {
e.preventDefault(); // prevent for HOLD event
}
this._fireContextMenu(e);
},
Из такого кода мне проще понять логику всего алгоритма и не выискивать под отладкой какой код сделал "e.preventDefault()".
Комментариев нет:
Отправить комментарий