Ich habe einige jQuery divs mit der Drop-Drop-Klasse "dropBox"; Ich möchte divs mit der Klasse "teamBox" akzeptieren, aber nur, wenn sie nicht bereits im Dropbox-Container "dropBox" existieren. Ich habe versucht, dies zu tun, indem Sie das Ereignis over
für die DropBox verwenden, aber festgestellt, dass überprüft, ob DropBox enthalten das ziehbare Element immer True zurückgegeben. Ich habe auch versucht, eine Bedingung in den accept
Teil der DropBox, aber ich hatte das gleiche Problem. Code für beide Versuche unten. Vielen Dank!jQuery Deny Draggable Elements bereits in Droppable
HTML
<div class="panel-heading">Teams</div>
<div class="panel-body teamContainer">
@foreach($teamContent as $teamID => $teamName)
<div id="{{ $teamID }}" class="teamBox">
<h5><b>{{ $teamName }}</b></h5>
</div>
@endforeach
</div>
<div class="panel-heading">Twitter</div>
<div class="panel-body">
@if(!empty($twitterContent))
@foreach($twitterContent as $twitterID => $screenName)
<span class="{{ $twitterID }}">
<h5>{{ '@' . $screenName }}</h5>
</span>
<div id="{{ $twitterID }}" class="dropBox"></div>
@endforeach
@endif
</div>
<div class="panel-heading">Facebook</div>
<div class="panel-body">
@if(!empty($facebookContent))
@foreach($facebookContent as $pageID => $pageName)
<span class="{{ $pageID }}">
<h5>{{ $pageName }}</h5>
</span>
<div id="{{ $pageID }}" class="dropBox"></div>
@endforeach
@endif
</div>
jQuery Versuch mit over
$(".teamBox").draggable({
helper: 'clone',
zIndex: 1,
});
$(".dropBox").droppable({
accept: '.teamBox',
over: function(event, ui) {
var draggable = ui.draggable;
var over = $(this);
if($(over).find($(draggable).attr('id')))
{
//Always logs as disabling
console.log("Disabling");
$(over).droppable('disable');
}
},
drop: function(event, ui) {
var dropped = ui.draggable;
var droppedOn = $(this);
$(this).append($(dropped).clone());
$(".dropBox .teamBox").addClass("item");
$(".item").removeClass("ui-draggable");
$(".item").draggable({
zIndex: 1,
});
}
});
jQuery Versuch mit accept
$(".teamBox").draggable({
helper: 'clone',
zIndex: 1,
});
$(".dropBox").droppable({
accept: function(draggable) {
if($(this).has($(draggable).attr('id'))) {
//Always returns false
console.log("Returning false");
return false;
}
return true;
},
drop: function(event, ui) {
var dropped = ui.draggable;
var droppedOn = $(this);
$(this).append($(dropped).clone());
$(".dropBox .teamBox").addClass("item");
$(".item").removeClass("ui-draggable");
$(".item").draggable({
zIndex: 1,
});
}
});
EDIT mit einem s kommen Ended up Lösung, die für mich funktioniert hat. Hier ist a Fiddle. Denken Sie daran, dass ich Laravel Spark verwende, also gibt es eine Laravel-Blade-Syntax innerhalb des HTML, die in der Fiddle nicht korrekt kompiliert wird. Wenn Sie sich jedoch den Code ansehen, erhalten Sie möglicherweise eine Vorstellung davon, wie Sie ein Drag-and-Drop-System mit dem Klonen und der Verweigerung doppelter ziehbarer Elemente erstellen können.
Danke für die Idee! Leider funktioniert es in dieser Situation nicht, da es viele Instanzen von .dropBox und .teamBox gibt. Allerdings wusste ich vorher noch nichts von der Zurücksetzung, also könnte mir das weiterhelfen. – HannahHunt
Wenn dies der Fall ist, weisen Sie dem ziehbaren Objekt ein Attribut oder eine Klasse zu, wenn es in abtropfbares Objekt eingefügt wird. Dadurch können Sie nach diesem Attribut oder Selektor suchen und bestimmen, ob es zurückgesetzt werden soll oder nicht. – Twisty
@HannahHunt Eine andere Idee wäre eine globale Variable, der "true" oder "false" zugewiesen wird, wenn ein Element in das Drop-Papier gezogen wird. Viele Möglichkeiten, dies zu tun. Am Ende müssen Sie nur eine Flagge an einem bestimmten Ort prüfen, um zu sehen, ob ein Artikel bereits existiert und zurückkehrt oder nicht. – Twisty