Como chamar uma função depois que o jQuery .append
estiver completamente pronto?
Aqui está um exemplo:
$("#root").append(child, function(){
// Action after append is completly done
});
O problema: quando uma estrutura DOM complexa é anexada, o cálculo do novo tamanho do elemento raiz no retorno de chamada da função anexa está errado. As suposições são de que o DOM ainda não está completamente carregado, apenas o primeiro filho do DOM complexo adicionado.
append()
leva muito pouco tempo.Respostas:
Você tem muitas respostas válidas aqui, mas nenhuma delas realmente diz por que funciona dessa maneira.
Em JavaScript, os comandos são executados um de cada vez, de forma síncrona na ordem em que vêm, a menos que você diga explicitamente que sejam assíncronos usando um tempo limite ou intervalo.
Isso significa que seu
.append
método será executado e nada mais (desconsiderando quaisquer tempos limite ou intervalos potenciais que possam existir) será executado até que o método termine seu trabalho.Para resumir, não há necessidade de um retorno de chamada, pois
.append
será executado de forma síncrona.fonte
Bem, eu tenho exatamente o mesmo problema com o recálculo do tamanho e depois de horas de dor de cabeça, tenho que discordar do
.append()
comportamento estritamente síncrono. Bem, pelo menos no Google Chrome. Veja o código a seguir.A propriedade padding-left foi recuperada corretamente no Firefox, mas está vazia no Chrome. Como todas as outras propriedades CSS, suponho. Depois de alguns experimentos, tive que me contentar em envolver o 'getter' CSS em um
setTimeout()
atraso de 10 ms, o que eu sei que é FEIO pra caramba, mas o único funcionando no Chrome. Se algum de vocês tiver uma ideia de como resolver esse problema da melhor maneira, eu ficaria muito grato.fonte
.ready()
uma solução muito melhor e mais elegante.Embora Marcus Ekwall esteja absolutamente certo sobre a sincronicidade do acréscimo, também descobri que, em situações estranhas, às vezes o DOM não é completamente renderizado pelo navegador quando a próxima linha de código é executada.
Nesse cenário, as soluções de shadowdiver seguem as linhas corretas - com o uso de .ready - no entanto, é muito mais organizado encadear a chamada para seu anexo original.
fonte
Estou surpreso com todas as respostas aqui ...
Experimente isto:
Observe o 0 tempo limite. Não é um número arbitrário ... como eu entendo (embora meu entendimento possa ser um pouco instável), há duas filas de eventos javascript - uma para eventos macro e outra para microeventos. A fila com escopo "maior" contém tarefas que atualizam a IU (e DOM), enquanto a micro fila executa operações do tipo tarefa rápida.
Observe também que definir um tempo limite não garante que o código seja executado exatamente no valor especificado. O que isso faz é essencialmente colocar a função na fila superior (aquela que lida com a UI / DOM) e não a executa antes do tempo especificado.
Isso significa que definir um tempo limite de 0 o coloca na parte da IU / DOM da fila de eventos do javascript, para ser executado na próxima chance possível.
Isso significa que o DOM é atualizado com todos os itens anteriores da fila (como inserido via
$.append(...);
e, quando o código é executado, o DOM está totalmente disponível.(ps - Aprendi isso em Secrects of the JavaScript Ninja - um excelente livro: https://www.manning.com/books/secrets-of-the-javascript-ninja )
fonte
setTimeout()
há anos sem saber por quê. Obrigada pelo esclarecimento!Tenho outra variante que pode ser útil para alguém:
fonte
...on('load', function(){ ...
veja aqui: stackoverflow.com/a/37751413/2008111Encontrei o mesmo problema e encontrei uma solução simples. Depois de chamar a função append, adicione um documento pronto.
fonte
O uso
MutationObserver
pode funcionar como um retorno de chamada para oappend
método jQuery :Eu expliquei isso em outra pergunta e, desta vez, darei apenas exemplos para navegadores modernos:
fonte
Acho que está bem respondido, mas é um pouco mais específico para lidar com o "subChild_with_SIZE" (se vier do pai, mas você pode adaptá-lo de onde possa estar)
fonte
$.when($('#root').append(child)).then(anotherMethod());
fonte
$.when
só funciona para os objetos que retornam um objeto de promessaanotherMethod()
imediatamente. Não está sendo passado como um retorno de chamada.a função anexar Jquery retorna um objeto jQuery para que você possa apenas marcar um método no final
fonte
Para imagens e outras fontes, você pode usar:
fonte
A maneira mais limpa é fazê-lo passo a passo. Use uma função each para iterar em cada elemento. Assim que esse elemento for anexado, passe-o para uma função subsequente para processar esse elemento.
fonte
Encontrei esse problema ao codificar HTML5 para dispositivos móveis. Algumas combinações de navegador / dispositivo causaram erros porque o método .append () não refletiu as alterações no DOM imediatamente (causando a falha do JS).
A solução rápida e suja para esta situação foi:
fonte
Sim, você pode adicionar uma função de retorno de chamada a qualquer inserção de DOM:
$myDiv.append( function(index_myDiv, HTML_myDiv){ //.... return child })
Verifique a documentação do JQuery: http://api.jquery.com/append/
E aqui está um exemplo prático e semelhante: http://www.w3schools.com/jquery/ tryit.asp? filename = tryjquery_html_prepend_func
fonte
.prepend()
método por: $ ("p"). Prepend (function (n, pHTML) {return "<b> Este elemento p </b> (\" <i > "+ pHTML +" </i> \ ") <b> tem índice" + n + "</b>.";Eu tive um problema semelhante recentemente. A solução para mim foi recriar a coleção. Deixe-me tentar demonstrar:
Espero que isto ajude!
fonte
No jquery você pode usar logo após o seu append
$ () chama uma função que registra um retorno de chamada pronto para DOM (se uma função for passada para ele) ou retorna elementos do DOM (se uma string de seletor ou elemento for passado para ele)
Você pode encontrar mais aqui a
diferença entre $ e $ () em jQuery
http://api.jquery.com/ready/
fonte
Eu sei que não é a melhor solução, mas a melhor prática:
fonte
Append não tem retornos de chamada, e este é um código executado de forma síncrona - não há risco de NÃO ser feito
fonte
fonte