javascript - 为什么shopify可拖动事件开始:第一次后拖动停止工作
问题描述
我正在研究 Shopify 可拖动,我被困在 DOM 元素的特定部分的拖动中。
我需要实现的是我必须从我的盒子的特定(如下面的第 1 项)部分拖动,如下例所示。不需要从任何地方拖动。下面是一个例子和一张图片。
// HTML Code
<div class=cont>
<div class="grid">
<div class="block">
<div class="droppable"></div>
</div>
<div class="block">
<div class="droppable"></div>
</div>
</div>
</div>
</div>
<div class=block>
<center><h1>Drag Items To Drop Boxes</h1></center>
<ul id="myUL">
<li><a href="#">
<div id="id3" class="dragname">
<div class="handle">Item 1</div>
<div id="id3hide" class="hide2"><span id=3_Red onclick=return(toggleStripe('3','Red'));
class=3_class stripe='Red' style='background: rgba(0, 0, 0, 0) !important;'>R</span> |<span id=3_White onclick=return(toggleStripe('3','White')); class=3_class stripe='White' style='background: rgba(255, 0, 0, 0.3) !important;'>W</span> |<span id=3_Yellow onclick=return(toggleStripe('3','Yellow')); class=3_class stripe='Yellow' style='background: rgba(255, 0, 0, 0.3) !important;'>Y</span> |<span id=3_Orange onclick=return(toggleStripe('3','Orange')); class=3_class stripe='Orange' style='background: rgba(255, 0, 0, 0.3) !important;'>O</span> |<span id=3_Green onclick=return(toggleStripe('3','Green')); class=3_class stripe='Green' style='background: rgba(255, 0, 0, 0.3) !important;'>G</span> |<span id=3_Purple onclick=return(toggleStripe('3','Purple')); class=3_class stripe='Purple' style='background: rgba(255, 0, 0, 0.3) !important;'>P</span> |</div>
</div>
</a></li> <li><a href="#">
<div id="id4" class="dragname">
<div class="handle">Item 2</div>
<div id="id4hide" class="hide2"><span id=4_Red onclick=return(toggleStripe('4','Red')); class=4_class stripe='Red' style='background: rgba(0, 0, 0, 0) !important;'>R</span> |<span id=4_White onclick=return(toggleStripe('4','White')); class=4_class stripe='White' style='background: rgba(255, 0, 0, 0.3) !important;'>W</span> |<span id=4_Yellow onclick=return(toggleStripe('4','Yellow')); class=4_class stripe='Yellow' style='background: rgba(0, 0, 0, 0) !important;'>Y</span> |<span id=4_Orange onclick=return(toggleStripe('4','Orange')); class=4_class stripe='Orange' style='background: rgba(0, 0, 0, 0) !important;'>O</span> |<span id=4_Green onclick=return(toggleStripe('4','Green')); class=4_class stripe='Green' style='background: rgba(0, 0, 0, 0) !important;'>G</span> |<span id=4_Purple onclick=return(toggleStripe('4','Purple')); class=4_class stripe='Purple' style='background: rgba(255, 0, 0, 0.3) !important;'>P</span> |</div>
</div>
</a></li>
</ul>
</div>
Javascript 代码如下。
<script type="text/javascript">
const containers = document.querySelectorAll('.block');
const draggable = new Draggable.Droppable(containers, {
// containment: "parent",
// draggable: '.draggable',
draggable: '.dragname',
droppable: '.droppable'
});
draggable.on('drag:start', (event) => {
//console.log(`Picked up ${event.source.textContent.trim() || event.source.id || 'draggable element'}`);
var currentTarget = event.originalEvent.target.className;
console.log("curr = >",currentTarget);
if (currentTarget != 'handle') {
event.cancel();
}
// document.addEventListener("dragstart", triggerMouseUpOnESC(event));
});
const triggerMouseUpOnESC = (evt) => {
var ent = evt.originalEvent.target.className;
if (ent !== 'handle') {
evt.cancel();
}
};
</script>
如果您检查drag:start函数,当我们开始拖动并将其与元素类进行比较时,它将显示我正在获取类名。如果类匹配,则事件不应取消。如果类不匹配,则事件应取消。
解决方案
你可以试试这个片段,将“Item 1”或“Item 2”拖到droppables。您似乎忘记添加该dropzone
选项。顺便说一句,该handle
选项将帮助您更轻松地设置句柄。
const containers = document.querySelectorAll(".block");
const draggable = new Draggable.Droppable(containers, {
draggable: ".dragname",
dropzone: ".droppable",
handle: ".handle",
});
<div class="cont">
<div class="grid">
<div class="block">
<div class="droppable">droppable1</div>
</div>
<div class="block">
<div class="droppable">droppable2</div>
</div>
</div>
</div>
<h1>Drag Items To Drop Boxes</h1>
<ul id="myUL" class="block">
<li class="droppable">
<a href="#">
<div id="id3" class="dragname">
<div class="handle">Item 1</div>
<div id="id3hide" class="hide2">
<span
id="3_Red"
class="3_class"
stripe="Red"
style="background: rgba(0, 0, 0, 0) !important"
>R</span
>
|<span
id="3_White"
onclick
class="3_class"
stripe="White"
style="background: rgba(255, 0, 0, 0.3) !important"
>W</span
>
|<span
id="3_Yellow"
onclick
class="3_class"
stripe="Yellow"
style="background: rgba(255, 0, 0, 0.3) !important"
>Y</span
>
|<span
id="3_Orange"
onclick
class="3_class"
stripe="Orange"
style="background: rgba(255, 0, 0, 0.3) !important"
>O</span
>
|<span
id="3_Green"
onclick
class="3_class"
stripe="Green"
style="background: rgba(255, 0, 0, 0.3) !important"
>G</span
>
|<span
id="3_Purple"
onclick
class="3_class"
stripe="Purple"
style="background: rgba(255, 0, 0, 0.3) !important"
>P</span
>
|
</div>
</div>
</a>
</li>
<li class="droppable">
<a href="#">
<div id="id4" class="dragname">
<div class="handle">Item 2</div>
<div id="id4hide" class="hide2">
<span
id="4_Red"
class="4_class"
stripe="Red"
style="background: rgba(0, 0, 0, 0) !important"
>R</span
>
|<span
id="4_White"
onclick
class="4_class"
stripe="White"
style="background: rgba(255, 0, 0, 0.3) !important"
>W</span
>
|<span
id="4_Yellow"
onclick
class="4_class"
stripe="Yellow"
style="background: rgba(0, 0, 0, 0) !important"
>Y</span
>
|<span
id="4_Orange"
onclick
class="4_class"
stripe="Orange"
style="background: rgba(0, 0, 0, 0) !important"
>O</span
>
|<span
id="4_Green"
onclick
class="4_class"
stripe="Green"
style="background: rgba(0, 0, 0, 0) !important"
>G</span
>
|<span
id="4_Purple"
onclick
class="4_class"
stripe="Purple"
style="background: rgba(255, 0, 0, 0.3) !important"
>P</span
>
|
</div>
</div>
</a>
</li>
</ul>
<script src="https://cdn.jsdelivr.net/npm/@shopify/draggable@1.0.0-beta.12/lib/draggable.bundle.js"></script>
推荐阅读
- php - 尝试使用 PHP 返回 json 数据
- javascript - 调用`event.preventDefault`时我做错了什么?
- python - Heroku 上的 Scrapy 爬虫返回 503 服务不可用
- c - -2^31 作为最小整数,为什么?
- c# - 导出 Excel 报表服务器时,现有连接被远程主机强行关闭
- python - 从 PyTorch 中的网络输出计算梯度会出错
- svg - 为什么渲染一组 svg 与一个 svg 不同?
- python - 如何在 python 3.6 中使用分布式包?
- java - 在 Android 5 中支持 JAVA-8 Jar - React Native
- javascript - 设置超时后InnerText闪烁