hammer.js и warnDefault();
JS также поддерживает сенсорные жесты. Я забиваю голову о предотвращении действий по умолчанию. когда я установил event.preventDefault
или же event.gesture.preventDefault()
или даже применить параметр {prevent_defaults: true }
на молотке он просто запускает действие по умолчанию на якоре. Как я могу предотвратить это и / или что я делаю не так?!
Фрагмент кода;
function initializeNavigation() {
$("nav").hammer({prevent_defaults: true }).on("tap", "a", function(event) {
event.preventDefault();
event.gesture.preventDefault();
var target = $(this.hash);
scrollToTarget(target, 1200);
// if there is an open detailItem then close it.
if (detailItemOpen) {
$("div." + detailItemOpen).slideUp();
}
})
if (Modernizr.mq('only screen and (max-width: 767px)')) {
initializeMobileMenuAndSetButton();
}
}
2 ответа
Учитывая Hammer 2.0+ event.gesture
это уже не событие, а простой объект.
event.gesture.srcEvent
не будет подходящим событием для StopPropagation, поэтому оно не будет работать.
Если вы используете tap
событие, и хотите предотвратить щелчки / постукивания по документу, вы можете сделать что-то вроде этого. Нам нужно создать глобальный обработчик крана, который заменит оригинальные методы stopPropagation
а также preventDefault
function createHandler(event) {
return {
isHandled: false,
_shouldStopPropagation: false,
_shoulePreventDefault: false,
stopPropagation: event.stopPropagation.bind(event),
preventDefault: event.preventDefault.bind(event),
}
}
function handleEvent(handler, node) {
let clickHandler;
if (!handler.isHandled) {
handler.isHandled = true;
document.addEventListener('click', clickHandler = (event)=> {
if (handler._shouldStopPropagation) {
handler.stopPropagation();
event.stopPropagation();
}
if (handler._shoulePreventDefault) {
handler.preventDefault();
event.preventDefault();
}
document.removeEventListener('click', clickHandler, true);
}, true);
}
}
// Create a global tap Event so we can replace the original functions
document.addEventListener('tap', (event)=> {
let handler = createHandler(event);
event.stopPropagation = function() {
handler._shouldStopPropagation = true;
handleEvent(handler);
};
event.preventDefault = function() {
handler._shoulePreventDefault = true;
handleEvent(handler);
}
}, true);
// Now we can use it.
document.addEventListener('tap', (event)=> {
/* If you want to prevent Default */
event.preventDefault();
/* If you want to stop propagation */
event.stopPropagation();
/* If you want to do both */
event.preventDefault();
event.stopPropagation();
});
Я думаю, что вы также можете попробовать event.stopPropagation()
а также event.gesture.stopPropagation()
, Но похоже, что Хаммер дает такой метод: event.gesture.stopDetect()
за похожий случай.