2009-03-19 6 views
16

J'utilise les bibliothèques JQuery pour implémenter le glisser-déposer.Comment accéder à l'ID de l'élément déplaçable qui est déposé dans un fichier triable

Comment obtenir l'élément qui est déplacé lorsqu'il est déposé dans une liste triable?

Je veux que l'ID de la div soit déplacé. L'élément suivant est traîné:

<div class="control" id="control[1]" > 
    <img src="img/controls/textfield.png" /> 
</div> 

J'ai la fonction standard faisant glisser de leur exemple

$(".control").draggable({ 
    connectToSortable: '#sortable', 
    helper: 'clone' 
}); 
arrêt de la fonction

en faisant glisser la section avec retour de code suivant juste valeur

stop: function(event, ui) { 
    alert(ui.helper.attr('id')); 
} 

Et c'est élément triable:

<ul id="sortable"><li>test</li></ul> 

et sa fonction:

$("#sortable").sortable({ 
    revert: true, 
    accept: '.control', 
    receive: function(event, ui) { 
    // here i need to get draggable element id 
    } 
}); 

J'ai essayé différents ui.id etc qui ne semble pas fonctionner.

receive: function(event, ui) { 
    $(ui.draggable).attr("id") 
} 

lancers francs undefined.


Mise à jour:

Désolé, ma faute :) Comme ma mère l'habitude de dire - "API de lecture avant le codage". ui.item.attr('id') fonctionne très bien.

Répondre

25

Essayez

receive: function(event, ui) { 
    $(ui.item).attr("id") 
} 

Selon la documentation de réception (en effet tous callbacks pour triables) obtenir deux arguments. Le second argument doit contenir:

  • ui.helper - l'élément aide courant (le plus souvent un clone de l'élément )
  • ui.position - position actuelle de l'aide
  • ui.offset - position absolue actuelle de l'aide
  • ui.item - l'élément courant traîné
  • de ui.placeholder - l'espace réservé (si vous avez défini une)
  • ui.expéditeur - le triables où le élément vient (existe seulement si vous passage d'une liste connectée à autre)
+1

Pour une version manuelle courte légèrement, au lieu de ce $ (ui.item).attr ("id") vous pouvez utiliser ce ui.item.attr ("id") – MrBoJangles

+2

Merci pour la réponse, soit dit en passant. Je n'ai trouvé aucune documentation sur les attributs d'un article ni sur la façon d'y accéder. – MrBoJangles

+1

@MrBoJangles pour une raison quelconque, il n'est pas sur jqueryui.com où il serait logique d'être .. semble être [ici] (http://docs.jquery.com/UI/Sortable) –

1

De la documentation draggable jQuery UI:

Si vous voulez non seulement glisser , mais glisser-déposer, voir l'interface utilisateur jQuery Plugin Droppable, qui fournit une cible drop pour draggables.

Voir http://docs.jquery.com/UI/API/1.7/Droppable

2

j'ai eu un problème similaire, et avait des problèmes un accès l'élément d'aide en cas de départ. Ce que j'ai fini par faire était de définir l'attribut helper à une fonction qui renvoyait du code HTML personnalisé. J'ai été en mesure d'accéder à ce HTML dans l'événement de démarrage sans aucun problème.

helper: function() { 
    return '<div id="myHelper">This is my custom helper.</div>'; 
} 
0

Semble un peu hacky - mais il a fonctionné! Je dois utiliser $ ('. Dragrow1 li: last')

8

Il semble que le context de ui.item change entre l'événement beforeStop et l'événement receive.

Dans mon cas, je suis en train de définir l'ID de l'élément à une valeur générée et

receive: function (event, ui) { ui.item.attr("id", "control" + currentControlId++);} 

ne fonctionne pas pour moi

Vous pouvez contourner ceci:

+0

Merci beaucoup. J'ai cherché toute la journée cette solution! –

+0

Cela semble être un hack, mais semble fonctionner. Est-ce vraiment la meilleure façon de gérer l'ajout d'un ID généré à un élément li en le déposant dans un ul triable? – Ryan

1

Oui, c'est un problème lorsque vous mélangez des sortables draggables droppables, etc. Créez aussi un conteneur triable comme droppable:

$("#sortable").sortable({ 
    revert: true, 
    accept: '.control', 
    receive: function(event, ui) { 
    // here i need to get draggable element id 
    } 
}); 

$('#sortable').droppable({ 
    accept: '.control', 
    drop: function(e, ui){ 
     var your_draggable_element = $(ui.draggable); 
     var your_helper = $(ui.helper); 
    } 
}); 

qui devrait fonctionner

1

J'ai eu du succès en utilisant l'événement beforeStop pour le sortable.

De here

beforeStop: Cet événement est déclenché lors du tri des arrêts, mais quand l'espace réservé/aide est toujours disponible.

$("#something").sortable({ 
    beforeStop: function(event, ui) { 
    //you should check if ui.item is indeed the one you want! 
    item_id = $(ui.item).attr('id'); 
    $(ui.item).html('I'm changing the dropped element in the sortable!'); 
    } 
}); 
0

Vous pouvez utiliser un attribut personnalisé des données pour stocker l'ID des éléments glissés. Cet attribut est toujours présent sur les objets déposés. Le code source comme suit:

<div class="..." data-id="item_id"> 
    ... 
</div> 

En utilisant $('dropped item").data('id') dans le sortable pour obtenir l'ID comme:

$("#sortable").sortable({ 
    ..., 
    receive: function(e, ui) { 
     var id = ui.item.data('id'); 
    } 
}); 
-2
$("#sortable1").sortable({ 
    connectWith: ".connectedSortable", 
    cancel: ".disabledItem", 
    items: "li:not(.disabledItem)", 
    receive: function(event,ui){ 

    **var page = ui.item.attr('value');** 

    var user = $("#select_users").val(); 
+1

S'il vous plaît fournir quelques explications de votre solution –

+0

@Brian Tompsett bonjour, je suis le gars qui a signalé ce faible qualité. ceci est un post incomplet de 2 ans abandonné par OP. Votre modification a rendu le poste un bloc de code invalide contenant des trucs markdown qui est une erreur de syntaxe. S'il vous plaît ne modifiez pas à moins d'améliorer la qualité sans empirer les choses. –

Questions connexes