Je veux qu'une fonction de mon choix s'exécute lorsqu'un élément DOM est ajouté à la page. C'est dans le contexte d'une extension de navigateur, donc la page Web fonctionne indépendamment de moi et je ne peux pas modifier sa source. Quelles sont mes options ici?
Je suppose qu'en théorie, je pourrais simplement utiliser setInterval()
pour rechercher continuellement la présence de l'élément et effectuer mon action si l'élément est là, mais j'ai besoin d'une meilleure approche.
Réponses:
Étant donné que les événements de mutation étaient obsolètes en 2012 et que vous n'avez aucun contrôle sur les éléments insérés car ils sont ajoutés par le code de quelqu'un d'autre, votre seule option est de les vérifier en permanence.
Une fois cette fonction appelée, elle s'exécutera toutes les 100 millisecondes, soit 1/10 (un dixième) de seconde. À moins que vous n'ayez besoin d'une observation des éléments en temps réel, cela devrait suffire.
la source
MutationObserver()
: davidwalsh.name/mutationobserver-apiEvent.ADDED_TO_STAGE
?La vraie réponse est "utiliser des observateurs de mutation" (comme indiqué dans cette question: déterminer si un élément HTML a été ajouté dynamiquement au DOM ), mais le support (en particulier sur IE) est limité ( http://caniuse.com/mutationobserver ) .
Donc, la vraie réponse ACTUELLE est "Utilisez des observateurs de mutation .... finalement. Mais allez avec la réponse de Jose Faeti pour l'instant" :)
la source
Entre la dépréciation des événements de mutation et l'émergence de
MutationObserver
, un moyen efficace d'être notifié lorsqu'un élément spécifique était ajouté au DOM était d' exploiter les événements d'animation CSS3 .Pour citer l'article du blog:
la source
animationstart
, jsbin.com/netuquralu/1/edit .Vous pouvez utiliser le
livequery
plugin pour jQuery. Vous pouvez fournir une expression de sélecteur telle que:Chaque fois qu'un bouton d'une
removeItemButton
classe est ajouté, un message apparaît dans une barre d'état.En termes d'efficacité, vous voudrez peut-être éviter cela, mais dans tous les cas, vous pouvez utiliser le plugin au lieu de créer vos propres gestionnaires d'événements.
Réponse revisitée
La réponse ci-dessus était uniquement destinée à détecter qu'un élément a été ajouté au DOM via le plugin.
Cependant, très probablement, un
jQuery.on()
approche serait plus appropriée, par exemple:Si vous disposez d'un contenu dynamique qui doit répondre aux clics, par exemple, il est préférable de lier les événements à un conteneur parent à l'aide de
jQuery.on
.la source
ETA 24 avril 17 Je voulais simplifier un peu cela avec certains
async
/await
magic, car cela le rend beaucoup plus succinct:En utilisant le même observable promisifié:
Votre fonction d'appel peut être aussi simple que:
Si vous souhaitez ajouter un délai d'attente, vous pouvez utiliser un
Promise.race
modèle simple comme illustré ici :Original
Vous pouvez le faire sans bibliothèques, mais vous devrez utiliser des éléments ES6, alors soyez conscient des problèmes de compatibilité (par exemple, si votre public est principalement des utilisateurs Amish, Luddite ou, pire, IE8)
Tout d'abord, nous utiliserons l' API MutationObserver pour construire un objet observateur. Nous allons envelopper cet objet dans une promesse, et
resolve()
quand le rappel est déclenché (h / t davidwalshblog) article du blog de David Walsh sur les mutations :Ensuite, nous allons créer un fichier
generator function
. Si vous ne les avez pas encore utilisés, alors vous passez à côté - mais un bref résumé est: il fonctionne comme une fonction de synchronisation, et quand il trouve uneyield <Promise>
expression, il attend de manière non bloquante que la promesse soit rempli (les générateurs font plus que cela, mais c'est ce qui nous intéresse ici ).Une partie délicate des générateurs est qu'ils ne «retournent» pas comme une fonction normale. Nous allons donc utiliser une fonction d'assistance pour pouvoir utiliser le générateur comme une fonction normale. (encore une fois, h / t à dwb )
Ensuite, à tout moment avant que la mutation DOM attendue ne se produise, exécutez simplement
runGenerator(getMutation)
.Vous pouvez désormais intégrer des mutations DOM dans un flux de contrôle de style synchrone. Que diriez-vous de ça.
la source
Il existe une bibliothèque javascript prometteuse appelée Arrive qui semble être un excellent moyen de commencer à tirer parti des observateurs de mutation une fois que la prise en charge du navigateur devient courante.
https://github.com/uzairfarooq/arrive/
la source
Découvrez ce plugin qui fait exactement cela - jquery.initialize
Cela fonctionne exactement comme la fonction .each, la différence est que cela prend le sélecteur que vous avez entré et surveille les nouveaux éléments ajoutés à l'avenir correspondant à ce sélecteur et les initialise
Initialiser ressemble à ceci
Mais maintenant, si un nouvel élément correspondant au
.some-element
sélecteur apparaîtra sur la page, il sera instantanément initialisé.La façon dont le nouvel élément est ajouté n'est pas importante, vous n'avez pas besoin de vous soucier des rappels, etc.
Donc, si vous ajoutez un nouvel élément comme:
il sera instantanément initialisé.
Le plugin est basé sur
MutationObserver
la source
Une solution javascript pure (sans
jQuery
):la source