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.preventDefaultor 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.gestureis no longer and Event, but a simple Object.
考虑到 Hammer 2.0+event.gesture不再是和 Event,而是一个简单的 Object。
event.gesture.srcEventwill not be the proper event to stopPropagation on, so it will not work.
event.gesture.srcEvent将不是停止传播的正确事件,因此它将不起作用。
If you are using the tapevent, 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 stopPropagationand 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

