javascript 锤子.js 和 preventDefault();
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/18225061/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
hammer.js and preventDefault();
提问by myradon
js to also support touch-gestures. I'm bagging my head about prevent default actions. when I set event.preventDefault
or event.gesture.preventDefault()
or even apply parameter {prevent_defaults: true }
on hammer it just triggers default action on the anchor. How can I prevent that and/or what am I doing wrong?!
js 还支持触摸手势。我正在考虑防止默认操作。当我在锤子上设置event.preventDefault
或event.gesture.preventDefault()
什至应用参数时{prevent_defaults: true }
,它只会触发锚点上的默认操作。我怎样才能防止这种情况和/或我做错了什么?!
Code snippet;
代码片段;
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();
}
}
回答by Joel Cox
Considering Hammer 2.0+ event.gesture
is no longer and Event, but a simple Object.
考虑到 Hammer 2.0+event.gesture
不再是和 Event,而是一个简单的 Object。
event.gesture.srcEvent
will not be the proper event to stopPropagation on, so it will not work.
event.gesture.srcEvent
将不是停止传播的正确事件,因此它将不起作用。
If you are using the tap
event, and want to prevent click/taps on the document you can do something like this.
We need to create a global tap handler that will replace the original methods stopPropagation
and preventDefault
如果您正在使用该tap
事件,并且想要防止单击/点击文档,您可以执行以下操作。我们需要创建一个全局的 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();
});
回答by Proustibat
I think you can also try event.stopPropagation()
and event.gesture.stopPropagation()
.
But it seems that Hammer gives that method : event.gesture.stopDetect()
for a similar case.
我想你也可以尝试event.stopPropagation()
和event.gesture.stopPropagation()
。但似乎 Hammer 给出了这种方法:event.gesture.stopDetect()
对于类似的情况。
来源:https: //github.com/hammerjs/hammer.js/wiki/Event-delegation-and-how-to-stopPropagation---preventDefaults