禁用 taphold 默认事件,跨设备

Disable taphold default event, cross device

我正在努力禁用默认的 taphold 浏览器事件。我在 Google 上找到的任何内容都没有提供任何帮助。我只有 Android 4.4.4 移动版和 Chrome 开发工具用于测试。我尝试了 CSS 修复程序,例如 webkit-touch-callout 和其他修复程序,但显然它们不适用于 Android,它们也不适用于 Chrome 开发工具。 我也试过检测右键点击,(e.button==2),它不起作用。

我想出了一个解决方案,但它解决了一个问题并产生了另一个问题。我只想对选定锚点的 'long press' 事件进行自定义操作,我不希望出现默认弹出窗口(在新选项卡中打开,复制 link 地址等) 这就是我所做的:

var timer;
var tap;

$("body").on("touchstart", my_selector, function(e) {
    e.preventDefault();
    timer = setTimeout(function() {
        alert('taphold!');
        tap=false;
    },500);
});

$("body").on("touchend", my_selector, function() {
    if(tap) alert('tap');
    else tap=true;
    clearTimeout(timer);
});

它成功地禁用了默认的taphold 事件并且上下文菜单没有出现。但是,它也会禁用有用的事件,例如滑动。 link 位于垂直菜单中,菜单高于屏幕,因此用户必须滚动它。如果他尝试滚动,从锚点开始,它不会滚动,它会提醒 'tap!'

有什么想法可以禁用默认的点击按钮,或者我可以修复此代码以使其仅禁用点击事件并启用默认的滑动事件吗?

编辑:现在我考虑设置超时,如果指针在同一个地方持续 100 毫秒,然后防止默认操作。然而 e.preventDefault();在 setTimeout 回调中不起作用。

所以现在我只问最简单的例子。我可以在一定时间后阻止默认操作吗(当触摸仍然存在时)。

这就是我在 fiddle 中的全部问题。 http://jsfiddle.net/56Szw/593/ 这不是我的代码,我是从 http://www.gianlucaguarini.com/blog/detecting-the-tap-event-on-a-mobile-touch-device-using-javascript/

那里得到的

请注意,上下滑动框时,滚动不起作用。

我得到了解决方案。太简单了!我不知道有一个 oncontextmenu 事件。这解决了一切:

$("body").on("contextmenu", my_selector, function() { return false; });