简体   繁体   English

jQuery:完成拖动而不触发click事件

[英]jQuery: Finish dragging without triggering click event

I am trying to set up the following page where: 我正在尝试设置以下页面:

  1. If you click the button, you can see a div. 如果单击该按钮,则可以看到div。
  2. If you click the div, you can see the next div. 如果单击div,则可以看到下一个div。
  3. If you move the button, there is no »click« (desired behaviour) 如果您移动按钮,则没有“单击”(所需行为)

The problem I am having is that if you move the div, the next div appears - this is not what I want. 我遇到的问题是,如果你移动div,下一个div出现 - 这不是我想要的。 The "next div" should not be displayed after a drag event finishes on it. 拖动事件完成后,不应显示“下一个div”。

Here is my code: 这是我的代码:

 $(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> 

Is there a way to solve this? 有办法解决这个问题吗? :) :)
(a possible problem is also that pure JavaScript is mixed with jQuery) (一个可能的问题是纯JavaScript与jQuery混合)
Thanks 谢谢

The main problem to solve here is in distinguishing a regular click event on #content , from other "click like events" that are also triggered during completion of the element being dragged. 这里要解决的主要问题是区分#content上的常规click事件,以及在拖动元素完成期间也触发的其他“点击事件”。

You're code currently has a method of doing that which you could re purpose for the desired behaviour: 您的代码目前有一种方法可以实现所需的行为:

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

So in the case of your code, you could revise it as follows: 因此,对于您的代码,您可以按如下方式对其进行修改:

 $(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> 

Actually, all you need is this bit of readable code, 实际上,你需要的只是这段可读代码,

  • Assign a class .draggable to all your draggable elements 为所有可拖动元素指定一个类.draggable
  • Use the new class as stack: '.draggable' 将新类用作stack: '.draggable'
  • Register click to your '#container' , not on your .trip elements 注册点击你的'#container' ,而不是你的.trip元素
  • Use only one Event, the "click" one: 只使用一个事件,即"click"一个:
  • Hide all .trip but first using CSS .trip~.trip {display:none;} 隐藏所有.trip但首先使用CSS .trip~.trip {display:none;}

 jQuery( $ => { const $cont = $('#content'); const $bttn = $('#button'); const $trip = $('.trip'); const tripL = $trip.length; let i = 0; $('.draggable').draggable({stack:'div', containment:'body'}); $bttn.on('click', function() { if (!$(this).hasClass('ui-draggable-dragging')) $cont.toggle(); }); $cont.on('click', function() { $trip.eq(++i % tripL).show().siblings($trip).hide(); }); }); 
 html, body { height:100%; margin:0;} body { 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; } .trip ~ .trip {display: none;} 
 <!-- PS: Add class="draggable" to draggable elements --> <div id="button" class="draggable">Button</div> <div id="content" class="draggable"> <div class="trip" id="a">div 1</div> <div class="trip" id="b">div 2</div> <div class="trip" id="c">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> 

EDIT 编辑

For more contents see this answer: https://stackoverflow.com/a/57351517/383904 有关更多内容,请参阅以下答案: https//stackoverflow.com/a/57351517/383904

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM