javascript - jQuery:完成拖动而不触发点击事件

标签 javascript jquery draggable clickable

我正在尝试在以下位置设置以下页面:

  1. 如果单击该按钮,您可以看到一个 div。
  2. 如果单击该 div,您可以看到下一个 div。
  3. 如果您移动按钮,则没有 »click«(期望的行为)

我遇到的问题是,如果您移动 div,就会出现下一个 div - 这不是我想要的。 “下一个 div”不应在拖动事件完成后显示。

这是我的代码:

$(function() {
  $("#button").draggable({
    stack: 'div',
    containment: "body"
  });
});

$('#button').on('mouseup', function() {
  if (!$(this).hasClass('ui-draggable-dragging')) {
    // click function
    $("#content").toggle();
  }
});

$(function() {
  $("#content").draggable({
    stack: 'div',
    containment: "body"
  });
});

let containers = $('.trip').hide();
let firstContainer = containers.first().show();

containers.on('click', function() {
  //Get current element and next sibling
  let elem = $(this);
  let next = elem.next('.trip');

  //Does sibling exist?
  if (next.length) {
    next.show();
  } else {
    firstContainer.show();
  }
  elem.hide();
});
body {
  width: 100vw;
  height: 100vh;
  padding: 0;
  margin: 0;
  left: 0;
  top: 0;
  background-color: grey;
}

#button {
  width: 100px;
  height: 100px;
  background-color: cyan;
}

#content {
  display: none;
  cursor: all-scroll;
  top: 10%;
  left: 10%;
  position: absolute;
}

.trip {
  width: 200px;
  height: 200px;
  background-color: blue;
  color: white;
}
<div id="button">Button</div>

<div id="content">
  <div class="trip">div 1</div>
  <div class="trip">div 2</div>
  <div class="trip">div 3</div>
</div>

<script src="https://code.jquery.com/jquery-1.7.2.min.js"></script>
<script src="https://code.jquery.com/ui/1.8.21/jquery-ui.min.js"></script>
<script src="https://raw.githubusercontent.com/furf/jquery-ui-touch-punch/master/jquery.ui.touch-punch.min.js"></script>

有办法解决吗? :)
(一个可能的问题是纯 JavaScript 和 jQuery 混在一起)
谢谢

最佳答案

这里要解决的主要问题是将 #content 上的常规 click 事件与在元素完成期间触发的其他“类点击事件”区分开来被拖着。

你的代码目前有一种方法可以实现你想要的行为:

if (! $(this).hasClass('ui-draggable-dragging')) {
   /* This was a "regular click event"
}

因此对于您的代码,您可以按如下方式修改它:

$(function() {

  /* Combine on ready logic into one place */

  $("#button").draggable({
    stack: 'div',
    containment: "body"
  });
  
  $("#content").draggable({
    stack: 'div',
    containment: "body"
  });
  
  /* Hide all trip elements except for first */
  $('.trip', '#content').not(':first').hide();
});

$('#button').on('mouseup', function() {
  if (!$(this).hasClass('ui-draggable-dragging')) {
    $("#content").toggle();
  }
});

$('#content').on('mouseup', function() {

  /* Reuse same logic in #button mouseup handler */
  if (!$(this).hasClass('ui-draggable-dragging')) {

      /* 
      If content element if not dragging, treat mouse up as conclusion
      of click event and rotate visibility of trip elements like this
      */
      let trip = $('.trip:visible', '#content');
      let next = trip.next().length === 0 ? 
          $('.trip:first', '#content') : trip.next();
      
      trip.hide();
      next.show(); 
  }
});
body {
  width: 100vw;
  height: 100vh;
  padding: 0;
  margin: 0;
  left: 0;
  top: 0;
  background-color: grey;
}

#button {
  width: 100px;
  height: 100px;
  background-color: cyan;
}

#content {
  display: none;
  cursor: all-scroll;
  top: 10%;
  left: 10%;
  position: absolute;
}

.trip {
  width: 200px;
  height: 200px;
  background-color: blue;
  color: white;
}
<div id="button">Button</div>

<div id="content">
  <div class="trip">div 1</div>
  <div class="trip">div 2</div>
  <div class="trip">div 3</div>
</div>

<script src="https://code.jquery.com/jquery-1.7.2.min.js"></script>
<script src="https://code.jquery.com/ui/1.8.21/jquery-ui.min.js"></script>
<script src="https://raw.githubusercontent.com/furf/jquery-ui-touch-punch/master/jquery.ui.touch-punch.min.js"></script>

关于javascript - jQuery:完成拖动而不触发点击事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57350862/

相关文章:

javascript - 如何真正清除 PWA 中的缓存

javascript - 如果使用 jquery 启用了 javascript,则防止触发默认表单提交事件

javascript - 选中所有复选框,如果选中一项则反转

javascript - jquery 动画中的 child 的 child 保持不动

C# 在 Canvas 中拖放多个图像

jquery - 如何防止可调整大小和可拖动元素相互折叠?

javascript - Canvas - 使 Canvas 中的圆在特定时间向下移动

javascript - 将数组值推送到对象值

jquery - 为什么 JQuery.getJSON() 有 success 和 did 函数?

javascript - jQuery UI - 在移动事件或恢复完成后调用函数