2016-07-21 12 views
0

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.

Antwort

0

Ich würde versuchen, dies in draggablerevert mit:

$(".teamBox").draggable({ 
    helper: 'clone', 
    zIndex: 1, 
    revert: function(){ 
     return $(".dropBox .teamBox").length ? true : false; 
    } 
}); 

Referenz: http://api.jqueryui.com/draggable/#option-revert

Ob das Element in seine Startposition zurückkehren soll, wenn Stopps ziehen.

Funktion: Eine Funktion zur Bestimmung, ob das Element in seine Startposition zurückkehren soll. Die Funktion muss true zurückgeben, um das Element zurückzusetzen.

+0

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

+0

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

+0

@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

Verwandte Themen