582 votes

Comment puis-je vérifier si un élément existe dans le DOM visible ?

Comment tester l'existence d'un élément sans avoir recours à l'option getElementById méthode ?

J'ai mis en place un Démonstration en direct pour référence. Je vais également imprimer le code ici :

<!DOCTYPE html>
<html>
<head>
    <script>
    var getRandomID = function (size) {
            var str = "",
                i = 0,
                chars = "0123456789abcdefghijklmnopqurstuvwxyzABCDEFGHIJKLMNOPQURSTUVWXYZ";
            while (i < size) {
                str += chars.substr(Math.floor(Math.random() * 62), 1);
                i++;
            }
            return str;
        },
        isNull = function (element) {
            var randomID = getRandomID(12),
                savedID = (element.id)? element.id : null;
            element.id = randomID;
            var foundElm = document.getElementById(randomID);
            element.removeAttribute('id');
            if (savedID !== null) {
                element.id = savedID;
            }
            return (foundElm) ? false : true;
        };
    window.onload = function () {
        var image = document.getElementById("demo");
        console.log('undefined', (typeof image === 'undefined') ? true : false); // false
        console.log('null', (image === null) ? true : false); // false
        console.log('find-by-id', isNull(image)); // false
        image.parentNode.removeChild(image);
        console.log('undefined', (typeof image === 'undefined') ? true : false); // false ~ should be true?
        console.log('null', (image === null) ? true : false); // false ~ should be true?
        console.log('find-by-id', isNull(image)); // true ~ correct but there must be a better way than this?
    };
    </script>
</head>
<body>
    <div id="demo"></div>
</body>
</html>

En fait, le code ci-dessus montre qu'un élément est stocké dans une variable et ensuite retiré du DOM. Même si l'élément a été retiré du DOM, la variable conserve l'élément tel qu'il était lorsqu'il a été déclaré pour la première fois. En d'autres termes, il ne s'agit pas d'une référence vivante à l'élément lui-même, mais plutôt d'une réplique. Par conséquent, la vérification de l'existence de la valeur de la variable (l'élément) donnera un résultat inattendu.

El isNull est ma tentative de vérifier l'existence d'un élément à partir d'une variable, et cela fonctionne, mais j'aimerais savoir s'il existe un moyen plus simple d'obtenir le même résultat.

PS : Je suis également intéressé par la raison pour laquelle les variables JavaScript se comportent de cette manière si quelqu'un connaît de bons articles sur le sujet.

24 votes

En fait, c'est une référence vivante à l'élément lui-même, il n'est simplement plus dans un document. Cette fonctionnalité est nécessaire parce que vous pouvez retirer un élément du DOM et le remettre plus tard avec tous les gestionnaires d'événements/etc qui lui sont attachés. Pourquoi les variables JS agissent-elles ainsi ? Parce que ce serait incroyablement ennuyeux si elles ne le faisaient pas. JS ne supprime les variables que lorsque vous n'avez plus AUCUNE référence à elles. Le langage n'a aucun moyen de savoir quelles sont les références que vous jugez importantes et celles que vous jugez sans valeur.

0 votes

@cwolves Intéressant. J'ai déjà rencontré cela à plusieurs reprises et je n'y ai jamais vraiment pensé. En fait, dans mon projet actuel, je sauvegarde les éléments dans un tableau avant de les modifier, au cas où je voudrais revenir en arrière.

1 votes

Le ramassage des ordures s'exécute de temps en temps et supprime tout ce qu'il pense pouvoir faire. Il semble plutôt mauvais dans la plupart des navigateurs, mais s'améliore au fur et à mesure que les développeurs se rendent compte que certains navigateurs fonctionnent pendant des jours ou des semaines entre deux redémarrages, de sorte qu'un bon ramassage des déchets est vital pour les performances du navigateur. Les développeurs Web peuvent aider en supprimant les propriétés (et donc les références aux objets en mémoire) qui ne sont plus nécessaires.

733voto

alex Points 186293

Il semble que certaines personnes atterrissent ici, et veulent simplement savoir si un élément existe (un peu différent de la question initiale).

C'est aussi simple que d'utiliser n'importe quelle méthode de sélection du navigateur, et de vérifier s'il y a un véridique valeur (en général).

Par exemple, si mon élément avait un id de "find-me" je pourrais simplement utiliser...

var elementExists = document.getElementById("find-me");

Ceci est spécifié pour retourner une référence à l'élément ou null . Si vous devez avoir une valeur booléenne, il suffit de lancer un !! avant l'appel de la méthode.

En outre, vous pouvez utiliser certaines des nombreuses autres méthodes qui existent pour trouver des éléments, telles que (all living off document ) :

  • querySelector() / querySelectorAll()
  • getElementsByClassName()
  • getElementsByName()

Certaines de ces méthodes renvoient un NodeList alors n'oubliez pas de vérifier son length car une NodeList est un objet, et donc véridique .


