Je travaille sur une extension dans Chrome et je me demande: quelle est la meilleure façon de savoir quand un élément existe? En utilisant du javascript simple, avec un intervalle qui vérifie jusqu'à ce qu'un élément existe, ou jQuery a-t-il un moyen simple de le faire?
237
MutationObserver
>DOM Mutation Events
>setTimeout
.setTimeout
est compatible, simple à mettre en œuvre, simple à entretenir et a une surcharge négligeable.setTimeout
+jQuery
est moins qu'idéal à mon avis pour deux raisons: 1.) jQuery bloat 2.) vous interrogez inutilement manuellement le DOM pour les éléments, les événements battent facilement en termes de vitesse, 3.) il sera toujours plus lent que n'importe quel natif la mise en oeuvre. Si vous devez faire quelque chose en fonction de la présence d'un élément assez rapidement, en particulier si une expérience utilisateur transparente est votre objectif, il est inférieur.Réponses:
DOMNodeInserted
est obsolète, ainsi que les autres événements de mutation DOM, en raison de problèmes de performances - l'approche recommandée consiste à utiliser un MutationObserver pour surveiller le DOM. Cependant, il n'est pris en charge que dans les nouveaux navigateurs, vous devriez donc vous rabattre sur leDOMNodeInserted
moment où ilMutationObserver
n'est pas disponible.la source
if (mutation.addedNodes.length)
carif (mutation.addedNodes)
il retournerait toujours vrai même s'il s'agit d'un tableau vide. (2) Vous ne pouvez pas le fairemutation.addedNodes.forEach()
car addedNodes est une nodeList et vous ne pouvez pas parcourir une nodeList avec forEach. Pour une solution à cela, voir toddmotto.com/ditch-the-array-foreach-call-nodelist-hackJ'avais ce même problème, alors j'ai continué et j'ai écrit un plugin pour cela.
$(selector).waitUntilExists(function);
Code:
la source
window.setInterval
). Je ne sais pas si laMutationObserver
réponse fonctionne aussi en sondant ...;
au début de la fonction (;(function ($, window) {
)?Voici une fonction JavaScript de base pour attendre l'affichage d'un élément.
Paramètres:
selector
: Cette fonction recherche l'élément $ {selector}time
: Cette fonction vérifie si cet élément existe toutes les $ {time} millisecondes.Par exemple, en définissant
selector="#div1"
ettime=5000
recherchera la balise HTML dontid="div1"
toutes les 5000 millisecondes.la source
querySelector
? developer.mozilla.org/en-US/docs/Web/API/Document/querySelectorVous pouvez écouter
DOMNodeInserted
ouDOMSubtreeModified
les événements qui le feu chaque fois qu'un nouvel élément est ajouté au DOM.Il existe également un plugin LiveQuery jQuery qui détecterait quand un nouvel élément est créé:
la source
J'ai utilisé cette approche pour attendre qu'un élément apparaisse afin que je puisse exécuter les autres fonctions après cela.
Disons que la
doTheRestOfTheStuff(parameters)
fonction ne doit être appelée qu'après que l'élément avec l'ID soitthe_Element_ID
apparu ou que le chargement soit terminé, nous pouvons utiliser,la source
Tu peux faire
Veuillez noter que cela ne fonctionnera que si l'élément est présent dans le DOM lors de la demande du serveur. Si l'élément est ajouté dynamiquement via JavaScript, cela ne fonctionnera pas et vous devrez peut-être consulter les autres réponses.
la source
.ready()
fonction fonctionne pour presque tout (sinon rien), pas seulementdocument
. Cela ne fonctionnera tout simplement pas avec des éléments créés dynamiquement, même sur.live()
.$(document).ready()
, pas l'élément que vous pensez qu'il s'appliquera également. Voilà comment fonctionne cet auditeur spécial . ExempleJe pense qu'il n'y a toujours pas de réponse ici avec un exemple de travail facile et lisible. Utiliser MutationObserver
interface
pour détecter les modifications DOM, comme ceci:la source
Ajoutez simplement le sélecteur souhaité. Une fois l'élément trouvé, vous pouvez y accéder dans la fonction de rappel.
la source
Pour une approche simple en utilisant jQuery, j'ai trouvé que cela fonctionnait bien:
Ici, nous vérifions simplement toutes les 500 ms pour voir si l'élément est chargé, quand il l'est, nous pouvons l'utiliser.
Ceci est particulièrement utile pour ajouter des gestionnaires de clics aux éléments qui ont été ajoutés dynamiquement au document.
la source
Et le insertionQuery bibliothèque ?
insertionQuery utilise des rappels d'animation CSS attachés aux sélecteurs spécifiés pour exécuter un rappel lorsqu'un élément est créé. Cette méthode permet d'exécuter des rappels chaque fois qu'un élément est créé, pas seulement la première fois.
De github:
la source
Voici une fonction qui agit comme un wrapper mince autour de MutationObserver. La seule exigence est que le navigateur prenne en charge MutationObserver; il n'y a pas de dépendance sur JQuery. Exécutez l'extrait ci-dessous pour voir un exemple de travail.
la source
Voici une solution de retour de promesse en Javascript vanille (pas de rappels compliqués). Par défaut, il vérifie toutes les 200 ms.
la source
Voici une fonction Javascript pure qui vous permet d'attendre quoi que ce soit. Définissez l'intervalle plus longtemps pour prendre moins de ressources CPU.
Pour appeler cela, par exemple dans jQuery, utilisez quelque chose comme:
la source
Une solution renvoyant un
Promise
et permettant d'utiliser un timeout (compatible IE 11+).Pour un seul élément (type Element):
Pour plusieurs éléments (tapez NodeList):
Exemples:
Fonctionne à la fois pour une liste d'éléments et un seul élément.
la source
element instanceof HTMLElement
? Cela peut-il être autre chose quenull
ouHTMLElement
?Element
place (fixe). Je fais juste la vérification parce que je veux être sûr que la variableelement
a la propriétéinnerHTML
comme l' indique la documentation Element MDN . N'hésitez pas à le retirer si vous ne vous en souciez pas!Un exemple plus propre utilisant MutationObserver:
la source
Il s'agit d'une solution simple pour ceux qui sont habitués aux promesses et ne veulent pas utiliser de bibliothèques ou de minuteries tierces.
Je l'utilise depuis longtemps dans mes projets
Pour l'utiliser:
ou avec async / attente
la source
async
/await
aussi. Vous pourriez également en tirer plus de performances en faisantmutations.addedNodes.find(node => node.matchesSelector("..."))
Si vous voulez qu'il cesse de chercher après un certain temps (timeout), la jQuery suivante fonctionnera. Il expirera après 10 secondes. J'avais besoin d'utiliser ce code plutôt que du JS pur car j'avais besoin de sélectionner une entrée via le nom et j'avais du mal à implémenter certaines des autres solutions.
la source
J'utilise généralement cet extrait pour Tag Manager:
la source
si vous avez des changements dom asynchrones, cette fonction vérifie (avec une limite de temps en secondes) pour les éléments DOM, elle ne sera pas lourde pour le DOM et sa promesse :)
la source