Могу ли я легко поменять два элемента с помощью jQuery?
Я хочу сделать это с одной строкой, если это возможно.
У меня есть элемент select, и у меня есть две кнопки для перемещения вверх или вниз по опциям, и у меня уже есть селекторы selected и target, я делаю это с помощью if, но мне было интересно, есть ли более простой способ.
jquery
swap
javascript
хуан
источник
источник
Ответы:
Я нашел интересный способ решить эту проблему, используя только jQuery:
или
:)
источник
Пауло прав, но я не уверен, почему он клонирует соответствующие элементы. Это на самом деле не нужно и потеряет любые ссылки или прослушиватели событий, связанные с элементами и их потомками.
Вот не клонирующая версия, использующая простые методы DOM (поскольку в jQuery на самом деле нет специальных функций, облегчающих эту конкретную операцию):
источник
Нет, нет, но вы могли бы поднять один:
Использование:
Обратите внимание, что это работает, только если селекторы соответствуют только 1 элементу, в противном случае это может привести к странным результатам.
источник
Есть много крайних случаев для этой проблемы, которые не обрабатываются принятым ответом или ответом Бобинса. Другие решения, которые включают клонирование, находятся на правильном пути, но клонирование стоит дорого и не нужно. Мы испытываем искушение клонировать из-за давней проблемы обмена двумя переменными, в которой одним из шагов является присвоение одной из переменных временной переменной. Назначение (клонирование) в этом случае не требуется. Вот решение на основе jQuery:
источник
Многие из этих ответов просто неверны для общего случая, другие неоправданно сложны, если они фактически даже работают. JQuery
.before
и.after
методы делают большую часть того, что вы хотите сделать, но вам нужен третий элемент, как работают многие алгоритмы подкачки. Это довольно просто - создайте временный элемент DOM в качестве заполнителя, пока вы перемещаете вещи. Там нет необходимости смотреть на родителей или братьев и сестер, и, конечно, нет необходимости клонировать ...1) поставить временный div
temp
передthis
2) шаг
this
перед темthat
3) двигаться
that
послеtemp
3б) удалить
temp
Тогда просто
ДЕМО: http://codepen.io/anon/pen/akYajE
источник
Вам не нужно два клона, один подойдет. Принимая ответ Паоло Бергантино, мы имеем:
Должно быть быстрее. Прохождение меньшего из двух элементов также должно ускорить процесс.
источник
Я использовал такую технику раньше. Я использую его для списка соединителей на http://mybackupbox.com
источник
end()
если вы не продолжаете цепочку. как насчет$('element1').clone().before('element2').end().replaceWith('element2');
clone()
, не сохраняет jquery,data()
если вы не укажетеclone(true)
- важное различие, если вы сортируете, чтобы не потерять все свои данныеЯ сделал функцию, которая позволяет вам перемещать несколько выбранных опций вверх или вниз
зависимости:
Сначала он проверяет, может ли первый / последний выбранный параметр двигаться вверх / вниз. Затем он перебирает все элементы и вызывает
источник
другой без клонирования:
У меня есть фактический и номинальный элемент для обмена:
тогда
insert <div> before
иremove
потом нужны только, если вы не можете гарантировать, что всегда есть элемент до (в моем случае это так)источник
.prev()
длину, а если 0, то.prepend()
чтобы.parent()
:) Таким образом, вам не нужно создавать дополнительные элементы.взгляните на плагин jQuery "Swapable"
http://code.google.com/p/jquery-swapable/
он построен на «Сортируемом» и выглядит как сортируемый (перетаскивание, заполнитель и т. д.), но заменяет только два элемента: перетаскиваемый и опускаемый Все остальные элементы не затрагиваются и остаются на своей текущей позиции.
источник
Это ответ, основанный на логике ответов @lotif , но немного более обобщенный
Если вы добавляете / добавляете после / до того, как элементы фактически перемещаются
=> клонирование не требуется
=> события сохраняются
Есть два случая, которые могут произойти
.prev()
ious» => мы можем поставить другую цель,.after()
что..parent()
=> мы можем.prepend()
направить другую цель к родителю.Код
Этот код можно сделать еще короче, но я сохранил его для удобства чтения. Обратите внимание, что предварительное сохранение родителей (при необходимости) и предыдущих элементов обязательно.
... не стесняйтесь обернуть внутренний код в функцию :)
Пример fiddle имеет дополнительные события click, прикрепленные для демонстрации сохранения событий ...
Пример fiddle: https://jsfiddle.net/ewroodqa/
... будет работать для разных случаев, даже таких как:
источник
Это мое решение для перемещения нескольких дочерних элементов вверх и вниз внутри родительского элемента. Хорошо работает для перемещения выбранных опций в списке (
<select multiple></select>
)Двигаться вверх:
Двигаться вниз:
источник
Если вы хотите поменять местами два элемента, выбранные в объекте jQuery, вы можете использовать этот метод
http://www.vertstudios.com/blog/swap-jquery-plugin/
источник
Я хотел, чтобы решение ведьмы не использовало clone (), поскольку оно имеет побочный эффект с прикрепленными событиями, вот что я в итоге и сделал
его нельзя использовать с объектами jQuery, содержащими более одного элемента DOM
источник
Если у вас есть несколько копий каждого элемента, вам нужно сделать что-то в цикле, естественно. У меня была такая ситуация недавно. Два повторяющихся элемента, которые мне нужно было переключить, имели классы и контейнерный элемент div:
Следующий код позволил мне перебрать все и повернуть вспять ...
источник
Я сделал это с этим фрагментом
источник
Я сделал таблицу для изменения порядка obj в базе данных, используемой .after () .before (), так что это из того, что у меня есть эксперимент.
Вставить obj1 перед obj2 и
делай наоборот.
Поэтому, если obj1 находится после obj3, а obj2 после obj4, и если вы хотите поменять местами obj1 и obj2, вы будете делать это следующим образом
Это должно сделать это, кстати, вы можете использовать .prev () и .next (), чтобы найти obj3 и obj4, если у вас уже нет какого-то индекса для него.
источник
если nodeA и nodeB - братья и сестры, им нравится два
<tr>
в одном<tbody>
, вы можете просто использовать$(trA).insertAfter($(trB))
или$(trA).insertBefore($(trB))
поменять их местами, это работает для меня. и вам не нужно звонить$(trA).remove()
раньше, иначе вам нужно повторно привязать некоторые события клика на$(trA)
источник
Создайте функцию jQuery, как это
Благодаря Яннику Гиннесу на https://jsfiddle.net/ARTsinn/TVjnr/
источник
Лучший вариант - клонировать их с помощью метода clone ().
источник
Я думаю, что вы можете сделать это очень просто. Например, скажем, у вас есть следующая структура: ...
и результат должен быть
JQuery:
Я надеюсь, что это помогает!
источник