Pour déterminer réellement si un élément existe en tant que partie du DOM visible (comme la question posée à l'origine), Csuwldcat fournit une meilleure solution que de déployer votre propre système. (comme le contenait cette réponse). C'est-à-dire que pour utiliser le site contains() sur les éléments du DOM.

Vous pourriez l'utiliser comme ça...

document.body.contains(someReferenceToADomElement);

1 votes

Exactement ce que je cherchais ! Alors évidemment lol, pourquoi je n'y ai pas pensé. Aussi, connaissez-vous de bons articles qui expliquent pourquoi les variables agissent comme ça ?

0 votes

@Jabes88 Je n'en connais pas du haut de ma tête, désolé. Quant à savoir pourquoi, je ne peux que spéculer.

0 votes

J'ai remarqué en vérifiant parentNode est suffisant (sera nul si l'élément est supprimé). Diriez-vous que ceci est tout aussi bien ? jsBin

387voto

Kon Points 16125

Utilisez getElementById() si elle est disponible.

Voici également un moyen simple de le faire avec jQuery :

if ($('#elementId').length > 0) {
  // Exists.
}

Et si vous ne pouvez pas utiliser de bibliothèques tierces, contentez-vous du JavaScript de base :

var element =  document.getElementById('elementId');
if (typeof(element) != 'undefined' && element != null)
{
  // Exists.
}

2 votes

Pour le projet sur lequel je travaille, je ne suis pas en mesure d'utiliser une bibliothèque. Je n'utilise que du bon vieux code brut. Je connais cette méthode jQuery, mais elle ne fonctionne pas sur les éléments qui ne sont pas enveloppés dans le conteneur jQuery. Par exemple, $('#elementId')[0].length ne produirait pas le même résultat.

1 votes

Pour dire que c'est faux, je devais aussi me prouver que c'était faux. Donc, pour expliquer, tapez ceci dans la console de votre navigateur : $('body').parent(); vs $('<div id="#elementId"></div>').parent(); . Les deux retours 1 pour .length - mais vous verrez que le corps a un parent, et si vous faites assez .parent().parent() vous atteindrez le document qui est le sommet de l'arbre DOM. Alors que d'un autre côté, <div> existe en mémoire et n'a pas de parent, mais renvoie une longueur de 1 qui compte simplement les éléments de l'objet jQuery. Je suggère d'éditer votre question pour garder SO propre :)

13 votes

Y a-t-il une bonne raison pour une instruction if aussi compliquée dans le deuxième exemple de code ? Pourquoi ne pas simplement if (element) {} ? Si l'élément est indéfini ou nul, cette expression est fausse. Si element est un élément DOM alors l'expression est vraie.

244voto

csuwldcat Points 2299

Utilisation de la Node.contains DOM API vous pouvez vérifier la présence de tout élément dans la page (actuellement dans le DOM) assez facilement :

document.body.contains(YOUR_ELEMENT_HERE);

NOTE SUR LES NAVIGATEURS CROISÉS : le document dans Internet Explorer n'a pas d'objet contains() pour assurer la compatibilité avec les autres navigateurs, utilisez la méthode document.body.contains() à la place.

4 votes

Cela semble être la réponse ultime à ce problème... et son support, si l'on en croit MDN, est plutôt bon.

3 votes

C'est la meilleure réponse. Notez que le simple fait de vérifier document.contains() devrait suffire.

0 votes

@csuwldcat Cela a marché pour moi, au moins dans Chrome avec document.contains(document.documentElement) . document a Node sur sa chaîne de prototypes, pour autant que je sache ( document -> HTMLDocument -> Document -> Node )

91voto

Anomaly Points 593

Je le fais tout simplement :

if(document.getElementById("myElementId")){
    alert("Element exists");
} else {
    alert("Element does not exist");
}

Cela fonctionne pour moi et je n'ai encore eu aucun problème avec...

2 votes

Mais cela n'a rien à voir avec la question initiale. L'OP veut savoir si une référence à un élément DOM fait partie du DOM visible ou non.

21 votes

Ça m'a quand même aidé. Je cherchais le test simple de l'existence d'un élément ; ceci a fonctionné. Merci.

1 votes

Cette réponse fonctionne bien, mais seulement lorsque l'élément a un nom de domaine. id . La meilleure solution qui répond à la question Comment vérifier si un élément existe dans le DOM visible ? avec n'importe quel élément, même les éléments sans id est de faire document.body.contains(element) .

13voto

Farhad Points 807

De Réseau de développeurs Mozilla :

Cette fonction vérifie si un élément se trouve dans le corps de la page. Comme contains() est inclusif et que déterminer si le corps se contient lui-même n'est pas l'intention de isInPage, ce cas renvoie explicitement false.

function isInPage(node) {
  return (node === document.body) ? false : document.body.contains(node);
}

nœud est le nœud que nous voulons vérifier dans le <body>.

0 votes

+1, est-ce que cela fonctionne également pour les nœuds de texte (arbitraires) (ou les nœuds de commentaires) ?

0 votes

@NikosM. Cela devrait fonctionner dans n'importe quelle balise html mais je ne l'ai pas testé.

5 votes

Ne devrait-on pas false être true ?

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X