2017-07-28 2 views
0

J'ai un div (canvas), qui agit comme une droppable pour les rects. Les rects, qui ont été déposés sur la div, sont clonés et peuvent être déplacés et redimensionnés dans cette div.(re) stocker la position et la taille de CHAQUE dragable dragable JQuery

Mes questions sont: Comment puis-je (re) stocker la position, la taille des éléments dynamiquement clonés?

Comment ça marche: glisser plus d'un rect sur la toile Redimensionner ou faites-le glisser dans le rect cliquez sur Enregistrer

Maintenant, il me donne le nombre exact de rects clonés, mais il enregistre uniquement les position et taille du dernier élément cloné.

Comment puis-je ajouter les champs de texte cachés pour chaque rect clone séparément?

$(function() { 
 
    $('#rect').draggable({ 
 
    revert: "invalid", 
 
    helper: function(event, ui) { 
 
     return $(this).clone(true); 
 
    } 
 

 
    }); 
 

 
    $('#bu').click(function() { 
 
    alert("no of rect set: " + $('.rectset').length); 
 

 
    $('.rectset').each(function() { 
 
     var posTop = $('input#posTop').val(); 
 
     var posLeft = $('input#posLeft').val(); 
 
     var height = $('input#sizeHeight').val(); 
 
     var width = $('input#sizeWidth').val(); 
 

 
     alert("left: " + posLeft + ", top: " + posTop + 
 
     " ,height: " + height + ", width: " + width); 
 
    }); 
 
    }); 
 

 

 
    $("#canvas").droppable({ 
 
    accept: "#rect", 
 
    drop: function(e, ui) { 
 
     if ($(ui.draggable).hasClass('ui-draggable-dragging')) { 
 
     /*alert("rect is dragged and not copied again");*/ 
 
     return 
 

 
     } 
 

 
     var droppedRect = $(ui.draggable).clone().addClass('rectset') 
 

 

 
     droppedRect.append('<input type="hidden" id="posLeft" value="empty"></input>'); 
 
     droppedRect.append('<input type="hidden" id="posTop" value="empty"></input>'); 
 
     droppedRect.append('<input type="hidden" id="sizeWidth" value="empty"></input>'); 
 
     droppedRect.append('<input type="hidden" id="sizeHeight" value="empty"></input>'); 
 

 
     droppedRect.appendTo(this); 
 

 
     droppedRect.draggable({ 
 
     containment: "#canvas", 
 
     scroll: false, 
 
     stop: function(event, ui) { 
 
      // \t alert($('input#posLeft').val() + " " + $('input#posTop').val()) ; 
 
      var posleft = ui.position.left; 
 
      var postop = ui.position.top; 
 
      $('input#posLeft').attr('value', posleft); 
 
      $('input#posTop').attr('value', postop); 
 
      alert($('input#posLeft').val() + " " + $('input#posTop').val()); 
 

 
     } 
 
     }).resizable({ 
 
     ghost: true, 
 
     containment: "#canvas", 
 
     stop: function(event, ui) { 
 
      $('#size').attr('value', ui.size) 
 

 
      var width = ui.size.width; 
 
      var height = ui.size.height; 
 
      //  alert($('input#sizeWidth').val() + " " + $('input#sizeHeight').val()) ; 
 
      $('input#sizeWidth').attr('value', width); 
 
      $('input#sizeHeight').attr('value', height); 
 
      alert($('input#sizeWidth').val() + " " + $('input#sizeHeight').val()); 
 

 
     } 
 
     }); 
 
    } 
 
    }); 
 

 
});
#canvas { 
 
    width: 700px; 
 
    height: 400px; 
 
    border: 10px solid black; 
 
    padding: 15px 15px 15px 150px; 
 
} 
 

 
#rect { 
 
    border: 3px solid black; 
 
    background: #ffff99; 
 
    width: 100px; 
 
    height: 100px; 
 
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script> 
 
<link href="https://cdnjs.cloudflare.com/ajax/libs/jqueryui/1.9.1/themes/base/jquery-ui.css" rel="stylesheet" /> 
 
<script src="https://code.jquery.com/ui/1.9.2/jquery-ui.min.js"></script> 
 
