¿Puedo intercambiar fácilmente dos elementos con jQuery?
Estoy buscando hacer esto con una línea si es posible.
Tengo un elemento de selección y tengo dos botones para mover hacia arriba o hacia abajo las opciones, y ya tengo el seleccionado y los selectores de destino en su lugar, lo hago con un if, pero me preguntaba si hay una manera más fácil.
jquery
swap
javascript
juan
fuente
fuente
Respuestas:
He encontrado una forma interesante de resolver esto usando solo jQuery:
o
:)
fuente
Paulo tiene razón, pero no estoy seguro de por qué está clonando los elementos en cuestión. Esto no es realmente necesario y perderá cualquier referencia u oyentes de eventos asociados con los elementos y sus descendientes.
Aquí hay una versión sin clonación que usa métodos DOM simples (ya que jQuery realmente no tiene ninguna función especial para facilitar esta operación en particular):
fuente
No, no lo hay, pero podrías preparar uno:
Uso:
Tenga en cuenta que esto solo funciona si los selectores solo coinciden con 1 elemento cada uno, de lo contrario podría dar resultados extraños.
fuente
Hay muchos casos extremos para este problema, que no se manejan con la respuesta aceptada o la respuesta de bobince. Otras soluciones que implican la clonación están en el camino correcto, pero la clonación es costosa e innecesaria. Estamos tentados a clonar, debido al antiguo problema de cómo intercambiar dos variables, en el que uno de los pasos es asignar una de las variables a una variable temporal. La asignación, (clonación), en este caso no es necesaria. Aquí hay una solución basada en jQuery:
fuente
Muchas de estas respuestas son simplemente incorrectas para el caso general, otras son innecesariamente complicadas si de hecho incluso funcionan. JQuery
.before
y los.after
métodos hacen la mayor parte de lo que desea hacer, pero necesita un tercer elemento de la forma en que funcionan muchos algoritmos de intercambio. Es bastante simple: crea un elemento DOM temporal como marcador de posición mientras mueves las cosas. No hay necesidad de mirar a los padres o hermanos, y ciertamente no hay necesidad de clonar ...1) poner el div temporal
temp
antesthis
2) muévete
this
antesthat
3) moverse
that
despuéstemp
3b) eliminar
temp
Entonces simplemente
MANIFESTACIÓN: http://codepen.io/anon/pen/akYajE
fuente
No debería necesitar dos clones, uno lo hará. Tomando la respuesta de Paolo Bergantino tenemos:
Debería ser más rápido. Pasar el más pequeño de los dos elementos también debería acelerar las cosas.
fuente
Usé una técnica como esta antes. Lo uso para la lista de conectores en http://mybackupbox.com
fuente
end()
si no continúa la cadena. ¿qué tal$('element1').clone().before('element2').end().replaceWith('element2');
clone()
que no conserva ningún jquery adata()
menos que especifiqueclone(true)
, una distinción importante si está ordenando para no perder todos sus datosHe creado una función que le permite mover múltiples opciones seleccionadas hacia arriba o hacia abajo
Dependencias:
Primero verifica si la primera / última opción seleccionada puede moverse hacia arriba / abajo. Luego recorre todos los elementos y llama
fuente
otro sin clonar:
Tengo un elemento real y un elemento nominal para intercambiar:
entonces
insert <div> before
yremove
después solo son necesarios, si no puede asegurarse, que siempre hay un elemento antes (en mi caso, es)fuente
.prev()
la longitud de, y si es 0, entonces.prepend()
a.parent()
:) De esa manera, no necesita crear elementos adicionales.eche un vistazo al complemento jQuery "Swapable"
http://code.google.com/p/jquery-swapable/
está construido en "Sortable" y parece ordenable (arrastrar y soltar, marcador de posición, etc.) pero solo intercambia dos elementos: arrastrado y soltado. Todos los demás elementos no se ven afectados y permanecen en su posición actual.
fuente
Esta es una respuesta basada en la lógica de respuesta de @lotif , pero un poco más generalizada
Si agrega / antepone después / antes de que los elementos se muevan realmente
=> no se necesita clonación
=> eventos guardados
Hay dos casos que pueden suceder.
.prev()
ious" => podemos poner al otro objetivo.after()
que..parent()
=> podemos.prepend()
el otro objetivo a padre.El código
Este código podría hacerse aún más corto, pero lo mantuve así para facilitar la lectura. Tenga en cuenta que la prescripción de los padres (si es necesario) y elementos anteriores es obligatoria.
... no dude en envolver el código interno en una función :)
El violín de ejemplo tiene eventos de clic adicionales adjuntos para demostrar la preservación de eventos ...
Violín de ejemplo: https://jsfiddle.net/ewroodqa/
... funcionará para varios casos, incluso uno como:
fuente
Esta es mi solución para mover varios elementos secundarios hacia arriba y hacia abajo dentro del elemento primario. Funciona bien para mover las opciones seleccionadas en el cuadro de lista (
<select multiple></select>
)Ascender:
Mover hacia abajo:
fuente
Si desea intercambiar dos elementos seleccionados en el objeto jQuery, puede usar este método
http://www.vertstudios.com/blog/swap-jquery-plugin/
fuente
Quería una solución que no use clone () ya que tiene efectos secundarios con eventos adjuntos, esto es lo que terminé haciendo
no debe usarse con objetos jQuery que contengan más de un elemento DOM
fuente
Si tiene varias copias de cada elemento, debe hacer algo en un bucle de forma natural. Tuve esta situación recientemente. Los dos elementos repetidos que necesitaba cambiar tenían clases y un contenedor div así:
El siguiente código me permitió recorrer todo e invertir ...
fuente
Lo he hecho con este fragmento.
fuente
Hice una tabla para cambiar el orden de obj en la base de datos utilizada .after () .before (), así que esto es de lo que tengo experimento.
Es insertar obj1 antes de obj2 y
hacer lo contrario
Entonces, si obj1 es después de obj3 y obj2 después de obj4, y si desea cambiar de lugar obj1 y obj2, lo hará como
Esto debería hacerlo, por cierto, puede usar .prev () y .next () para encontrar obj3 y obj4 si aún no tiene algún tipo de índice para él.
fuente
si nodeA y nodeB son hermanos, le gustan dos
<tr>
en el mismo<tbody>
, solo puede usarlos$(trA).insertAfter($(trB))
o$(trA).insertBefore($(trB))
intercambiarlos, funciona para mí. y no necesita llamar$(trA).remove()
antes, de lo contrario debe volver a vincular algunos eventos de clic en$(trA)
fuente
Cree una función jQuery como esta
Gracias a Yannick Guinness en https://jsfiddle.net/ARTsinn/TVjnr/
fuente
La mejor opción es clonarlos con el método clone ().
fuente
Creo que puedes hacerlo muy simple. Por ejemplo, supongamos que tiene la siguiente estructura: ...
y el resultado debería ser
jquery:
¡Espero que ayude!
fuente