【问题标题】:'jQuery UI Draggable' prevents some clicks on elements inside the draggable container'jQuery UI Draggable' 防止点击可拖动容器内的元素
【发布时间】:2021-02-09 17:56:27
【问题描述】:

我正在构建一个可水平拖动的菜单:

代码非常简单,拖动效果很好:

$draggable.draggable({
   axis: "x",
   distance: 30,
   delay: 40,
   scroll: false
});

这是一个高层次的问题:

  • 使用 jQuery Draggable:

    每次您看到鼠标从一个按钮移动到另一个按钮时,您都可以假设我在点击。如您所见,有一些点击被忽略/错过(根本不调用点击回调)。

  • 没有 jQuery Draggable

    您可以看到没有错过任何点击(并且由于某种原因,当 jquery draggable 打开时,没有出现这个浏览器蓝色叠加层,这可能是问题的一部分)


我尝试使用 jQuery 可拖动的 distancedelay 选项,但它似乎不会以任何方式影响问题。

我还有一个可能相关的次要问题。在 Android 9 上,在 Chrome 上,您几乎无法点击按钮。当您单击“填充”部分时它可以工作,而不是文本本身,这对我来说真的很奇怪。在 iOS 上,它运行良好。


如果有帮助,这里是标记:


你知道为什么 jQuery Draggable 会破坏桌面和/或移动设备上的点击吗?

【问题讨论】:

  • 我首先建议你定义一个句柄。这将帮助click 冒泡dragstart。如果您不想添加句柄,那么distance 可能是一个问题(不推荐使用的版本:1.12)。如果单击没有启动拖动,那么它应该被读取为 clickdragstart 事件。否则提供一个最小的、可重现的示例:stackoverflow.com/help/minimal-reproducible-example
  • 根据 jQuery UI API 文档,DistanceDelay 选项在 1.12 版中已弃用。具体来说:(#10615) 交互应该是即时的。这些设置通常用于防止意外拖动,但适当的解决方法是改善用户体验,例如,使用手柄来避免意外拖动。
  • 感谢您抽出宝贵时间。我敢打赌,一个句柄会有所帮助,但这并不是这种菜单的预期用户界面。 Imo 用户希望能够在不瞄准手柄的情况下拖动它。不幸的是,它在某些设备上运行良好。是的,我注意到这两个选项已被弃用,但它们仍在工作(我注意到它们的效果),并且由于 jUI 没有在 aaages 中更新,如果它们解决了我的问题,我很乐意使用它们。如果我真的很绝望,我会尝试使用手柄,但希望有人可以帮助我。或者也许我可以使用另一个拖动库。

标签: android vue.js jquery-ui onclick jquery-ui-draggable


【解决方案1】:

在 1.12 中,我可以在没有 distance 的情况下单击和拖动。请参阅以下内容。

$(function() {
  $("#pills-container .draggable").draggable({
    axis: "x",
    scroll: false,
    containment: [
      0 - ($(window).width() / 2),
      0,
      $(window).width() + ($(window).width() / 2),
      0
    ]
  });
  $("#pills-container .filter-pill").click(function() {
    $(this).toggleClass("ui-state-highlight");
  });
});
.draggable-container {
  width: 100%;
  padding: 0.4em;
  overflow: none;
}

.draggable-container .filter-pill {
  display: inline-block;
  padding: 0.5em 1em;
  border-width: 2px;
  border-color: transparent;
  border-radius: 20px;
}

.draggable-container .filter-pill.ui-state-highlight {
  border-width: 2px;
}
<link rel="stylesheet" href="//code.jquery.com/ui/1.12.1/themes/base/jquery-ui.css">
<script src="https://code.jquery.com/jquery-1.12.4.js"></script>
<script src="https://code.jquery.com/ui/1.12.1/jquery-ui.js"></script>
<div>
  <div id="pills-container" class="ui-widget">
    <div class="draggable-container ui-widget-header">
      <div class="draggable">
        <div class="filter-pill mr-4 ui-widget-content">Location</div>
        <div class="filter-pill mr-4 ui-widget-content">Length</div>
        <div class="filter-pill mr-4 ui-widget-content">Interests</div>
        <div class="filter-pill mr-4 ui-widget-content">More</div>
      </div>
    </div>
  </div>
</div>

我正在使用 FireFox 84(64 位 Linux)进行测试。如果我拖动一个药丸,它也会捕捉到点击。

【讨论】:

  • 我的应用程序中的其他东西一定会导致这个问题。我使用相同版本的 jq 和 jqUI,但即使我在没有 Vue.js 的情况下添加此代码,它的行为也会有所不同。没关系,我需要的其实很简单,所以我自己实现了一个简单的水平拖动,与Vue集成得更好,一切运行良好。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-31
  • 2010-10-09
相关资源
最近更新 更多