<button id="bu" onclick="save()">Save</button > 
 
<div id="rect" class="ui-widget-content"> </div> 
 
<div id="canvas" class="ui-widget-header">

+0

doivent être uniques au document, de sorte que ça ne va pas travailler si vous avez plus d'un. La valeur d'une zone de texte doit être définie avec '.val (value)', pas 'attr'. Aussi, partagez un [mcve] avec le minimum de code pour montrer votre problème. ** Ne gardez pas le code sur un site externe **. De nombreuses personnes sont bloquées sur les sites de partage de code, ce qui limite le nombre de personnes susceptibles de vous aider. Stack Overflow a Stack Snippets qui fournissent un niveau de fonctionnalité très similaire à jsfiddle.net. –

Répondre

0

Comme Mike a dit, les ID doivent être uniques. J'ai résolu cela en ajoutant un compteur var i = 0, puis sur chaque nouveau droppedRect définissant l'attribut id au nombre incrémenté. En outre, je pense qu'une meilleure façon d'atteindre le même objectif de mettre des données sur les rectangles est à travers jQuery.data. J'ai utilisé jQueryUI 1.9 parce que c'était utilisé dans le violon.

$(function() { 
 
    $('#rect').draggable({ 
 
    revert: "invalid", 
 
    helper: function(event, ui) { 
 
     return $(this).clone(true); 
 
    } 
 
    }); 
 
    var i = 0; 
 
    $('#bu').click(function() { 
 
    console.log("no of rect set: " + $('.rectset').length); 
 

 
    $('.rectset').each(function(a, b) { 
 
     console.log("left: " + $(b).data('posleft') + ", top: " + $(b).data('postop') + 
 
     " ,height: " + $(b).data('height') + ", width: " + $(b).data('width')) 
 
    }); 
 
    }); 
 

 
    $("#canvas").droppable({ 
 
    accept: "#rect", 
 
    drop: function(e, ui) { 
 
     if ($(ui.draggable).hasClass('ui-draggable-dragging')) { 
 
     return; 
 
     } 
 

 
     var droppedRect = $(ui.draggable).clone().addClass('rectset').attr('id', i++) 
 
     .appendTo(this) 
 
     .data({ 
 
      'posleft': ui.position.left, 
 
      'postop': ui.position.top, 
 
      'width': ui.draggable[0].offsetWidth, 
 
      'height': ui.draggable[0].offsetHeight 
 
     }); 
 
     console.log("Dropped - left: " + ui.position.left + " top:" + ui.position.top + " width: " + ui.draggable[0].offsetWidth + " height: " + ui.draggable[0].offsetHeight); 
 
     droppedRect.draggable({ 
 
     containment: "#canvas", 
 
     scroll: false, 
 
     stop: function(event, ui) { 
 
      $(this).data('posleft', ui.position.left); 
 
      $(this).data('postop', ui.position.top); 
 
      console.log("Moved - left: " + ui.position.left + " top:" + ui.position.top); 
 

 
     } 
 
     }).resizable({ 
 
     ghost: true, 
 
     containment: "#canvas", 
 
     stop: function(event, ui) { 
 
      $(this).data('width', ui.size.width); 
 
      $(this).data('height', ui.size.height); 
 
      console.log("Resized - width: " + ui.size.width + " height: " + ui.size.height); 
 
     } 
 
     }); 
 
    } 
 
    }); 
 
});
#canvas { 
 
    width: 700px; 
 
    height: 400px; 
 
    border: 10px solid black; 
 
    padding: 15px 15px 15px 150px; 
 
} 
 

 
.rect { 
 
    border: 3px solid black; 
 
    background: #ffff99!important; 
 
    width: 100px; 
 
    height: 100px; 
 
}
<link href="https://cdnjs.cloudflare.com/ajax/libs/jqueryui/1.9.1/themes/base/jquery-ui.css" rel="stylesheet"/> 
 
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script> 
 
<script src="https://code.jquery.com/ui/1.9.2/jquery-ui.min.js"></script> 
 

 
<button id="bu">Save</button > 
 
<div id="rect" class="rect ui-widget-content"> </div> 
 
<div id="canvas" class="ui-widget-header">

ID