2015-04-15 11 views
5

Ciao amici my stackoverflow. Oggi ho alcuni problemi e ho bisogno del tuo aiuto per risolverli. Se puoi aiutare con qualcosa, sarebbe molto apprezzato! Perché ho veramente bisogno di finire questo progetto.

JSFiddle: https://jsfiddle.net/rdxmmobe/1/

Questo è lo script:Drag and drop problemi di posizionamento + aggiornamento dell'id

<script type="text/javascript"> 
$(function(){ 
$(".DraggedItem").draggable({ 
     helper:'clone', 
     cursor:'move', 
     opacity: 0.7 
}); 

$('#rang1').droppable({ 
    drop: function(ev, ui) { 
     $('#rang1input').val($(ui.draggable).attr('id')); 
     var dropped = ui.draggable; 
     var droppedOn = $(this); 
     $(dropped).detach().css({top: 0,left: 0}).appendTo(droppedOn); 
    } 
}); 

$('#rang2').droppable({ 
    drop: function(ev, ui) { 
     $('#rang2input').val($(ui.draggable).attr('id')); 
     var dropped = ui.draggable; 
     var droppedOn = $(this); 
     $(dropped).detach().css({top: 0,left: 0}).appendTo(droppedOn); 
    } 
}); 

$('#rang3').droppable({ 
    drop: function(ev, ui) { 
     $('#rang3input').val($(ui.draggable).attr('id')); 
     var dropped = ui.draggable; 
     var droppedOn = $(this); 
     $(dropped).detach().css({top: 0,left: 0}).appendTo(droppedOn); 
    } 
}); 

$('#rang4').droppable({ 
    drop: function(ev, ui) { 
     $('#rang4input').val($(ui.draggable).attr('id')); 
     var dropped = ui.draggable; 
     var droppedOn = $(this); 
     $(dropped).detach().css({top: 0,left: 0}).appendTo(droppedOn); 
    } 
}); 

$('#rang5').droppable({ 
    drop: function(ev, ui) { 
     $('#rang5input').val($(ui.draggable).attr('id')); 
     var dropped = ui.draggable; 
     var droppedOn = $(this); 
     $(dropped).detach().css({top: 0,left: 0}).appendTo(droppedOn); 
    } 
}); 

$('#rang6').droppable({ 
    drop: function(ev, ui) { 
     $('#rang6input').val($(ui.draggable).attr('id')); 
     var dropped = ui.draggable; 
     var droppedOn = $(this); 
     $(dropped).detach().css({top: 0,left: 0}).appendTo(droppedOn); 
    } 
}); 

$('#rang7').droppable({ 
    drop: function(ev, ui) { 
     $('#rang7input').val($(ui.draggable).attr('id')); 
     var dropped = ui.draggable; 
     var droppedOn = $(this); 
     $(dropped).detach().css({top: 0,left: 0}).appendTo(droppedOn); 
    } 
}); 
}); 
</script> 


Questi sono i 7 div droppable (in cui è possibile rilasciare le immagini):

<form action="<?php echo $_SERVER["PHP_SELF"] ?>" method="POST"> 
<input type="hidden" value="<?php echo $row["IDBewoner"] ?>" name="bewoner"> 
<td> 
    <div id="rang1"></div> 
    <input type="hidden" value="" id="rang1input" name="rang1value"> 
</td> 
<td> 
    <div id="rang2"></div> 
    <input type="hidden" value="" id="rang2input" name="rang2value"> 
</td> 
<td> 
    <div id="rang3"></div> 
    <input type="hidden" value="" id="rang3input" name="rang3value"> 
</td> 
<td> 
    <div id="rang4"></div> 
    <input type="hidden" value="" id="rang4input" name="rang4value"> 
</td> 
<td> 
    <div id="rang5"></div> 
    <input type="hidden" value="" id="rang5input" name="rang5value"> 
</td> 
<td> 
    <div id="rang6"></div> 
    <input type="hidden" value="" id="rang6input" name="rang6value"> 
</td> 
<td> 
    <div id="rang7"></div> 
    <input type="hidden" value="" id="rang7input" name="rang7value"> 
</td> 
<input type="submit" value="Save"> 
</form> 


E queste sono le immagini trascinabili (immagini che puoi trascinare) vengono da fr om un database e hanno diverse id:

<td> <?php echo "<img class='DraggedItem' id='".$row["IDPictogram"]."' src='data:image/jpeg;base64,".base64_encode($row['Pictogram'])."' width='90' height='90' draggable='true'>"; ?> </td> 


Questo è il codice php:

