2011-12-14 2 views
16

J'ai une interface utilisateur jQuery déplaçable, et j'ai essayé de créer une aide personnalisée qui contiendrait certaines informations de l'élément original, mais pas toutes.Aide personnalisée pour l'interface utilisateur jQuery Dragable

Voici mes éléments déplaçables;

<ul> 
    <li><div>Name</div> <span>12-12-2011</span></li> 
    <li><div>Another name</div> <span>12-12-2011</span></li> 
</ul> 

et jQuery;

$("ul li").draggable(function(){ 
    helper: function(){ 
    return $("<div></div>"); 
    } 
}); 

L'idée serait que tout en faisant glisser, l'utilisateur aurait une aide qui ne contient que le nom, mais pas l'élément de temps.

Mon code actuel est légèrement plus complexe que cela, donc ce que je cherche vraiment, c'est un sélecteur qui me permettrait de sélectionner l'élément original, ou une copie de celui-ci, et ensuite faire toutes sortes de magie jQuery dessus (éléments de filtrage, ajout de nouveaux éléments, classes, etc.)

Cependant, pour ma vie je ne peux pas trouver ceci, la documentation de draggable suce et personne à #jquery m'aiderait. Des idées?

Merci d'avance!

+0

Etes-vous obligé de laisser tomber l'élément? Ma première tentative de réponse fournit les mêmes résultats que les autres dans lesquels la coutume est glissée, mais ne permet pas de drop. J'ai donc trouvé un travail pour tomber aussi. N'avez-vous pas besoin de déplacer réellement l'élément d'origine? – musefan

+0

Je n'ai pas besoin de déplacer l'élément original, ce que je cherche est une sorte de clone personnalisé. –

+0

Hey, je saurais comment repositionner votre clone personnalisé après cela? Par exemple, j'ai un élément, 500x200 et j'ai besoin qu'il soit 175x50 en le faisant glisser, donc j'utilise helper avec une fonction retournant un "genre de clone personnalisé" en 175x50 mais quand je commence à glisser, mon élément cloné commence le coin supérieur gauche de l'élément complet, peu importe où se trouve le curseur ... Toute solution? – KeizerBridge

Répondre

31

d'abord votre façon d'appeler draggable est défectueux. Le paramètre attendu est un littéral d'objet, pas une fonction.

this est l'élément actuellement déplacé dans la fonction helper.

Avoir le code html suivant

<ul> 
    <li><div class="name">Name</div> <span>12-12-2011</span></li> 
    <li><div class="name">Another name</div> <span>12-12-2011</span></li> 
</ul> 

Vous pouvez le faire:

$('ul li').draggable({ 
    helper: function() { 
     //debugger; 
     return $("<div></div>").append($(this).find('.name').clone()); 
    } 
}); 

Note: J'ai ajouté la classe à l'<div> représentant le nom pour le bien de la sélection, mais vous pouvez trouver autre moyen de le faire. Il s'agit d'un jsfiddle pour vous de vérifier.

+0

Merci, cela a fait l'affaire! Cependant, j'aimerais en savoir plus sur la façon bizarre dont cela semble fonctionner. Par exemple, enregistrer $ (this) .find ('. Name') dans une variable comme vous le feriez n'importe où ailleurs dans jQuery, pour appeler des fonctions supplémentaires ne semble pas fonctionner ici. Pourquoi ça? –

+0

Je ne suis pas sûr de comprendre. Dans la fonction d'aide que vous voulez dire? Pourriez-vous fourchette mon violon et modifier le javascript pour illustrer? –

9

OK, avec un test rapide qui suit fonctionnera ....

$("ul li").draggable({ 
    helper: function() { 
     return $("<div>hello</div>"); 
    } }); 

avis vous ne passez pas une fonction en tant que paramètre draggable. Aussi, j'ai ajouté "bonjour" à l'exemple de sorte que l'aide DIV contient effectivement quelque chose.

EDIT: Cela semble empêcher l'élément étant tombé, hmmm ...

A FIX: Pas assez, mais cela fonctionne, peut-être il peut donner quelques idées d'amélioration ...

var remember; 
$("ul li").draggable({ 
    helper: 'original', 
    start: function(e, ui) { 
     remember = $(this).html(); 
     $(this).html("<div>hello</div>"); 
    }, 
    stop: function(e, ui) { 
     $(this).html(remember); 
    } 
}); 

Example Here

Si vous ne voulez pas l'idée de la variable « se souvenir », il semble être ok pour ajouter une option personnalisée à l'objet draggable que ca n tenir le fichier html d'origine ...

$("ul li").draggable({ 
    helper: 'original', 
    start: function(e, ui) { 
     $(this).draggable("option", "olddata", $(this).html()); 
     $(this).html("<div>hello</div>"); 
    }, 
    stop: function(e, ui) { 
     $(this).html($(this).draggable("option", "olddata")); 
    } 
}); 
3

Une solution possible est

Fiddle: http://jsfiddle.net/SWbse/

$(document).ready(function() { 
     $("ul li").draggable({ 
     helper: 'clone', 
     start: function(event, ui){ 
      ui.helper.children('span').remove(); 
     }  
    }); 
    }); 
Questions connexes