Voir le code here on jsbin. Je suis en train d'essayer de créer une série de commutateurs. Chaque carré rouge rempli peut être déplacé de haut en bas. Les contours rouges sur le fond sont des zones de largage. Quand un carré est déplacé au-dessus d'une zone de largage pouvant être acceptée, la zone de dépôt doit devenir rose.jQuery drag/droppable scope issue
Il y a deux problèmes avec ce code. L'une est que, tandis que le mouvement des bascules est contraint à l'axe des y, ils peuvent toujours être déposés sur n'importe quelle zone de largage. Cliquez et faites glisser une bascule et faites-la glisser autour de la rangée du bas et vous verrez les zones de largage devenir rose même si la bascule reste en place.
Ce qui conduit au deuxième problème. Pour résoudre ce problème, j'ai essayé d'utiliser l'option scope, qui groupe les drags et les drops. Un glisser peut seulement tomber sur une zone de dépôt avec la même portée. Dans l'exemple ci-dessus, les lignes qui ajoutent la portée sont commentées. La portée de chaque glisser-déposer est "Par défaut". Si vous décommentez ces deux lignes (cliquez sur l'onglet en haut à droite si vous êtes nouveau sur jsbin, puis cliquez sur Aperçu après un changement) vous verrez qu'au lieu de restreindre chaque glisser à une seule zone de dépôt, ils peuvent ne plus laisser tomber aucune zone de dépôt. La fonction de rappel ne se déclenche jamais.
Pour plus de commodité, voici la partie javascript de l'exemple:
$(document).ready(function() {
var draggables = $('div.dragMe'),
droppables = $('div.dropMe');
draggables.draggable(
{
axis: 'y',
containment: 'parent'
});
droppables.droppable(
{
hoverClass: 'dropped',
drop: dropCallBack
});
draggables.each(function(index) {
//$(this).draggable('option', 'scope', ''+index);
//droppables.eq(index).droppable('option', 'scope', ''+index);
$(this).text($(this).draggable('option', 'scope'))
droppables.eq(index).text(droppables.eq(index).droppable('option', 'scope'));
});
function dropCallBack(e, ui) {
alert('Dropped!');
}
});
Je déteste donner un anti-solution, mais vous avez considéré, au lieu de glisser-déposer, juste pour déclencher l'interrupteur avec l'événement mouseDown '.mousedown (function)'? À mon avis, il est beaucoup mieux pour l'utilisabilité (étant le chemin du moins wtf) et s'entend mieux avec les appareils mobiles. –
Parfois, l'anti-solution est la meilleure solution! Bon point. Si je fais fonctionner cela, je pourrais toujours faire les deux. L'idée originale était d'essayer de concevoir des éléments de navigation qui utilisent des analogies physiques pour l'interaction.Les interrupteurs devraient bien sûr "s'enclencher" quand ils sont relâchés comme s'il y avait un cran, mais ne l'ont pas encore écrit. – jasongetsdown