jQuery 可拖动 - 通过单击开始拖动元素,无需按住鼠标
jQuery Draggable - Start dragging element by clicking on it, without holding the mouse
考虑一个基本的 jQuery 可拖动元素。有什么方法可以通过单击鼠标开始拖动元素吗? (即当元素被点击时,进入拖拽状态,开始跟随鼠标,再次点击时,它会落在原处)
如果jQuery无法实现,是否可以通过任何其他第三方拖动库实现?
您可以通过触发 mousedown
和 mouseup
以实现可拖动点击事件,以一种 hack 方法来做到这一点。
参考:How to programmatically invoke jQuery UI Draggable drag start?
引用 fuzzyBSc
的答案
考虑以下代码。
$(function() {
// Example: https://jqueryui.com/draggable/#events
var $start_counter = $("#event-start"),
$drag_counter = $("#event-drag"),
$stop_counter = $("#event-stop"),
counts = [0, 0, 0];
function updateCounterStatus($event_counter, new_count) {
// first update the status visually...
if (!$event_counter.hasClass("ui-state-hover")) {
$event_counter.addClass("ui-state-hover")
.siblings().removeClass("ui-state-hover");
}
// ...then update the numbers
$("span.count", $event_counter).text(new_count);
}
// Helper Functions
function makeDrag(obj) {
obj.draggable({
start: function(e, ui) {
counts[0]++;
updateCounterStatus($start_counter, counts[0]);
},
drag: function() {
counts[1]++;
updateCounterStatus($drag_counter, counts[1]);
},
stop: function() {
counts[2]++;
updateCounterStatus($stop_counter, counts[2]);
}
});
}
function stopDrag(obj) {
obj.draggable("destroy");
}
// Custom Click Event to trigger Drag
$("#draggable").click(function(e) {
if ($(this).hasClass("dragging")) {
$(this).removeClass("dragging");
e.type = "mouseup.draggable";
e.target = this;
$(this).trigger(e);
stopDrag($(this));
} else {
$(this).addClass("dragging");
makeDrag($(this));
e.type = "mousedown.draggable";
e.target = this;
$(this).trigger(e);
}
});
});
#draggable {
width: 16em;
padding: 0 1em;
}
#draggable ul li {
margin: 1em 0;
padding: 0.5em 0;
}
* html #draggable ul li {
height: 1%;
}
#draggable ul li span.ui-icon {
float: left;
}
#draggable ul li span.count {
font-weight: bold;
}
<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 id="draggable" class="ui-widget ui-widget-content">
<p>Drag me to trigger the chain of events.</p>
<ul class="ui-helper-reset">
<li id="event-start" class="ui-state-default ui-corner-all"><span class="ui-icon ui-icon-play"></span>"start" invoked <span class="count">0</span>x</li>
<li id="event-drag" class="ui-state-default ui-corner-all"><span class="ui-icon ui-icon-arrow-4"></span>"drag" invoked <span class="count">0</span>x</li>
<li id="event-stop" class="ui-state-default ui-corner-all"><span class="ui-icon ui-icon-stop"></span>"stop" invoked <span class="count">0</span>x</li>
</ul>
</div>
如您所见,我使用 https://jqueryui.com/draggable/#events 中的事件示例作为基本代码。我使用它是因为它显示事件何时被触发。
首先,我们将使用click
事件来触发拖动的开始和停止。为了帮助识别这一点,我添加了一个 class dragging
以便我们可以确定目标的状态。
在初始点击时,dragging
不存在,我们将在点击事件中触发可拖动的 mousedown
事件。现在,无需按住鼠标按钮,我们就可以移动鼠标,目标元素将随之移动。再次单击以触发可拖动的 mouseup
事件。
我认为这适用于大多数情况。我不知道移动设备如何处理此问题,因为没有 mousemove
类型的事件。
希望这对您有所帮助。
考虑一个基本的 jQuery 可拖动元素。有什么方法可以通过单击鼠标开始拖动元素吗? (即当元素被点击时,进入拖拽状态,开始跟随鼠标,再次点击时,它会落在原处)
如果jQuery无法实现,是否可以通过任何其他第三方拖动库实现?
您可以通过触发 mousedown
和 mouseup
以实现可拖动点击事件,以一种 hack 方法来做到这一点。
参考:How to programmatically invoke jQuery UI Draggable drag start?
引用 fuzzyBSc
的答案考虑以下代码。
$(function() {
// Example: https://jqueryui.com/draggable/#events
var $start_counter = $("#event-start"),
$drag_counter = $("#event-drag"),
$stop_counter = $("#event-stop"),
counts = [0, 0, 0];
function updateCounterStatus($event_counter, new_count) {
// first update the status visually...
if (!$event_counter.hasClass("ui-state-hover")) {
$event_counter.addClass("ui-state-hover")
.siblings().removeClass("ui-state-hover");
}
// ...then update the numbers
$("span.count", $event_counter).text(new_count);
}
// Helper Functions
function makeDrag(obj) {
obj.draggable({
start: function(e, ui) {
counts[0]++;
updateCounterStatus($start_counter, counts[0]);
},
drag: function() {
counts[1]++;
updateCounterStatus($drag_counter, counts[1]);
},
stop: function() {
counts[2]++;
updateCounterStatus($stop_counter, counts[2]);
}
});
}
function stopDrag(obj) {
obj.draggable("destroy");
}
// Custom Click Event to trigger Drag
$("#draggable").click(function(e) {
if ($(this).hasClass("dragging")) {
$(this).removeClass("dragging");
e.type = "mouseup.draggable";
e.target = this;
$(this).trigger(e);
stopDrag($(this));
} else {
$(this).addClass("dragging");
makeDrag($(this));
e.type = "mousedown.draggable";
e.target = this;
$(this).trigger(e);
}
});
});
#draggable {
width: 16em;
padding: 0 1em;
}
#draggable ul li {
margin: 1em 0;
padding: 0.5em 0;
}
* html #draggable ul li {
height: 1%;
}
#draggable ul li span.ui-icon {
float: left;
}
#draggable ul li span.count {
font-weight: bold;
}
<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 id="draggable" class="ui-widget ui-widget-content">
<p>Drag me to trigger the chain of events.</p>
<ul class="ui-helper-reset">
<li id="event-start" class="ui-state-default ui-corner-all"><span class="ui-icon ui-icon-play"></span>"start" invoked <span class="count">0</span>x</li>
<li id="event-drag" class="ui-state-default ui-corner-all"><span class="ui-icon ui-icon-arrow-4"></span>"drag" invoked <span class="count">0</span>x</li>
<li id="event-stop" class="ui-state-default ui-corner-all"><span class="ui-icon ui-icon-stop"></span>"stop" invoked <span class="count">0</span>x</li>
</ul>
</div>
如您所见,我使用 https://jqueryui.com/draggable/#events 中的事件示例作为基本代码。我使用它是因为它显示事件何时被触发。
首先,我们将使用click
事件来触发拖动的开始和停止。为了帮助识别这一点,我添加了一个 class dragging
以便我们可以确定目标的状态。
在初始点击时,dragging
不存在,我们将在点击事件中触发可拖动的 mousedown
事件。现在,无需按住鼠标按钮,我们就可以移动鼠标,目标元素将随之移动。再次单击以触发可拖动的 mouseup
事件。
我认为这适用于大多数情况。我不知道移动设备如何处理此问题,因为没有 mousemove
类型的事件。
希望这对您有所帮助。