JavaScript'te bir DOM öğesinin türünü test etme


100

JavaScript'te bir öğenin türünü test etmenin bir yolu var mı?

Cevap prototip kitaplığını gerektirebilir veya gerektirmeyebilir, ancak aşağıdaki kurulum kitaplığı kullanır.

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

Yanıtlar:


125

typeof(N)Gerçek nesne türünü elde etmek için kullanabilirsiniz , ancak yapmak istediğiniz şey DOM öğesinin türünü değil, etiketi kontrol etmektir.

Bu durumda elem.tagNameveya elem.nodeNameözelliğini kullanın .

Gerçekten yaratıcı olmak istiyorsanız, bir anahtar veya if / else yerine bir etiket adı ve anonim kapatma sözlüğü kullanabilirsiniz.


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

1
Bazen öyle. Neyse, her zaman kullanabilirsiniz element.nodeName.match(/\bTBODY\b/i)ya element.nodeName.toLowerCase() == 'tbody'vs
Robusto

9
@Robusto yanlış. Belge HTML ise ve DOM uygulaması doğruysa, her zaman büyük harf olacaktır. Şuna göre: w3.org/TR/DOM-Level-3-Core/core.html#ID-104682815 "tagName" bölümü altında (nodeName == tagName öğeleri için) "HTML DOM, içindeki bir HTML öğesinin tagName değerini döndürür kaynak HTML belgesindeki büyük / küçük harfe bakılmaksızın standart büyük harf formu. "
bobwienholt

19

Belki de nodetipini de kontrol etmeniz gerekecek:

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

Düzenleme: nodeType-değeri düzeltildi


3
TagName durumuna dikkat edin.
gözkapaksızlık

@Casey: Bir HTML sayfasında olacak; bir XHTML sayfasında etiketin durumu korunur (bu nedenle "a" HTML sayfalarında "A" ve XHTML sayfalarında "a" olacaktır): w3.org/TR/2000/REC-DOM-Level-2- Core-20001113 /… (XHTML sayfasının doğru bir şekilde sunulduğu ve olarak sunulmadığı varsayılırsa text/html)
TJ Crowder

2
@TJCrowder, en iyi seçenek gibi görünüyorelement.tagName.toLowerCase() === 'a'
p3drosola

@Ped: Evet, ya da element.nodeName.toLowerCase()mümkünse bu elementaslında bir öğe olmayacak (örneğin, nodeType == 1yukarıda listelenen kontrolü yapmadıysanız ). NodeArayüzüne sahiptir nodeName. İçin Elementdurumlarda, bu aynı şey tagName. Diğer düğüm türleri için, "#text"veya gibi şeyler "#document". Sanırım her zaman kullanırımnodeType çek .
TJ Crowder

2019 güncellemesi: en azından modern Chromium'da (v79.0.3945.79) tagname dizesi büyük harflidir. "HTML belgelerini temsil eden DOM ağaçları için, döndürülen etiket adı her zaman standart büyük harf biçimindedir. Örneğin, <div> öğesinde çağrılan tagName," DIV " https://developer.mozilla.org/en- döndürür US / docs / Web / API / Element / tagName karşılaştırmanın doğru yolu şu olacaktırnode.tagName == 'DIV'
marcs


2

Genellikle toString () dönüş değerinden alıyorum. Farklı erişilen DOM öğelerinde çalışır:

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

Ardından ilgili parça:

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

Chrome, FF, Opera, Edge, IE9 + 'da çalışır (eski IE'de "[object Object]" döndürür).


2

Önceki cevaplar mükemmel çalışsa da, öğelerin uyguladıkları arayüz kullanılarak da sınıflandırılabileceği başka bir yol ekleyeceğim.

Kullanılabilir arayüzler için W3 Org'a bakın

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

Arayüz kontrolü , her iki dönüş olarak elem instanceof HTMLAnchorElementveya elem.constructor.name == "HTMLAnchorElement"her iki şekilde de 2 şekilde yapılabilirtrue


0

Aynısını test etmenin başka bir yolu var.

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
}

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.