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
  ...
}
Casey Watson
sumber

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.

FlySwat
sumber
68
if (element.nodeName == "A") {
 ...
} else if (element.nodeName == "TD") {
 ...
}
bobwienholt.dll
sumber
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

roenving
sumber
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
6

roenving benar TAPI Anda perlu mengubah tes menjadi:

if (element.nodeType == 1) {
//kode
}

karena nodeType 3 sebenarnya adalah node teks dan nodeType 1 adalah elemen HTML. Lihat http://www.w3schools.com/Dom/dom_nodetype.asp

Eric Wendelin
sumber
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]").

Herbertusz
sumber
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

Vignesh Raja
sumber
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
}

nicolsondsouza
sumber