Eu quero executar uma função quando alguma div ou entrada são adicionadas ao html. Isso é possível?
Por exemplo, uma entrada de texto é adicionada e a função deve ser chamada.
Eu quero executar uma função quando alguma div ou entrada são adicionadas ao html. Isso é possível?
Por exemplo, uma entrada de texto é adicionada e a função deve ser chamada.
Respostas:
Atualização de 2015, o novo
MutationObserver
é suportado por navegadores modernos:Chrome 18+, Firefox 14+, IE 11+, Safari 6+
Se precisar dar suporte aos mais antigos, tente recorrer a outras abordagens, como as mencionadas nesta resposta de 5 (!) Anos abaixo. Existem dragões. Aproveitar :)
Alguém mais está mudando o documento? Porque se você tiver controle total sobre as alterações, precisará criar sua própria
domChanged
API - com uma função ou evento personalizado - e acioná-la / chamá-la em qualquer lugar que modificar as coisas.O DOM Nível 2 tem tipos de eventos de Mutação , mas a versão mais antiga do IE não é compatível. Observe que os eventos de mutação foram preteridos na especificação de Eventos DOM3 e têm uma penalidade de desempenho .
Você pode tentar emular um evento de mutação
onpropertychange
no IE (e voltar à abordagem de força bruta, se nenhum deles estiver disponível).Para um domínio completo, um intervalo pode ser uma substituição excessiva. Imagine que você precisa armazenar o estado atual de todo o documento e examinar cada propriedade de cada elemento para ser a mesma.
Talvez se você estiver interessado apenas nos elementos e na ordem deles (como você mencionou na sua pergunta), um
getElementsByTagName("*")
pode funcionar. Isso será acionado automaticamente se você adicionar um elemento, remover um elemento, substituir elementos ou alterar a estrutura do documento.Eu escrevi uma prova de conceito:
Uso:
Funciona no IE 5.5+, FF 2+, Chrome, Safari 3+ e Opera 9.6+
fonte
Esta é a melhor abordagem até agora, com o menor código:
IE9 +, FF, Webkit:
fonte
mutations, observer
parâmetros para a função de retorno de chamada para obter mais controle.Eu escrevi recentemente um plugin que faz exatamente isso - jquery.initialize
Você usa da mesma maneira que a
.each
funçãoA diferença de
.each
é - ele pega seu seletor, nesse caso,.some-element
e aguarda novos elementos com esse seletor no futuro; se esse elemento for adicionado, ele também será inicializado.No nosso caso, a função de inicialização apenas altera a cor do elemento para azul. Portanto, se adicionarmos um novo elemento (não importa se o Ajax ou mesmo o F12 inspector ou algo assim), como:
O plugin o iniciará instantaneamente. Também o plugin garante que um elemento seja inicializado apenas uma vez. Portanto, se você adicionar um elemento,
.detach()
a partir do corpo e o adicionar novamente, ele não será inicializado novamente.O plug-in é baseado
MutationObserver
- ele funcionará no IE9 e 10 com dependências, conforme detalhado na página leia - me .fonte
ou você pode simplesmente criar seu próprio evento , que acontece em qualquer lugar
Exemplo completo http://jsfiddle.net/hbmaam/Mq7NX/
fonte
Este é um exemplo usando o MutationObserver da Mozilla adaptado desta postagem do blog
Chrome 18+, Firefox 14+, IE 11+, Safari 6+
fonte
Use a interface MutationObserver como mostrado no blog de Gabriele Romanato
Chrome 18+, Firefox 14+, IE 11+, Safari 6+
fonte
Que tal estender um jquery para isso?
O Jquery 1.9+ criou suporte para isso (ouvi falar que não testei).
fonte