Tester le type d'un élément DOM en JavaScript


99

Existe-t-il un moyen de tester le type d'un élément en JavaScript?

La réponse peut nécessiter ou non la bibliothèque prototype, mais la configuration suivante utilise la bibliothèque.

function(event) {
  var element = event.element();
  // if the element is an anchor
  ...
  // if the element is a td
  ...
}

Réponses:


125

Vous pouvez utiliser typeof(N)pour obtenir le type d'objet réel, mais ce que vous voulez faire est de vérifier la balise, pas le type de l'élément DOM.

Dans ce cas, utilisez la propriété elem.tagNameor elem.nodeName.

si vous voulez être vraiment créatif, vous pouvez utiliser un dictionnaire de noms de variables et de fermetures anonymes à la place si un commutateur ou si / autre.


68
if (element.nodeName == "A") {
 ...
} else if (element.nodeName == "TD") {
 ...
}

1
Des fois ça l'est. Quoi qu'il en soit, vous pouvez toujours utiliser element.nodeName.match(/\bTBODY\b/i)ou element.nodeName.toLowerCase() == 'tbody'etc.
Robusto

9
@Robusto est incorrect. Si le document est HTML et que l'implémentation DOM est correcte, il sera toujours en majuscule. Selon: w3.org/TR/DOM-Level-3-Core/core.html#ID-104682815 sous la section "tagName" (pour les éléments nodeName == tagName) "Le DOM HTML renvoie le tagName d'un élément HTML dans la forme canonique en majuscules, quelle que soit la casse dans le document HTML source. "
bobwienholt le

19

Vous devrez peut-être également vérifier le type de nœud:

if(element.nodeType == 1){//element of type html-object/tag
  if(element.tagName=="a"){
    //this is an a-element
  }
  if(element.tagName=="div"){
    //this is a div-element
  }
}

Edit: Correction de la valeur nodeType


3
Méfiez-vous du cas de tagName.
paupière

@Casey: Ce sera dans une page HTML; dans une page XHTML la casse de la balise est préservée (donc "a" sera "A" dans les pages HTML, et "a" dans les pages XHTML): w3.org/TR/2000/REC-DOM-Level-2- Core-20001113 /… (En supposant que la page XHTML a été correctement servie et non servie text/html.)
TJ Crowder

2
@TJCrowder donc il semble que la meilleure option soitelement.tagName.toLowerCase() === 'a'
p3drosola

@Ped: Oui, ou element.nodeName.toLowerCase()s'il est possible que ce elementne soit pas réellement un élément (par exemple, si vous n'avez pas effectué la nodeType == 1vérification ci-dessus). L' Nodeinterface a nodeName. Pour les Elementexemples, c'est la même chose que tagName. Pour les autres types de nœuds, ce sont des choses comme "#text"ou "#document". Je pense que j'utiliserais toujours le nodeTypechèque, cependant.
TJ Crowder

Mise à jour 2019: au moins sur Chromium moderne (v79.0.3945.79), la chaîne de tagname est en majuscule. "Pour les arborescences DOM qui représentent des documents HTML, le nom de balise renvoyé est toujours sous la forme canonique en majuscules. Par exemple, tagName appelé sur un élément <div> renvoie" DIV " https://developer.mozilla.org/en- US / docs / Web / API / Element / tagName La bonne façon de comparer seraitnode.tagName == 'DIV'
marcs


2

Je l'obtiens généralement à partir de la valeur de retour toString (). Il fonctionne dans les éléments DOM accessibles différemment:

var a = document.querySelector('a');

var img = document.createElement('img');

document.body.innerHTML += '<div id="newthing"></div>';
var div = document.getElementById('newthing');

Object.prototype.toString.call(a);    // "[object HTMLAnchorElement]"
Object.prototype.toString.call(img);  // "[object HTMLImageElement]"
Object.prototype.toString.call(div);  // "[object HTMLDivElement]"

Puis la pièce pertinente:

Object.prototype.toString.call(...).split(' ')[1].slice(0, -1);

Il fonctionne dans Chrome, FF, Opera, Edge, IE9 + (dans l'ancien IE, il renvoie "[objet objet]").


2

Bien que les réponses précédentes fonctionnent parfaitement, je vais simplement ajouter une autre façon où les éléments peuvent également être classés à l'aide de l'interface qu'ils ont implémentée.

Référez-vous à W3 Org pour les interfaces disponibles

console.log(document.querySelector("#anchorelem") instanceof HTMLAnchorElement);
console.log(document.querySelector("#divelem") instanceof HTMLDivElement);
console.log(document.querySelector("#buttonelem") instanceof HTMLButtonElement);
console.log(document.querySelector("#inputelem") instanceof HTMLInputElement);
<a id="anchorelem" href="">Anchor element</a>
<div id="divelem">Div Element</div>
<button id="buttonelem">Button Element</button>
<br><input id="inputelem">

La vérification de l'interface peut être effectuée de 2 façons au fur elem instanceof HTMLAnchorElementet à mesure que les elem.constructor.name == "HTMLAnchorElement"deux retourstrue


0

J'ai une autre façon de tester la même chose.

Element.prototype.typeof = "element";
var element = document.body; // any dom element
if (element && element.typeof == "element"){
   return true; 
   // this is a dom element
}
else{
  return false; 
  // this isn't a dom element
}

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.