[英]jQuery: Finish dragging without triggering click event
I am trying to set up the following page where: 我正在尝试设置以下页面:
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, 实际上,你需要的只是这段可读代码,
.draggable
to all your draggable elements .draggable
stack: '.draggable'
stack: '.draggable'
'#container'
, not on your .trip
elements '#container'
,而不是你的.trip
元素 "click"
one: "click"
一个: .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.