Puis-je facilement échanger deux éléments avec jQuery?
Je cherche à faire cela avec une seule ligne si possible.
J'ai un élément de sélection et j'ai deux boutons pour déplacer les options vers le haut ou vers le bas, et j'ai déjà les sélecteurs sélectionnés et les sélecteurs de destination en place, je le fais avec un si, mais je me demandais s'il existe un moyen plus simple.
jquery
swap
javascript
Juan
la source
la source
Réponses:
J'ai trouvé un moyen intéressant de résoudre ce problème en utilisant uniquement jQuery:
ou
:)
la source
Paulo a raison, mais je ne sais pas pourquoi il clone les éléments concernés. Ce n'est pas vraiment nécessaire et perdra toutes les références ou écouteurs d'événements associés aux éléments et à leurs descendants.
Voici une version sans clonage utilisant des méthodes DOM simples (puisque jQuery n'a pas vraiment de fonctions spéciales pour faciliter cette opération particulière):
la source
Non, il n'y en a pas, mais vous pouvez en préparer un:
Usage:
Notez que cela ne fonctionne que si les sélecteurs ne correspondent qu'à 1 élément chacun, sinon cela pourrait donner des résultats étranges.
la source
Il y a beaucoup de cas extrêmes à ce problème, qui ne sont pas traités par la réponse acceptée ou la réponse de bobince. D'autres solutions qui impliquent le clonage sont sur la bonne voie, mais le clonage est coûteux et inutile. Nous sommes tentés de cloner, à cause du problème séculaire de la permutation de deux variables, dans lequel l'une des étapes consiste à affecter l'une des variables à une variable temporaire. L'affectation, (clonage), dans ce cas n'est pas nécessaire. Voici une solution basée sur jQuery:
la source
Beaucoup de ces réponses sont tout simplement fausses pour le cas général, d'autres sont inutilement compliquées si elles fonctionnent même. Le jQuery
.before
et les.after
méthodes font la plupart de ce que vous voulez faire, mais vous avez besoin d'un 3ème élément comme de nombreux algorithmes d'échange. C'est assez simple: créez un élément DOM temporaire comme espace réservé pendant que vous déplacez les choses. Il n'est pas nécessaire de regarder les parents ou les frères et sœurs, et certainement pas besoin de cloner ...1) mettre le div temporaire
temp
avantthis
2) se déplacer
this
avantthat
3) se déplacer
that
aprèstemp
3b) supprimer
temp
Puis simplement
DÉMO: http://codepen.io/anon/pen/akYajE
la source
Vous ne devriez pas avoir besoin de deux clones, un seul suffira. En prenant la réponse de Paolo Bergantino, nous avons:
Ça devrait être plus rapide. Passer le plus petit des deux éléments devrait également accélérer les choses.
la source
J'ai utilisé une technique comme celle-ci avant. Je l'utilise pour la liste des connecteurs sur http://mybackupbox.com
la source
end()
si vous ne continuez pas la chaîne. que diriez-vous$('element1').clone().before('element2').end().replaceWith('element2');
clone()
ne conserve aucune jquerydata()
sauf si vous spécifiezclone(true)
- une distinction importante si vous triez pour ne pas perdre toutes vos donnéesJ'ai créé une fonction qui vous permet de déplacer plusieurs options sélectionnées vers le haut ou vers le bas
Dépendances:
Tout d'abord, il vérifie si la première / dernière option sélectionnée est capable de monter / descendre. Ensuite, il parcourt tous les éléments et appelle
la source
un autre sans clonage:
J'ai un élément réel et un élément nominal à échanger:
puis
insert <div> before
etremove
après ne sont nécessaires que si vous ne pouvez pas vous assurer qu'il y a toujours un élément avant (dans mon cas, c'est le cas)la source
.prev()
la longueur de s, et si 0, alors.prepend()
à.parent()
:) De cette façon, vous n'avez pas besoin de créer des éléments supplémentaires.jetez un œil au plugin jQuery "Swapable"
http://code.google.com/p/jquery-swapable/
il est construit sur "Sortable" et semble triable (glisser-déposer, espace réservé, etc.) mais n'échange que deux éléments: glisser-déposer. Tous les autres éléments ne sont pas affectés et restent sur leur position actuelle.
la source
Ceci est une réponse basée sur @lotif la logique de réponse de , mais un peu plus généralisée
Si vous ajoutez / préférez après / avant que les éléments ne soient réellement déplacés
=> aucun clonage nécessaire
=> événements conservés
Il y a deux cas qui peuvent arriver
.prev()
ious" => nous pouvons mettre l'autre cible.after()
qui..parent()
=> nous pouvons.prepend()
l'autre cible parent.Le code
Ce code pourrait être fait encore plus court, mais je l'ai gardé de cette façon pour plus de lisibilité. Notez que la pré-sauvegarde des parents (si nécessaire) et des éléments précédents est obligatoire.
... n'hésitez pas à envelopper le code interne dans une fonction :)
L'exemple de violon a des événements de clic supplémentaires associés pour démontrer la préservation de l'événement ...
Exemple de violon: https://jsfiddle.net/ewroodqa/
... fonctionnera pour divers cas - même un tel que:
la source
C'est ma solution pour déplacer plusieurs éléments enfants de haut en bas à l'intérieur de l'élément parent. Fonctionne bien pour déplacer les options sélectionnées dans la zone de liste (
<select multiple></select>
)Déplacer vers le haut:
Descendre:
la source
Si vous souhaitez échanger deux éléments sélectionnés dans l'objet jQuery, vous pouvez utiliser cette méthode
http://www.vertstudios.com/blog/swap-jquery-plugin/
la source
Je voulais une solution qui n'utilise pas clone () car elle a un effet secondaire avec les événements attachés, voici ce que j'ai fini par faire
il ne doit pas être utilisé avec des objets jQuery contenant plus d'un élément DOM
la source
Si vous avez plusieurs copies de chaque élément, vous devez faire quelque chose en boucle naturellement. J'ai eu cette situation récemment. Les deux éléments répétitifs dont j'avais besoin pour changer avaient des classes et un conteneur div comme suit:
Le code suivant m'a permis de parcourir tout et d'inverser ...
la source
Je l'ai fait avec cet extrait
la source
J'ai fait une table pour changer l'ordre d'obj dans la base de données utilisée .after () .before (), donc c'est de ce que j'ai expérimenté.
Insère obj1 avant obj2 et
faites l'inverse.
Donc, si obj1 est après obj3 et obj2 après obj4, et si vous voulez changer de place obj1 et obj2, vous le ferez comme
Cela devrait le faire. BTW vous pouvez utiliser .prev () et .next () pour trouver obj3 et obj4 si vous n'avez pas déjà une sorte d'index pour cela.
la source
si nodeA et nodeB sont des frères et sœurs, en aime deux
<tr>
dans le même<tbody>
, vous pouvez simplement les utiliser$(trA).insertAfter($(trB))
ou$(trA).insertBefore($(trB))
les échanger, cela fonctionne pour moi. et vous n'avez pas besoin d'appeler$(trA).remove()
avant, sinon vous devez relier certains événements de clic sur$(trA)
la source
Créez une fonction jQuery comme celle-ci
Merci à Yannick Guinness sur https://jsfiddle.net/ARTsinn/TVjnr/
la source
La meilleure option est de les cloner avec la méthode clone ().
la source
Je pense que vous pouvez le faire très simplement. Par exemple, disons que vous avez la structure suivante: ...
et le résultat devrait être
jquery:
J'espère que ça aide!
la source