【问题标题】:Preventing default context menu on longpress / longclick in mobile Safari (iPad / iPhone)在移动Safari(iPad / iPhone)中长按/长按时防止默认上下文菜单
【发布时间】:2012-08-31 12:07:49
【问题描述】:

对于一个网站,我想在用户“长按”屏幕时显示自定义上下文菜单。我在代码中创建了一个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 有一些特定的处理(假设由it's source code 的这个 sn-p):

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

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

【问题讨论】:

    标签: javascript jquery iphone ipad mobile-safari


    【解决方案1】:

    感谢 JDandChips pointing我提供解决方案。它与 longclick 插件完美结合。为了文档起见,我将发布我自己的答案来展示我所做的事情。

    HTML:

    <script type="text/javascript"
            src="https://raw.github.com/pisi/Longclick/master/jquery.longclick-min.js"></script>
    
    <p><a href="http://www.google.com/">Longclick me!</a></p>
    

    Javascript 已经可以了:

    function longClickHandler(e){
      e.preventDefault();
      $("body").append("<p>You longclicked. Nice!</p>");
    }
    
    $("p a").longclick(250, longClickHandler);
    

    解决方法是将这些规则添加到样式表中:

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

    Disabled context menu example.

    【讨论】:

    • 它在 jsfiddle.net 上工作,但在本地页面上不工作,为什么?
    • 这只是长按锚点的解决方案。如果您有输入区、文本区或其他形式的内容编辑器,这并不能解决出现默认上下文菜单的问题。
    • @RGA 问题是由使用 https 引用 Javascript 引起的。我已经解决了这个问题。
    • 要修复您的小提琴,请参考来自 github 的 cdn.rawgit.com 或 rawgit.com 文件(取决于生产/开发)-rawgit.com
    • 这个解决方案接近于执行我想要完成的任务。允许文本选择,但显示允许对该文本执行操作的自定义菜单(从而禁用 iOS 标注菜单)。这里有人知道我该怎么做吗?如果您对我如何做到这一点有任何可能的解决方案的想法,请offer an answer to the question here。提前致谢!
    【解决方案2】:
    <style type="text/css">
    *:not(input):not(textarea) {
      -webkit-user-select: none; /* disable selection/Copy of UIWebView */
      -webkit-touch-callout: none; /* disable the IOS popup when long-press on a link */
    }       
    </style>
    

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

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

    【讨论】:

    • 将此全局应用于所有链接在移动网站上是一种不好的做法。
    • 这适用于 iphone ios9。我父亲经常长按一个列表视图项目,这个 css 禁用了弹出窗口。
    • 我强烈建议不要使用星形选择器,甚至会在这种情况下将其标记为反模式。全面关闭基本的浏览器功能可能会导致您在路上遇到问题。这种以刀换手术刀的方法是使项目走下坡路的原因。但是,选项二是可以接受的,只要您在目标场景中这样做。那只是我的 2 美分。
    【解决方案3】:

    一个快速的 CSS 解决方案:

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

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

    【讨论】:

    • 我希望用户仍然选择,但我不想弹出上下文菜单....当我删除 -webkit-user-select: none; 时,它仍然为我显示上下文菜单:(
    • 为什么不html { display: none !important; }
    【解决方案4】:

    无需使用JavaScript,使用css即可。

    仅对图像禁用上下文菜单, 使用

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

    如果我们需要禁用特定类的上下文菜单, 使用

    .className{-webkit-touch-callout: none !important; 
    -webkit-user-select: none !important; }
    

    【讨论】:

    • 你拯救了我的一天。
    【解决方案5】:

    我没有 iPad,因此无法测试解决方案,但我确实遇到了类似的问题,该问题已解决。不知道对你有没有帮助,这里是链接:How to disable the default behavior of an Anchor in jQuery Mobile (iOS)

    【讨论】:

      【解决方案6】:

      无需依赖-webkit- 属性。

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

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

      这样运行起来会顺畅很多,尤其是当页面中有数百个链接时。

      您还可以以损失 SEO 为代价将其扩展到“真实”页面链接:

      <a class="originalLink" onclick="location.href='http://mylink';">Real URL Link</a>
      

      对于大多数网站来说并不是很好的做法,但对于特定适合移动设备的情况(移动网络应用)来说,这可能是至关重要的。

      编码愉快!

      【讨论】:

        【解决方案7】:

        这个 github 存储库为我工作。就我而言,我使用 UIWebView 编写了一个 iPad 应用程序。

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

        【讨论】:

          【解决方案8】:

          我用过这个:

          <p onclick="window.location.href='https://google.com‘“>Link</p>
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2014-05-04
            • 1970-01-01
            • 2016-08-08
            • 2022-11-13
            • 2011-03-25
            • 2019-10-01
            相关资源
            最近更新 更多