我正在尝试创建一个脚本(请参阅代码段)还原 element1
,当element2
时。
/>
我使用 jQuery drag
和drop
函数。
现在有一个Reset
按钮,可以重置所有元素。但是,我不喜欢这样
我不想重置所有元素。
相反,当element1
时,我希望element2
还原(反之亦然)。
以下是我希望恢复功能如何工作的图像(下面的项目符号描述了箭头):
element1
在放置区中拖放。element2
正在拖动。element1
你能帮帮我吗?
代码段:
element2

$("#element1, #element2").draggable({
revert: "invalid",
scroll: false
});
$("#drop").droppable({
drop: handleDropEvent,
accept: "#element1, #element2"
});
function handleDropEvent( event, ui ) {
var draggable = ui.draggable;
ui.draggable.position({ of:$(this), my:'center', at:'center' });
}
$("#Reset").click(function() {
$("#element1, #element2").animate({
"left": $("#element1, #element2").data("left"),
"top": $("#element1, #element2").data("top")
});
});
$("#element1, #element2").data("left", $("#element1, #element2").position().left).data("top", $("#element1, #element2").position().top);

#element1{
width: 50px;
height: 50px;
background-color: black;
}
#element2{
width: 50px;
height: 50px;
background-color: red;
}
#drop {
width: 50px;
height: 50px;
margin: 20px 0 0 200px;
background-color: green;
}

答案 0 :(得分:0)
基本上,以下代码(在drop:
处理程序中)可以解决这个问题:
$(".drop").droppable({
accept: /*other code*/
drop: function(event, ui) {
if ($(this).data("draggable")) {revertDraggables($(this).data("draggable"));}
$(this).data("draggable", "."+ui.draggable[0].className.substring(0,ui.draggable[0].className.indexOf("ui-")-1).replace(/ /g,".")); //store the draggable's classes as selector (first remove the standard ui-classes)
ui.draggable.position({of:this, my:"center", at:"center"});
}
}).data("draggable","");
data
属性"draggable"
中。ui.draggable[0].className
获取当前 draggable 的所有类名的字符串。className
是:"drop1 drag one ui-draggable ui-draggable-handle ui-draggable-dragging"
。.substring(0,className.indexOf("ui-")-1)
从className-string中的第一个字符开始substring到"ui-"
的{{3}},-1
同时删除空它前面的空间(" ui - "正如你所看到的,是所有ui类的前缀)。"drop1 drag one"
.replace(/ /g,".")
用点替换所有空格(使用first occurrence),因此className-string可以用作jQuery-selector。该行开头的"."+
也会在字符串的最开头加一个点
结果:".drop1.drag.one"
.data("draggable","")
只是设置data
属性。它与撰写$(".drop").data("draggable","");
相同,但现在它除外.droppable()
{ {3}}直接在function revertDraggables(selector) {
$(selector).animate({"left":$(selector).data("left"), "top":$(selector).data("top")});
}
$(".drag").draggable({
revert: "invalid",
scroll: false
}).data("left",$(".drag").position().left).data("top",$(".drag").position().top); //set draggables' position-data-attribute
$(".drop").droppable({
accept: function(draggable) {return draggable.hasClass(this.className.split(" ")[0]);}, //accept draggable if it has the same class as this droppable's first class
drop: function(event, ui) {
if ($(this).data("draggable")) {revertDraggables($(this).data("draggable"));} //revert previously dropped draggable
$(this).data("draggable", "."+ui.draggable[0].className.substring(0,ui.draggable[0].className.indexOf("ui-")-1).replace(/ /g,".")); //store the draggable's classes as selector (first remove the standard ui-classes)
ui.draggable.position({of:this, my:"center", at:"center"}); //position draggable on droppable
}
}).data("draggable","");
$(".reset").click(function() {
var group = this.className.split(" ")[0]; //store the group-identifying classname
revertDraggables(".drag."+group); //revert all draggables (belonging to this reset-button)
$(".drop."+group).data("draggable",""); //clear the droppable's draggable-data-attribute
});
。) 但我也改变了其他一些事情,请查看代码段:
.container {
display: inline-block;
position: relative;
margin: 0 20px;
}
.drag {width:50px; height:50px; z-index:1;}
.drag.one {background-color:black;}
.drag.two {background-color:red;}
.drop {
width: 60px;
height: 60px;
margin: 20px 0 0 0;
background-color: green;
}

<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<script src="https://code.jquery.com/ui/1.12.1/jquery-ui.min.js"></script>
<div class="container">
<div class="drop1 drag one"></div>
<div class="drop1 drag two"></div>
<div class="drop1 drop">Drop here</div>
<button type="button" class="drop1 reset" name="button">Reset</button>
</div>
<div class="container">
<div class="drop2 drag one"></div>
<div class="drop2 drag two"></div>
<div class="drop2 drop">Drop here</div>
<button type="button" class="drop2 reset" name="button">Reset</button>
</div>
&#13;
id="element1"
&#13;
$("#element1")
和class="drag one"
)更改为类选择器($(".drag")
和drop1
)。这使您的代码更加灵活,因为现在您不必在JS代码中添加每个可拖动元素。可放置元素也是如此
我还将CSS更改为类,使其更加灵活。 drop2
,<div class="container">
等。),因此您可以在一个页面上拥有多个拖放系统,而无需更新您的JS
您只需复制/粘贴drop1
并将this.className.split(" ")[0]
类更改为下一个免费号码。 "drop1 drop"
获取className-string(例如[0]
)并在其中创建一个数组,chained为空空间的值。然后,它接受该数组中的第一个值(在索引"drop1"
处),所以<div class="container">
。position:relative;
元素需要在CSS中使用z-index:1;
,以便 draggables 的定位能够正常工作。