Javascript 拖放后如何添加和删除对象类?
我正在运行以下html:Javascript 拖放后如何添加和删除对象类?,javascript,jquery,Javascript,Jquery,我正在运行以下html: <div class="container"> <div class="row"> <div class="col"> <div class="row"> <div class="col"> <div id="container1"> <div class="resizeDiv col-6"></d
<div class="container">
<div class="row">
<div class="col">
<div class="row">
<div class="col">
<div id="container1">
<div class="resizeDiv col-6"></div>
<div class="resizeDiv col-6"></div>
</div>
</div>
<div class="col">
<div id="container2"></div>
</div>
</div>
</div>
</div>
</div>
当我删除
一个元素并单击它时,它的类
从col-6
更改为col
,但是当我删除第二个项目时,单击
上的切换类
仅对第二个添加的项目有效,而不是对第一个添加的项目有效
这里是一个示例,尝试将一个项目添加到第二个容器中并单击它,然后放下第二个项目并尝试单击它们
注意
理想情况下,我希望无需单击即可自动调整大小。我找到的解决方案是使用:
e.stopImmediatePropagation();
最终js代码
var currentParent;
$(".resizeDiv").draggable({
revert: 'invalid',
containment: "#container2",
start: function(){
currentParent = $(this).parent().attr('id');
}
});
$('#container1, #container2').droppable({
accept:'.resizeDiv',
drop: function(event,ui) {
if (currentParent != $(this).attr('id')) {
$(ui.draggable).appendTo($(this)).removeAttr('style');
}
$(this).find("div").on("click", function(e){
e.stopImmediatePropagation();
if($(this).hasClass("col-6")) {
$(this).css("background-color", "red");
$(this).removeClass("col-6").addClass("col");
} else {
$(this).css("background-color", "yellow");
$(this).removeClass("col").addClass("col-6");
}
});
}
});
注意
然而,如果el
被放在另一个旁边,我仍然在尝试自动调整大小。你的问题是这个
$(this).find("div").on("click", function(){
if($(this).hasClass("col-6")) {
$(this).removeClass("col-6").addClass("col");
} else {
$(this).removeClass("col").addClass("col-6");
}
});
这样做的目的是,每次您删除一个元素时,它都会遍历该容器中的所有div。这意味着您已经设置了单击处理程序,因此当您删除第二个项目时,第一个div将获得第二个单击处理程序。如果你掉了三分之一,就会得到三分之一,以此类推
因此,当您单击第一个回调时,实际上是触发了其中两个回调,并且该类在第一个回调中被添加,在第二个回调中被删除
由于ui.draggable
引用了被拖动的元素,因此使用该元素作为添加单击处理程序的引用
$(ui.draggable).on("click",function(){
let $this = $(this);
if($this.hasClass("col-6")) {
$this.removeClass("col-6").addClass("col");
} else {
$this.removeClass("col").addClass("col-6");
}
//note instead of doing the if else and removeClass().addClass()
//calls you could just do toggleClass('col-6 col')
//it will toggle one off and the other on
$this.toggleClass('col-6 col');
});
相反,如果您想摆脱click处理程序,只想直接添加类,那么在ui.draggable
$this = $(this);
$draggable = $(ui.draggable);
if (currentParent != $this.attr('id')) {
$draggable.appendTo($this).removeAttr('style').toggleClass('col-6 col');
}
还要注意,我正在存储jQuery对象。如果要多次使用$(this)
或$(ui.draggable)
之类的内容,最好将其存储在变量中并使用它,而不是多次调用jQuery()
$this = $(this);
$draggable = $(ui.draggable);
if (currentParent != $this.attr('id')) {
$draggable.appendTo($this).removeAttr('style').toggleClass('col-6 col');
}