286 votes

IsDOM JavaScript--comment vérifier si un objet Javascript est un objet DOM ?

J’essaie d’obtenir :

Dans mes propres scripts, j’ai utilisé juste utiliser étant donné que j’ai jamais eu besoin de `` comme une propriété :

Donc pour le 2ème objet, je suis venu avec ce qui suit comme une solution rapide--qui fonctionne pour la plupart. ;)

Problème est que cela dépend des navigateurs appliquer des propriétés en lecture seule, qui pas tous faire.

Est-ce que quelqu'un sait un bon substitut ?

335voto

some Points 18965

Cela pourrait être intéressant :

Cela fait partie du DOM, Level2

Mise à jour 2: c’est comment j’ai implémenté dans ma propre bibliothèque : (le code précédent n’a pas fonctionné en Chrome parce que le nœud et HTMLElement sont des fonctions au lieu de l’objet attendu. Ce code est testé dans FF3, IE7, Chrome 1 et Opera 9)

11voto

Eugene Lazutkin Points 22414

Toutes les solutions ci-dessus et ci-dessous (la mienne y compris) souffrent de la possibilité d'être incorrect, en particulier sur IE, il est tout à fait possible de (re)définir certains objets, méthodes et propriétés pour imiter un nœud DOM rendu le test invalide.

Donc j'ai utiliser le duck-typing-style de test: j'ai tester spécifiquement pour les choses que j'utilise. Par exemple, si je veux cloner un nœud je test comme ceci:

if(typeof node == "object" && "nodeType" in node &&
   node.nodeType === 1 && node.cloneNode){
  // most probably this is a DOM node, we can clone it safely
  clonedNode = node.cloneNode(false);
}

Fondamentalement, c'est un peu sanity check + le test direct pour une méthode (ou une propriété) j'ai l'intention d'utiliser.

D'ailleurs le test ci-dessus est un bon test pour les nœuds DOM sur tous les navigateurs. Mais si vous voulez être sur le côté sûr, toujours vérifier la présence de méthodes et de propriétés et de vérifier leurs types.

EDIT: IE utilise les objets ActiveX pour représenter les nœuds, de sorte que leurs propriétés ne se comportent pas comme véritable objet JavaScript, par exemple:

console.log(typeof node.cloneNode);              // object
console.log(node.cloneNode instanceof Function); // false

alors qu'il devrait revenir "fonction" et true respectivement. Le seul moyen de méthodes de test est de voir si le sont définies.

9voto

Greg Points 132247

Vous pouvez essayer d’ajouter à un noeud DOM real...

7voto

finpingvin Points 484

Il s’agit de la belle bibliothèque javascript mootools :

4voto

Cypher Points 31

ancien sujet, mais ici est une possibilité de mise à jour pour les utilisateurs d’ie8 et Firefox 3.5 :

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