Quero que uma função da minha escolha seja executada quando um elemento DOM for adicionado à página. Isso ocorre no contexto de uma extensão do navegador; portanto, a página da web é executada independentemente de mim e não posso modificar sua fonte. Quais são minhas opções aqui?
Eu acho que, em teoria, eu poderia usar apenas setInterval()
para procurar continuamente a presença do elemento e executar minha ação se o elemento estiver lá, mas preciso de uma abordagem melhor.
Respostas:
Como os eventos de mutação foram preteridos em 2012 e você não tem controle sobre os elementos inseridos porque eles são adicionados pelo código de outra pessoa, sua única opção é verificar continuamente por eles.
Depois que essa função é chamada, ela será executada a cada 100 milissegundos, ou seja 1/10 (um décimo) de segundo. A menos que você precise de observação de elementos em tempo real, isso deve ser suficiente.
fonte
MutationObserver()
: davidwalsh.name/mutationobserver-apiEvent.ADDED_TO_STAGE
?A resposta real é "usar observadores de mutação" (conforme descrito nesta pergunta: Determinando se um elemento HTML foi adicionado dinamicamente ao DOM ), no entanto, o suporte (especificamente no IE) é limitado ( http://caniuse.com/mutationobserver ) .
Portanto, a resposta REAL é: "Use observadores de mutações ... eventualmente. Mas vá com a resposta de Jose Faeti por enquanto" :)
fonte
Entre a descontinuação de eventos de mutação e o surgimento de
MutationObserver
, uma maneira eficaz de ser notificado quando um elemento específico foi adicionado ao DOM era explorar os eventos de animação CSS3 .Para citar a postagem do blog:
fonte
animationstart
, jsbin.com/netuquralu/1/edit .Você pode usar o
livequery
plugin para jQuery. Você pode fornecer uma expressão seletora como:Toda vez que um botão de uma
removeItemButton
classe é adicionado, uma mensagem é exibida na barra de status.Em termos de eficiência, convém evitar isso, mas, em qualquer caso, você pode aproveitar o plug-in em vez de criar seus próprios manipuladores de eventos.
Resposta revisitada
A resposta acima foi criada apenas para detectar que um item foi adicionado ao DOM por meio do plug-in.
No entanto, provavelmente, uma
jQuery.on()
abordagem seria mais apropriada, por exemplo:Se você tiver um conteúdo dinâmico que responda a cliques, por exemplo, é melhor vincular eventos a um contêiner pai usando
jQuery.on
.fonte
ETA 24 Abr 17 Queria simplificar um pouco isso com alguma
async
/await
magia, pois isso torna muito mais sucinto:Usando o mesmo observável prometido:
Sua função de chamada pode ser tão simples quanto:
Se você deseja adicionar um tempo limite, pode usar um
Promise.race
padrão simples, conforme demonstrado aqui :Original
Você pode fazer isso sem bibliotecas, mas precisaria usar algumas coisas do ES6, portanto, esteja ciente dos problemas de compatibilidade (por exemplo, se o seu público for majoritariamente Amish, luddito ou, pior, usuários do IE8)
Primeiro, usaremos a API MutationObserver para construir um objeto observador. Embrulharemos esse objeto em uma promessa e,
resolve()
quando o retorno de chamada for acionado (h / t davidwalshblog), artigo da david walsh blog sobre mutações :Então, criaremos um
generator function
. Se você ainda não os usou, está perdendo - mas uma breve sinopse é: ela funciona como uma função de sincronização e, quando encontra umayield <Promise>
expressão, aguarda de maneira ininterrupta a promessa de ser cumprida. cumpridos (os geradores fazem mais do que isso, mas é nisso que estamos interessados aqui ).Uma parte complicada dos geradores é que eles não 'retornam' como uma função normal. Portanto, usaremos uma função auxiliar para poder usar o gerador como uma função regular. (novamente, h / t para dwb )
Então, a qualquer momento antes que a mutação DOM esperada possa ocorrer, basta executar
runGenerator(getMutation)
.Agora você pode integrar mutações DOM em um fluxo de controle de estilo síncrono. Que tal isso.
fonte
Existe uma biblioteca javascript promissora chamada Arrive, que parece uma ótima maneira de começar a tirar proveito dos observadores de mutações quando o suporte ao navegador se torna comum.
https://github.com/uzairfarooq/arrive/
fonte
Confira este plugin que faz exatamente isso - jquery.initialize
Funciona exatamente como a função .each, a diferença é que leva o seletor que você inseriu e observa novos itens adicionados no futuro que correspondem a esse seletor e os inicializa.
Inicializar é assim
Mas agora, se o novo
.some-element
seletor de correspondência de elemento aparecer na página, ele será inicializado instantaneamente.A maneira como o novo item é adicionado não é importante, você não precisa se preocupar com nenhum retorno de chamada, etc.
Portanto, se você adicionar um novo elemento como:
será inicializado instantaneamente.
O plug-in é baseado em
MutationObserver
fonte
Uma solução javascript pura (sem
jQuery
):fonte