IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

jQuery Discussion :

jQuery UI drag and drop après clonage


Sujet :

jQuery

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Futur Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Novembre 2013
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2013
    Messages : 4
    Par défaut jQuery UI drag and drop après clonage
    Bonjour,

    J'ai établi un drag and drop avec jQuery UI. Je rencontre un problème après un clonage de mon élément dropper.

    Mon principe de base :
    - une section avec mes éléments draggables
    - une section dropper vide
    - une 1ère fonction appelant .draggable et .droppable : applyFirstDragAndDropEvents qui permet de dragguer de ma section drag à ma section dropper
    appel sur les éléments de classe "firstDraggable"
    -une 2ème fonction appelant .draggable et .droppable avec des propriétés différentes : applyDragAndDropEvents qui permet de dragguer dans ma section dropper
    appel sur les élément de classe "draggable" (classe modifiée lors du firstDrag and Drop)

    Mon principe avec le clonage :
    Je souhaite récupérer ma section dropper avec les éléments au préalable placés dedans et la dupliquer.
    -je clone (en javascript, je n'ai utilisé jQuery UI que dans les fonctions Drag and Drop) ma section avec ses enfants
    -j'applique les événements : applyDragAndDrop aux éléments dans la section qui ont la classe "draggable"

    Mon problème :
    -après mon clonage : je peux dragguer de ma section drag à ma nouvelle section dropper (qui appelle applyFirstDragAndDropEvents) ajoutant ainsi de nouveaux éléments à ma section dropper
    - MAIS je ne peux pas dragguer les éléments à l'intérieur de ma nouvelle zone dropper
    que ce soit les éléments issus de mon clonage ou les nouveaux issus de mon firstDragAndDrop
    dès que je commence à les bouger ils disparaissent...



    Je suis réellement perdue. J'ai fait de nombreux tests pour vérifier si mes éléments étaient bien draggable (mais ils bougent donc oui...), si ma zone de drop était bien modifiée et l'identité est bien modifié.

    Je me suis posée la question de zIndex et des empilements de contextes mais je ne vois pas où.

    Auriez-vous une idée ? Une piste ? ou n'importe quoi svp.

    Si vous avez besoin de quoique soit en plus pour comprendre ce que j'ai voulu faire et où j'ai échoué, n'hésitez pas.
    Bonne journée !

  2. #2
    Rédacteur

    Avatar de danielhagnoul
    Homme Profil pro
    Étudiant perpétuel
    Inscrit en
    Février 2009
    Messages
    6 389
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 74
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant perpétuel
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2009
    Messages : 6 389
    Billets dans le blog
    125
    Par défaut
    Bonsoir

    A) Clonage ? Attention aux ID, voir les commentaires et le code de mon plugin dvjhClone.

    B) Lorsqu'on active un widget UI sur un sélecteur $( selector ), il applique ses classes et ses manières de faire. Comme l’élément cloné n'existait pas lors de l'initialisation du widget, il faut l'activer pour le clone. Souvent, après l'introduction d'éléments dynamiques, il faut détruire la totalité des widgets en cours et les reconstruire.

    C) Pour examiner et tester le problème, j'ai besoin des codes (HTML, CSS, JS).

    Blog

    Sans l'analyse et la conception, la programmation est l'art d'ajouter des bogues à un fichier texte vide.
    (Louis Srygley : Without requirements or design, programming is the art of adding bugs to an empty text file.)

  3. #3
    Futur Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Novembre 2013
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2013
    Messages : 4
    Par défaut
    Bonjour,
    Merci de ta réponse. Je te transmets mes codes.

    Ta remarque sur les widgets m'est très utile (je ne savais pas ), je ne vois pas bien avec mon code.
    Dans une 2ème partie je souhaite faire de la zone de drop un canvas pour pouvoir relier les éléments droppés. Je te fais la remarque si ça peut tout modifier ou non. (Je pense utiliser jCanvas du coup)

    Pour les ID, j'ai fait de nombreux tests avec des alert, mes fonctions qui modifient les ID semblent ne pas poser de problèmes.

    Partie HTML :
    Code html : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    <section id="cadreDnD">
    	<table>				
    		<tr>
    			<td ><div class="firstDraggable"><img src="./START/movepng.png" alt="M1" class="icone" draggable=false>M1</div><td/>
    			<td ><div class="firstDraggable"><img src="./START/fixpng.png" alt="F1" class="icone" draggable=false>F1</div><td/>
    		<tr/>
    		<tr>
    			<td><div class="firstDraggable"><img src="./START/movepng.png" alt="M2" class="icone" draggable=false>M2</div><td/>
    			<td><div class="firstDraggable"><img src="./START/fixpng.png" alt="F2" class="icone" draggable=false>F2</div><td/>
    		<tr/>
    		<tr>
    			<td><div class="firstDraggable"><img src="./START/movepng.png" alt="M3" class="icone" draggable=false>M3</div><td/>
    			<td><div class="firstDraggable"><img src="./START/fixpng.png" alt="F3" class="icone" draggable=false>F3</div><td/>
    		<tr/>
    </table>
    </section>

    Partie Javascript :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    function createMap(){ // Création du cadre dropper // Appelée au clic sur un bouton
    	var newSection=document.createElement('section');
    	newSection.id='dropper'+this.name;	
    	newSection.className='dropper';
    	var section=document.getElementById('corpsOngletStations').appendChild(newSection);	
    }
    //Drag And Drop
    unction applyDragAndDropEvents(element, dropper){
    	element.draggable({
    		containment : '.dropper',
    		helper : 'original',		
    		stack :  '.draggable',
    		cursor : 'move',
    		cursorAt : {
    			left : 0,
    			top : 0,
    			right : 50,
    			bottom : 0
    		}, 			
    		drag : function(event, ui){			
    			$(this).css('opacity', '0.7')
    			/* alert('ok');
    			alert(ui.helper.hasClass('draggable')); */
    		}
    	});	
    	dropper.droppable({
    		//Cadre surligné
    		activate : function(event, ui){
    			$(this).css('border', '2px solid rgb(253, 255, 71)');
    		},		
    		drop : function(event, ui){			
    			clonedDiv=null;
    			ui.draggable.css('opacity', '1');				
    			/* applyDragAndDropEvents(ui.draggable, dropper);   */
    			//Cadre désurligné
    			$(this).css('border', '0px solid transparent');			 
    		},	
    	});
    } 
    function  applyFirstDragAndDropEvents(element, dropper){
    	element.draggable({
    		/* containment : 'document', */
    		helper : 'clone',		
    		stack :  '.firstDraggable', 
    		/* zIndex : 1000,  */
    		revert : 'invalid',	
    		cursor : 'move',
    		cursorAt : {
    			left : 0,
    			top : 0,
    			right : 55,
    			bottom : 190
    		},  
    		scroll : false,  
    		start : function(event, ui){			
    			ui.helper.appendTo('#corpsOngletStations');	 
    			/* alert('first'); */
    			/* alert(ui.helper.offset().left);
    			alert(event.pageX); */
    		},
    		drag : function(event, ui){
    			ui.helper.css('opacity', '0.7'); 				
    		}
    	});
    	dropper.droppable({
    		/* accept : helper, */
    		//Cadre surligné
    		activate : function(event, ui){
    			$(this).css('border', '2px solid rgb(253, 255, 71)');
    			},		
    		drop : function(event, ui){
    			//Clonage du helper, position, pointeur (pr plus de précision) ?, rendre le clone draggable
    			var clonedDiv=ui.helper.clone(); 
    			clonedDiv.css({'opacity' : '1', 'cursor' : 'pointer'})
    				.removeClass('firstDraggable ui-draggable ui-draggable-dragging') 
    				.addClass('draggable');	
    			/* applyDragAndDropEvents(clonedDiv, dropper); */ 
    			var x=clonedDiv.offset().left;
    			var y=clonedDiv.offset().top;
    			clonedDiv.css('position', 'absolue')
    				.offset({ 
    					left : -320,
    					top : -170
    				}); 
    			var nomStationDroppee=clonedDiv.text();			
    			$(this).append(clonedDiv); 
    			//Cadre désurligné
    			$(this).css('border', '0px solid transparent');});	
    }
     
    //Duplication appelée au clic sur un bouton
    function duplicateDeployment(){
    		duplication=true;
    //Cache de la carte station de l'ancien Dep sélectionné -->se fait createDeployment
    createDeployment();	
    var deploymentOrigin=deploymentList[(cellCliqueeDT.parentNode.rowIndex)-4]; //A cause des lignes d'exemple en Html déjà écrites,  sans ce serait -1
    		var deploymentCopy=deploymentList[deploymentList.length-1];
    		deploymentOrigin.cloneDeployment(deploymentCopy);
    		deploymentOriginName=deploymentOrigin.name;
     
    		/* deploymentOrigin.resetStations();  */
    		var carteStations=document.getElementById('dropper'+deploymentOriginName);	 
     
    		//Mise à jour currentDeployment
    		currentDeployment=deploymentList[deploymentList.length-1];		
    		currentDeployment.name=deploymentOriginName+'-copy';
    //Récupération de la carte Stations
    				var nouvSection=carteStations.cloneNode(true);
    				nouvSection.id='dropper'+currentDeployment.name;
    				nouvSection.className='dropper';				
    				sectionMapStations=document.getElementById('corpsOngletStations').appendChild(nouvSection);
    				var divs=$('#dropper'+currentDeployment.name+' div'); 
    				/* applyDragAndDropEvents(divs,elementDropper); */
     
    $(function(){
     corpsOngletStations.addEventListener('mouseover', function (e){
    	elementDropper=$('#dropper'+currentDeployment.name);
    	elementsDraggable=$('.draggable'); 
     
    	elementsFirstDraggable.mousedown(function (e){		
    		applyFirstDragAndDropEvents(elementsFirstDraggable,elementDropper);	
    	 });
     
    	elementsDraggable.mousedown(function (e){		
    		applyDragAndDropEvents(elementsDraggable,elementDropper);	
    	 });  
    },true);
    });

  4. #4
    Rédacteur

    Avatar de danielhagnoul
    Homme Profil pro
    Étudiant perpétuel
    Inscrit en
    Février 2009
    Messages
    6 389
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 74
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant perpétuel
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2009
    Messages : 6 389
    Billets dans le blog
    125
    Par défaut
    Bonsoir

    Première remarque, la structure de la table !

    Pas de "tbody" et des "<td/>" au lieu de "</td>" et des "<tr/>" au lieu de "</tr>" !

    Des attributs - draggable=false - au lieu de : draggable="false".

    Code HTML : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    <section id="cadreDnD">
    	<table>
    		<tbody>
    			<tr>
    				<td>
    					<div class="firstDraggable">
    						<img src="./START/movepng.png" alt="M1" class="icone" draggable="false">
    						M1
    					</div>
    				</td>
    				<td >
    					<div class="firstDraggable">
    						<img src="./START/fixpng.png" alt="F1" class="icone" draggable="false">
    						F1
    					</div>
    				</td>
    			</tr>
    			<tr>
    				<td>
    					<div class="firstDraggable">
    						<img src="./START/movepng.png" alt="M2" class="icone" draggable="false">
    						M2
    					</div>
    				</td>
    				<td>
    					<div class="firstDraggable">
    						<img src="./START/fixpng.png" alt="F2" class="icone" draggable="false">
    						F2
    					</div>
    				</td>
    			</tr>
    			<tr>
    				<td>
    					<div class="firstDraggable">
    						<img src="./START/movepng.png" alt="M3" class="icone" draggable="false">
    						M3
    					</div>
    				</td>
    				<td>
    					<div class="firstDraggable">
    						<img src="./START/fixpng.png" alt="F3" class="icone" draggable="false">
    						F3
    					</div>
    				</td>
    			</tr>		
    		</tbody>
    	</table>
    </section>

    Deuxième remarque, 99 % de votre code n'est pas du jQuery, et vous n'utilisez pas les widgets UI Draggable et Droppable.

    Conclusion, je ne peux rien faire pour vous. Pour du draggable HTML5, vous devez poser votre question sur le forum JS.

    Blog

    Sans l'analyse et la conception, la programmation est l'art d'ajouter des bogues à un fichier texte vide.
    (Louis Srygley : Without requirements or design, programming is the art of adding bugs to an empty text file.)

  5. #5
    Futur Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Novembre 2013
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2013
    Messages : 4
    Par défaut
    Merci, je vais modifier pour la table.

    Seulement, comme je l'ai précisé dans mon 1er message je n'utilise jQuery que pour mon drag and drop (j'ai appris à ce moment là, j'essaye maintenant de l'utiliser sans remodifier tout mon code puisque cela simplifie nettement Javascript).
    La documentation de jQuery UI est bien celle sur laquelle je me suis basée pour par exemple mon 1er Drag and Drop : element.draggable et dropper.droppable.

    J'ai essayé avant en Javascript directement mais j'ai rencontré des problèmes et on m'a redirigée directement vers jQuery.
    Je devrais peut être posté sur le forum Javascript du coup. C'est vrai que ça peut porter à confusion... dsl Je suis une vraie novice du langage Web...

Discussions similaires

  1. Jquery DaD (Drag and Drop)
    Par dlasserre dans le forum jQuery
    Réponses: 0
    Dernier message: 27/05/2013, 10h49
  2. [1.x] [Propel] JQuery Drag and Drop Ordre Backend
    Par cacahuete85 dans le forum Symfony
    Réponses: 4
    Dernier message: 21/09/2009, 10h08
  3. [script.aculo.us] Empecher l'éxecution d'un onClick après drag and drop
    Par Bouglilamule dans le forum Bibliothèques & Frameworks
    Réponses: 1
    Dernier message: 11/06/2009, 10h42
  4. Sauvegarde des positions après un Drag and Drop
    Par enok37 dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 06/07/2007, 10h26

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo