Selon les spécifications seulement le BODY
et FRAMESET
fournissent un événement "onload" auquel se rattacher, mais j'aimerais savoir quand un élément DOM créé dynamiquement a été ajouté au DOM en JavaScript.
Les heuristiques super-naïves que j'utilise actuellement, et qui fonctionnent, sont les suivantes :
-
Traversez le parentNode de l'élément jusqu'à ce que je trouve l'ancêtre ultime (c'est-à-dire parentNode.parentNode.parentNode.etc. jusqu'à ce que parentNode soit nul).
-
Si l'ancêtre ultime a une valeur définie, non nulle. corps propriété
- supposer que l'élément en question fait partie du dom
-
sinon
- répéter ces étapes à nouveau dans 100 millisecondes
Ce que je recherche, c'est la confirmation que ce que je fais est suffisant (encore une fois, cela fonctionne à la fois dans IE7 et FF3) ou une meilleure solution que, pour une raison quelconque, j'ai complètement ignorée ; peut-être d'autres propriétés que je devrais vérifier, etc.
EDIT : Je veux une façon de faire qui soit compatible avec les navigateurs, je ne vis pas dans un monde à un seul navigateur, malheureusement ; cela dit, les informations spécifiques aux navigateurs sont appréciées, mais veuillez indiquer le navigateur que vous connaissez. fait travailler. Merci !
0 votes
Comment pouvez-vous ne pas savoir quand un contenu est ajouté à votre document ? N'êtes-vous pas l'auteur de la page ?
2 votes
@Sergey : Plus vous abstrayez les choses, plus il est probable que l'une des mains ne sache pas ce que l'autre fait.
0 votes
Exactement - je construis un "widget" qui devra savoir, en interne, quand il a été ajouté au DOM - mais comme je ne suis pas nécessairement le consommateur, je ne saurai pas quand, car le code client le déterminera.
0 votes
L'événement onload de l'IMG ne fait cependant pas partie des spécifications du W3C. De plus, je veux cette fonctionnalité pour autre chose que des images, et donc cela ne me servirait pas à grand chose et serait un peu plus fragile en plus.
0 votes
Le navigateur dispose d'une méthode pour déterminer si un nœud est à l'intérieur d'un autre :
Node.contains
. J'ai ajouté une réponse ci-dessous : stackoverflow.com/a/13725984/101869