if($_SERVER["REQUEST_METHOD"] == "POST") { 
$rang1 = $_POST["rang1value"]; 
$rang2 = $_POST["rang2value"]; 
$rang3 = $_POST["rang3value"]; 
$rang4 = $_POST["rang4value"]; 
$rang5 = $_POST["rang5value"]; 
$rang6 = $_POST["rang6value"]; 
$rang7 = $_POST["rang7value"]; 
$bewonerID = $_POST["bewoner"]; 

echo "<script>alert('Rang1: $rang1')</script>"; 
echo "<script>alert('Rang2: $rang2')</script>"; 
echo "<script>alert('Rang3: $rang3')</script>"; 
echo "<script>alert('Rang4: $rang4')</script>"; 
echo "<script>alert('Rang5: $rang5')</script>"; 
echo "<script>alert('Rang6: $rang6')</script>"; 
echo "<script>alert('Rang7: $rang7')</script>"; 
} 


Primo problema: come si può vedere nel mio script di cui sopra ho usato " helper: "clone" "ma le immagini
con la classe" .DraggedItem "vengono spostate e questo non è il punto. Le immagini dovrebbero essere spostate e sostituite tra le 7 div. Ma essi dovrebbero essere clonato dalla lista originale (modo da poter utilizzare la stessa icona due volte per esempio)

Secondo problema: Ho un input nascosto per ogni div e devono contenere l'id del
immagine caduto così posso inserirli in un database. Diciamo che ho lasciato cadere un'immagine su Div1 (# rang1) e poi ho spostato l'immagine su Div4 (# rang4), l'id dell'immagine rimane nell'input nascosto di Div1 e non viene cancellata/aggiornata. Come posso assicurarmi che l'ID venga aggiornato anche quando rilascio una nuova immagine sul div?
Terzo problema: come posso fare un controllo quando faccio cadere un'immagine dalla lista principale, che se c'è già un'immagine, la vecchia immagine viene cancellata e sostituita dalla nuova?
enter image description here

Quarto problema: qual è il modo migliore per passare da 2 immagini?
enter image description here


Se mi potete aiutare con qualsiasi di questi problemi sarebbe molto apprezzato !! Non posso andare oltre senza risolvere questi problemi e ho davvero bisogno di aiuto da parte di esperti.

+0

Costruire un jsFiddle per testare. Stai cercando di trascinare un clone in uno dei 7 punti? http://jqueryui.com/draggable/#snap-to – Twisty

+0

@Twisty Creerò un esempio in jsFiddle, aspetto i pls :) –

+0

@Twisty Ho aggiornato la domanda. Vedrai una demo sopra la domanda. –

risposta

2

Vorrei iniziare con il refactoring del codice per eliminare tutto il codice copia-incolla. I file Droppable possono essere inizializzati con una singola chiamata, facendo riferimento a ciascun input all'interno del callback come $(this).next('input').

Successivamente, non clonerò le immagini direttamente nei campi trascinati per evitare la duplicazione dell'ID. Creo nuovi elementi immagine con una classe diversa all'interno degli slot, in quanto devono comportarsi in modo diverso quando spostati tra le slot, nel mio esempio senza un helper traslucido.

Quindi nel mio esempio, si dispone delle immagini DraggedItem senza modifiche. Ho aggiunto la classe DropZone a ogni slot trascinabile per consentire l'inizializzazione con una singola chiamata.

Quando un'immagine viene rilasciata, controllo da dove proviene. Se proviene dalla libreria, crea un nuovo elemento immagine, imposta il suo src in modo che corrisponda all'originale e imposta l'attributo dei dati data-id sull'ID dell'oggetto originale per tenere traccia se necessario. Come passaggio finale, aggiungo una classe DroppedItem e ne faccio un altro tipo di draggable senza un helper.

Se l'articolo rilasciato è DroppedItem, ovvero proviene da uno slot diverso, è sufficiente scambiare il contenuto dei contenitori con i valori di casella input corrispondenti.

HTML

<table> 
    <tr> 
     <td> 
      <div id="rang1" class="DropZone"></div> 
      <input type="text" value="" id="rang1input" name="rang1value" /> 
     </td> 
     <td> 
      <div id="rang2" class="DropZone"></div> 
      <input type="text" value="" id="rang2input" name="rang2value" /> 
     </td> 
     <td> 
      <div id="rang3" class="DropZone"></div> 
      <input type="text" value="" id="rang3input" name="rang3value" /> 
     </td> 
     <td> 
      <div id="rang4" class="DropZone"></div> 
      <input type="text" value="" id="rang4input" name="rang4value" /> 
     </td> 
     <td> 
      <div id="rang5" class="DropZone"></div> 
      <input type="text" value="" id="rang5input" name="rang5value" /> 
     </td> 
     <td> 
      <div id="rang6" class="DropZone"></div> 
      <input type="text" value="" id="rang6input" name="rang6value" /> 
     </td> 
     <td> 
      <div id="rang7" class="DropZone"></div> 
      <input type="text" value="" id="rang7input" name="rang7value" /> 
     </td> 
    </tr> 
