Menguji jenis elemen DOM di JavaScript


99

Adakah cara untuk menguji jenis elemen di JavaScript?

Jawabannya mungkin atau mungkin tidak memerlukan pustaka prototipe, namun penataan berikut ini menggunakan pustaka.

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

Jawaban:


125

Anda bisa menggunakan typeof(N)untuk mendapatkan tipe objek sebenarnya, tetapi yang ingin Anda lakukan adalah memeriksa tag, bukan tipe elemen DOM.

Dalam hal ini, gunakan properti elem.tagNameatau elem.nodeName.

jika Anda ingin menjadi benar-benar kreatif, Anda dapat menggunakan kamus tagnames dan penutupan anonim sebagai gantinya jika switch atau if / else.


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

1
Terkadang memang begitu. Bagaimanapun, Anda selalu dapat menggunakan element.nodeName.match(/\bTBODY\b/i)atau element.nodeName.toLowerCase() == 'tbody'dll.
Robusto

9
@Robo salah. Jika dokumennya HTML dan penerapan DOM benar, itu akan selalu dalam huruf besar. Menurut: w3.org/TR/DOM-Level-3-Core/core.html#ID-104682815 di bawah bagian "tagName" (untuk elemen nodeName == tagName) "DOM HTML mengembalikan tagName dari elemen HTML di bentuk huruf besar kanonis, apa pun kasusnya di dokumen HTML sumber. "
bobwienholt

19

Mungkin Anda harus memeriksa nodetype juga:

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: Memperbaiki nilai nodeType


3
Waspadai kasus tagName.
Kelopak mata

@ Casey: Ini akan di halaman HTML; di halaman XHTML kasus tag dipertahankan (jadi "a" akan menjadi "A" di halaman HTML, dan "a" di halaman XHTML): w3.org/TR/2000/REC-DOM-Level-2- Core-20001113 /… (Dengan asumsi halaman XHTML telah disajikan dengan benar dan tidak disajikan sebagai text/html.)
TJ Crowder

2
@TJCrowder jadi sepertinya pilihan terbaik adalahelement.tagName.toLowerCase() === 'a'
p3drosola

@Ped: Ya, atau element.nodeName.toLowerCase()jika mungkin itu elementtidak benar-benar menjadi elemen (misalnya, jika Anda belum melakukan nodeType == 1pemeriksaan yang tercantum di atas). The Nodeantarmuka memiliki nodeName. Untuk Elementcontoh, itu sama dengan tagName. Untuk jenis node lain, itu seperti "#text"atau "#document". Saya pikir saya akan selalu menggunakan nodeTypecek itu.
TJ Crowder

Pembaruan 2019: setidaknya di Chromium modern (v79.0.3945.79) string tagname adalah huruf besar. "Untuk pohon DOM yang mewakili dokumen HTML, nama tag yang dikembalikan selalu dalam bentuk huruf besar kanonis. Misalnya, tagName yang dipanggil pada elemen <div> mengembalikan" DIV " https://developer.mozilla.org/en- US / docs / Web / API / Element / tagName Cara yang benar untuk membandingkan adalahnode.tagName == 'DIV'
marcs


2

Saya biasanya mendapatkannya dari nilai pengembalian toString (). Ia bekerja di elemen DOM yang diakses berbeda:

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

Kemudian bagian yang relevan:

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

Ia bekerja di Chrome, FF, Opera, Edge, IE9 + (di IE yang lebih lama ia mengembalikan "[Object Object]").


2

Meskipun jawaban sebelumnya berfungsi dengan sempurna, saya hanya akan menambahkan cara lain di mana elemen juga dapat diklasifikasikan menggunakan antarmuka yang telah mereka terapkan.

Lihat W3 Org untuk antarmuka yang tersedia

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

Pemeriksaan antarmuka dapat dilakukan dengan 2 cara sebagai elem instanceof HTMLAnchorElementatau elem.constructor.name == "HTMLAnchorElement", keduanya kembalitrue


0

Saya memiliki cara lain untuk menguji hal yang sama.

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
}

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.