Posso trocar facilmente dois elementos com o jQuery?
Eu estou olhando para fazer isso com uma linha, se possível.
Eu tenho um elemento de seleção e dois botões para mover para cima ou para baixo nas opções, e já tenho os seletores selecionados e de destino no lugar, faço-o com um if, mas queria saber se existe uma maneira mais fácil.
jquery
swap
javascript
juan
fonte
fonte
Respostas:
Eu encontrei uma maneira interessante de resolver isso usando apenas jQuery:
ou
:)
fonte
Paulo está certo, mas não sei por que ele está clonando os elementos em questão. Isso não é realmente necessário e perderá referências ou ouvintes de eventos associados aos elementos e seus descendentes.
Aqui está uma versão sem clonagem usando métodos DOM simples (já que o jQuery realmente não possui funções especiais para facilitar essa operação em particular):
fonte
Não, não há, mas você pode preparar um:
Uso:
Observe que isso só funciona se os seletores corresponderem apenas a 1 elemento cada, caso contrário, poderá gerar resultados estranhos.
fonte
Existem muitos casos extremos para esse problema, que não são tratados pela resposta aceita ou pela resposta de bobince. Outras soluções que envolvem a clonagem estão no caminho certo, mas a clonagem é cara e desnecessária. Somos tentados a clonar, devido ao antigo problema de como trocar duas variáveis, em que uma das etapas é atribuir uma das variáveis a uma variável temporária. A atribuição (clonagem), neste caso, não é necessária. Aqui está uma solução baseada em jQuery:
fonte
Muitas dessas respostas estão simplesmente erradas para o caso geral, outras são desnecessariamente complicadas se, de fato, funcionam. O jQuery
.before
e os.after
métodos fazem a maior parte do que você deseja fazer, mas você precisa de um terceiro elemento da maneira como muitos algoritmos de swap funcionam. É bem simples - crie um elemento DOM temporário como um espaço reservado enquanto você move as coisas. Não há necessidade de olhar para pais ou irmãos, e certamente não há necessidade de clonar ...1) coloque a div temporária
temp
antesthis
2) mover
this
antesthat
3) mover
that
depoistemp
3b) remover
temp
Então simplesmente
DEMO: http://codepen.io/anon/pen/akYajE
fonte
Você não deve precisar de dois clones, um servirá. Tomando Paolo Bergantino resposta, temos:
Deve ser mais rápido. Passar no menor dos dois elementos também deve acelerar as coisas.
fonte
Eu usei uma técnica como essa antes. Eu o uso para a lista de conectores em http://mybackupbox.com
fonte
end()
se você não continuar a cadeia. que tal #$('element1').clone().before('element2').end().replaceWith('element2');
clone()
não preserva nenhuma jquerydata()
menos que você especifiqueclone(true)
- uma distinção importante se você está classificando para que você não perca todos os seus dadosEu criei uma função que permite mover várias opções selecionadas para cima ou para baixo
Dependências:
Primeiro, ele verifica se a primeira / última opção selecionada é capaz de mover para cima / para baixo. Em seguida, percorre todos os elementos e chama
fonte
outro sem clonagem:
Eu tenho um elemento real e um nominal para trocar:
então
insert <div> before
eremove
depois só são necessários, se você não puder garantir, que sempre exista um elemento antes (no meu caso, é)fonte
.prev()
o comprimento de, e se 0, então.prepend()
para.parent()
:) Dessa forma, você não precisa criar elementos extras.dê uma olhada no plugin jQuery "Swapable"
http://code.google.com/p/jquery-swapable/
é baseado em "Classificável" e parece classificável (arrastar e soltar, espaço reservado etc.), mas apenas trocar dois elementos: arrastado e solto. Todos os outros elementos não são afetados e permanecem na posição atual.
fonte
Esta é uma resposta baseada em @lotif lógica de resposta do , mas um pouco mais generalizada
Se você acrescentar / acrescentar antes / antes dos elementos serem realmente movidos
=> não é necessário clonar
=> eventos mantidos
Existem dois casos que podem acontecer
.prev()
ious" => podemos colocar o outro alvo.after()
nisso..parent()
=> podemos.prepend()
o outro alvo para os pais.O código
Esse código pode ser feito ainda mais curto, mas eu o mantive assim para facilitar a leitura. Observe que o pré-armazenamento dos pais (se necessário) e dos elementos anteriores é obrigatório.
... sinta-se à vontade para agrupar o código interno em uma função :)
O violino de exemplo possui eventos de clique extras anexados para demonstrar a preservação do evento ...
Violino de exemplo: https://jsfiddle.net/ewroodqa/
... funcionará em vários casos - até um como:
fonte
Esta é minha solução para mover vários elementos filhos para cima e para baixo dentro do elemento pai. Funciona bem para mover as opções selecionadas na caixa de listagem (
<select multiple></select>
)Subir:
Mover para baixo:
fonte
Se você deseja trocar dois itens selecionados no objeto jQuery, pode usar este método
http://www.vertstudios.com/blog/swap-jquery-plugin/
fonte
Eu queria uma solução que não use clone (), pois tem efeito colateral com eventos anexados, eis o que acabei fazendo
ele não deve ser usado com objetos jQuery que contêm mais de um elemento DOM
fonte
Se você tiver várias cópias de cada elemento, precisará fazer algo em loop naturalmente. Eu tive essa situação recentemente. Os dois elementos repetidos que eu precisava alternar tinham classes e uma div de contêiner da seguinte maneira:
O código a seguir me permitiu percorrer tudo e reverter ...
fonte
Eu fiz isso com este trecho
fonte
Eu fiz uma tabela para alterar a ordem de obj no banco de dados usado .after () .before (), então isso é do que eu experimento.
É inserir obj1 antes de obj2 e
faça o vice-versa.
Portanto, se obj1 for após obj3 e obj2 após obj4, e se você quiser mudar de lugar obj1 e obj2, você fará isso como
Isso deve ser feito: BTW, você pode usar .prev () e .next () para encontrar obj3 e obj4 se você ainda não possui algum tipo de índice.
fonte
se nodeA e nodeB são irmãos, gostam de dois
<tr>
no mesmo<tbody>
, você pode simplesmente usar$(trA).insertAfter($(trB))
ou$(trA).insertBefore($(trB))
trocá-los, funciona para mim. e você não precisa ligar$(trA).remove()
antes, caso contrário, é necessário vincular novamente alguns eventos de clique em$(trA)
fonte
Crie uma função jQuery como esta
Agradecimentos a Yannick Guinness em https://jsfiddle.net/ARTsinn/TVjnr/
fonte
A melhor opção é cloná-los com o método clone ().
fonte
Eu acho que você pode fazer isso de maneira muito simples. Por exemplo, digamos que você tenha a próxima estrutura: ...
e o resultado deve ser
jquery:
Espero que ajude!
fonte