Détecter les changements dans les DOM
Je veux exécuter une fonction lorsque certains div ou d'entrée sont ajoutés à la page html.
Est-ce possible?
Par exemple, une saisie de texte est ajouté, puis la fonction doit être appelée.
- Moins d'un tiers de script est d'ajouter les nœuds du DOM, ce n'est pas nécessaire.
- double de stackoverflow.com/questions/2457043/...
- Double Possible de Est-il un JavaScript/jQuery DOM changement écouteur?
- si vous faites une extension chrome qui injecte du code JS, c'est utile.
- github.com/Maykonn/page-info-js
Vous devez vous connecter pour publier un commentaire.
2015 mise à jour, de nouvelles
MutationObserver
est pris en charge par les navigateurs modernes:Chrome 18+, Firefox 14+, c'est à dire 11+, Safari 6+
Si vous avez besoin d'un soutien plus âgés, vous pouvez essayer de revenir à d'autres approches comme celles mentionnées dans ce 5 (!) ans réponse ci-dessous. Il y a des dragons. Enjoy 🙂
Quelqu'un d'autre est en train de changer le document? Parce que si vous avez le plein contrôle sur les modifications que vous avez juste besoin de créer votre propre
domChanged
API - avec une fonction ou d'événements personnalisés - et détente/appel partout où vous modifier les choses.La DOM de Niveau 2 a La Mutation des types d'événements, mais les anciennes version d'IE ne le supporte pas. Notez que la mutation événements sont obsolète dans le DOM3 Événements spec et ont un les performances.
Vous pouvez essayer d'imiter la mutation de l'événement avec
onpropertychange
dans IE (et de revenir à la force brute approche si non est disponible).Pour un plein domChange un intervalle peut être une sur-tuer. Imaginez que vous avez besoin pour stocker l'état actuel de l'ensemble du document, et d'examiner chaque élément de chaque propriété d'être le même.
Peut-être que si vous êtes seulement intéressés par les éléments et leur ordre (comme vous l'avez mentionné dans votre question), un
getElementsByTagName("*")
peut travailler. Cela déclenche automatiquement si vous ajoutez un élément, supprimer un élément, remplacer des éléments ou modifier la structure du document.J'ai écrit une preuve de concept:
Utilisation:
Cela fonctionne sur IE 5.5+, FF 2+, Chrome, Safari 3+ et Opera 9.6+
this
mot-clé btw?(function(window){...}(window))
est inutile. Si l'intention est d'obtenir le global/objet de la fenêtre en toute sécurité, passe dans les ce:(function(window){...}(this))
depuis dans le code mondial, ce toujours des points à l'global/objet de la fenêtre.C'est la meilleure approche jusqu'à présent, avec le plus petit code:
IE9+, FF, Webkit:
JS:
HTML:
mutations, observer
paramètres de la fonction de rappel pour plus de contrôle.childList
la mutation n'est pas surmutations[0]
. Vous devez vérifier chaque élément demutations
.J'ai récemment écrit un plugin qui fait exactement cela - jquery.initialiser
Vous l'utilisez de la même manière que
.each
fonctionLa différence de
.each
est - il en faut du sélecteur, dans ce cas.some-element
et d'attendre de nouveaux éléments avec le sélecteur dans le futur, si un tel élément sera ajouté, il sera initialisé trop.Dans notre cas, la fonction d'initialisation juste changer l'élément de couleur bleu. Donc, si nous allons ajouter un nouvel élément (peu importe si avec ajax ou même F12 inspecteur ou quoi que ce soit) comme:
Plugin init instantanément. Aussi plugin permet de s'assurer qu'un élément est initialisé qu'une seule fois. Donc, si vous ajoutez l'élément, puis
.detach()
de corps, puis l'ajouter à nouveau, il ne sera pas initialisé à nouveau.Plugin est basé sur
MutationObserver
- il fonctionnera sur IE9 et 10 avec dépendances détaillées sur le page readme.ou vous pouvez simplement Créer votre propre événement, qui courent dans tous les
Exemple complet
http://jsfiddle.net/hbmaam/Mq7NX/
C'est un exemple d'utilisation de MutationObserver de Mozilla adaptée à partir de ce post de blog
Chrome 18+, Firefox 14+, c'est à dire 11+, Safari 6+
Utiliser le MutationObserver interface comme indiqué dans Gabriele Romanato de blog
Chrome 18+, Firefox 14+, c'est à dire 11+, Safari 6+
Comment sur l'extension de jquery pour cela?
Jquery 1.9+ a un support intégré pour cela(j'ai entendu pas testé).