在移动Safari(iPad / iPhone)中防止longpress / longclick上的默认上下文菜单

对于一个网站,我想在用户“长按”屏幕时显示自定义上下文菜单。 我在我的代码中创建了一个jQuery Longclick监听器来显示自定义上下文菜单。 将显示上下文菜单,但也会显示iPad的默认上下文菜单! 我试图通过在我的监听器中向事件添加preventDefault()来防止这种情况,但这不起作用:

 function showContextMenu(e){ e.preventDefault(); // code to show custom context menu } $("#myId").click(500, showContextMenu); 

问题

  1. 你可以阻止iPad的默认上下文菜单显示吗?
  2. 可以使用jQuery Longclick插件完成吗?

Longclick插件具有针对iPad的一些特定处理(假设通过它的源代码片段):

 if (!(/iphone|ipad|ipod/i).test(navigator.userAgent)){ $(this) .bind(_mousedown_, schedule) .bind([_mousemove_, _mouseup_, _mouseout_, _contextmenu_].join(' '), annul) .bind(_click_, click) } 

所以我假设这回答了我的第二个问题(假设插件使用了正确的事件)。

感谢JDandChips 指出我的解决方案。 它与longclick插件结合使用非常完美。 为了便于记录,我会发布自己的答案来展示我的所作所为。

HTML:

  

Longclick me!

Javascript已经可以了:

 function longClickHandler(e){ e.preventDefault(); $("body").append("

You longclicked. Nice!

"); } $("pa").longclick(250, longClickHandler);

修复是将这些规则添加到样式表:

 body { -webkit-touch-callout: none !important; } a { -webkit-user-select: none !important; } 

禁用上下文菜单示例


更新 : jQuery Longclick插件似乎只适用于iPad上的Safari,而不适用于Google Chrome! 我正在调查此刻。


更新2 :我已将Longclick Javascript嵌入到Fiddle的源代码中,因为我在Chrome中遇到以下错误(由于https ):

拒绝执行’ https://raw.github.com/pisi/Longclick/master/jquery.longclick-min.js ‘中的脚本,因为它的MIME类型(’text / plain’)不可执行,并且严格的MIME类型检查已启用。

查看更新版本: http : //jsfiddle.net/z9ZNU/53/

  

如果你想只禁用锚点按钮标签,请使用:

 a { -webkit-user-select: none; /* disable selection/Copy of UIWebView */ -webkit-touch-callout: none; /* disable the IOS popup when long-press on a link */ } 

一个快速的CSS解决方案:

 html { -webkit-user-select: none; -webkit-touch-callout: none; } 

用户选择禁用突出显示文本/区域。
touch-callout禁用上下文菜单弹出窗口。

我没有iPad,所以无法测试解决方案,但我确实遇到了类似的问题,已经解决了。 我不知道它对你有什么帮助,但这里是链接: 如何在jQuery Mobile(iOS)中禁用Anchor的默认行为

没有必要依赖-webkit-属性。

如果您的链接是Javascript调用,那就像完全删除href="void(0)"一样简单! 您的ontouchendonclick属性仍然有效。 如果您希望链接看起来像原始,请添加此css:

 a .originalLink { color: blue; text-decoration: underline; cursor: pointer; } 

这将运行得更顺畅,尤其是当页面中有数百个链接时。

你也可以以SEO损失为代价将其扩展到“真正的”页面链接:

 Real URL Link 

对于大多数网站而言,这不是一个好的做法,但对于特定的移动友好情况(移动网络应用程序),这可能至关重要。

快乐的编码!

这个github存储库对我有用。 在我的例子中,我使用UIWebView编写了一个iPad应用程序。

https://github.com/vaidik/jquery-longpress