Testare il tipo di un elemento DOM in JavaScript


99

C'è un modo per testare il tipo di un elemento in JavaScript?

La risposta potrebbe richiedere o meno la libreria prototipo, tuttavia la seguente configurazione utilizza la libreria.

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

Risposte:


125

Puoi utilizzare typeof(N)per ottenere il tipo di oggetto effettivo, ma quello che vuoi fare è controllare il tag, non il tipo di elemento DOM.

In tal caso, usa la proprietà elem.tagNameo elem.nodeName.

se vuoi essere davvero creativo, puoi usare un dizionario di nomi di tag e chiusure anonime invece se un interruttore o se / altro.


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

1
A volte lo è. Ad ogni modo, puoi sempre usare element.nodeName.match(/\bTBODY\b/i)o element.nodeName.toLowerCase() == 'tbody'ecc.
Robusto

9
@Robusto non è corretto. Se il documento è HTML e l'implementazione DOM è corretta, sarà sempre maiuscolo. Secondo: w3.org/TR/DOM-Level-3-Core/core.html#ID-104682815 nella sezione "tagName" (per gli elementi nodeName == tagName) "Il DOM HTML restituisce il tagName di un elemento HTML in la forma canonica maiuscola, indipendentemente dal caso nel documento HTML di origine. "
bobwienholt

19

Forse dovrai controllare anche il tipo di nodo:

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
  }
}

Modifica: corretto il valore nodeType


3
Attenzione al caso di tagName.
mancanza di palpebre

@Casey: sarà in una pagina HTML; in una pagina XHTML le maiuscole / minuscole del tag sono conservate (quindi "a" sarà "A" nelle pagine HTML e "a" nelle pagine XHTML): w3.org/TR/2000/REC-DOM-Level-2- Core-20001113 /… (Supponendo che la pagina XHTML sia stata servita correttamente e non sia stata servita come text/html.)
TJ Crowder

2
@TJCrowder quindi sembra che l'opzione migliore siaelement.tagName.toLowerCase() === 'a'
p3drosola

@Ped: Sì, o element.nodeName.toLowerCase()se è possibile che elementnon sia effettivamente un elemento (ad esempio, se non hai eseguito il nodeType == 1controllo sopra elencato). L' Nodeinterfaccia ha nodeName. Ad Elementesempio, è lo stesso di tagName. Per altri tipi di nodi, sono cose come "#text"o "#document". Penso che userei sempre l' nodeTypeassegno, però.
TJ Crowder

Aggiornamento 2019: almeno sul moderno Chromium (v79.0.3945.79) la stringa tagname è maiuscola. "Per gli alberi DOM che rappresentano documenti HTML, il nome del tag restituito è sempre nella forma canonica maiuscola. Ad esempio, tagName chiamato su un elemento <div> restituisce" DIV " https://developer.mozilla.org/en- US / docs / Web / API / Element / tagName il modo corretto di confrontare sarebbenode.tagName == 'DIV'
marcs


2

Di solito lo ottengo dal valore di ritorno toString (). Funziona in elementi DOM a cui si accede in modo diverso:

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]"

Quindi il pezzo rilevante:

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

Funziona in Chrome, FF, Opera, Edge, IE9 + (nella vecchia IE restituisce "[Object Object]").


2

Sebbene le risposte precedenti funzionino perfettamente, aggiungerò solo un altro modo in cui gli elementi possono anche essere classificati utilizzando l'interfaccia che hanno implementato.

Fare riferimento a W3 Org per le interfacce disponibili

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">

Il controllo dell'interfaccia può essere effettuato in 2 modi come elem instanceof HTMLAnchorElemento elem.constructor.name == "HTMLAnchorElement", entrambi i ritornitrue


0

Ho un altro modo per provare lo stesso.

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
}

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.