</table> 
<img id="img1" class="DraggedItem" src="http://dummyimage.com/50x50/000/fff&text=1" /> 
<img id="img2" class="DraggedItem" src="http://dummyimage.com/50x50/000/fff&text=2" /> 
<img id="img3" class="DraggedItem" src="http://dummyimage.com/50x50/000/fff&text=3" /> 
<img id="img4" class="DraggedItem" src="http://dummyimage.com/50x50/000/fff&text=4" /> 
<img id="img5" class="DraggedItem" src="http://dummyimage.com/50x50/000/fff&text=5" /> 
<img id="img6" class="DraggedItem" src="http://dummyimage.com/50x50/000/fff&text=6" /> 
<img id="img7" class="DraggedItem" src="http://dummyimage.com/50x50/000/fff&text=7" /> 

CSS

table { margin-bottom: 50px; } 
td div { width: 50px; height: 50px; border:1px solid silver; margin-bottom: 10px;} 
td input { width: 50px; } 

JavaScript

$('.DraggedItem').draggable({ 
    helper: 'clone', 
    cursor:'move', 
    opacity: 0.7 
}); 

var droppedOptions = { 
    revert: 'invalid', 
    cursor: 'move' 
}; 

$('.DropZone').droppable({ 
    drop: function(ev, ui) { 
     var dropped = ui.draggable; 
     var droppedOn = $(this); 

     if(ui.draggable.is('.DroppedItem')) { 
      // Item is dragged from another slot, swap images 

      var draggedFrom = ui.draggable.parent(); 
      droppedOn.find('img').appendTo(draggedFrom); 
      dropped.css({ top:0, left:0 }).appendTo(droppedOn); 

      var temp = '' + droppedOn.next('input').val(); 
      draggedFrom.next('input').val(temp); 
      droppedOn.next('input').val(dropped.data('id')); 
     } else { 
      // Item is dragged from library 

      droppedOn 
       .empty() // Delete already dropped items 
       .next('input') 
        .val(dropped.attr('id')); 

      $('<img class="DroppedItem">') 
       .attr('src', dropped.attr('src')) 
       .data('id', dropped.attr('id')) 
       .draggable(droppedOptions) 
       .appendTo(droppedOn); 
     } 
    } 
}); 

JS Fiddle example

Si noti che nel mio esempio ho cambiato il tipo di ingresso a text per la visualizzazione, basta cambiarlo di nuovo a hidden un set siete tutti.

+0

Omg man sei una leggenda !!! Non so come ringraziarti abbastanza! Sono rimasto bloccato con questo e hai semplicemente risolto tutto in un modo molto semplice e fantastico! Grazie mille per il tuo aiuto e impegno, non so come ringraziarti. Grazie mille per il vostro tempo e impegno! –

+1

@ElomarAdam Nessun problema, sono contento che sia stato d'aiuto! – DarthJDG

1

Ecco quello che ho fatto: https://jsfiddle.net/Twisty/rdxmmobe/3/

$(function() { 
    $(".DraggedItem").draggable({ 
     helper: 'clone', 
     cursor: 'move', 
     opacity: 0.7, 
     revert: true 
    }); 

    $("div[id^='rang']").droppable({ 
     drop: function (ev, ui) { 
      var target = $("#" + $(this).attr("id") + "input"); 
      target.val($(ui.draggable).attr('id')); 
      var dropCopy = $("<img>"); 
      console.log("Setting DropCopy Source: " + $(ui.draggable).attr('src')); 
      $(dropCopy).attr('src', $(ui.draggable).attr('src')); 
      var droppedOn = $(this); 
      droppedOn.append(dropCopy).css({ 
       top: 0, 
       left: 0 
      }); 
     } 
    }); 
}); 
+0

Grazie per il vostro impegno. Non risolve il problema come dovrebbe, ma apprezzo il tuo impegno. ^^ Grazie ancora! –

+1

Beh, spero che il mio esempio possa aiutarti a migliorare il tuo codice. 1 funzione per molti elementi può rendere la vita più felice. – Twisty