Kiểm tra loại phần tử DOM trong JavaScript


98

Có cách nào để kiểm tra loại phần tử trong JavaScript không?

Câu trả lời có thể yêu cầu hoặc không yêu cầu thư viện nguyên mẫu, tuy nhiên thiết lập sau sử dụng thư viện.

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

Câu trả lời:


125

Bạn có thể sử dụng typeof(N)để lấy loại đối tượng thực, nhưng những gì bạn muốn làm là kiểm tra thẻ, không phải loại của phần tử DOM.

Trong trường hợp đó, hãy sử dụng elem.tagNamehoặc thuộc elem.nodeNametính.

nếu bạn muốn thực sự sáng tạo, bạn có thể sử dụng từ điển các tên thẻ và các cụm từ ẩn danh để thay thế nếu chuyển đổi hoặc if / else.


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

1
Đôi khi đúng như vậy. Dù sao, bạn luôn có thể sử dụng element.nodeName.match(/\bTBODY\b/i)hoặc element.nodeName.toLowerCase() == 'tbody'v.v.
Robusto

9
@Robusto không chính xác. Nếu tài liệu là HTML và việc triển khai DOM là chính xác, nó sẽ luôn là chữ hoa. Theo: w3.org/TR/DOM-Level-3-Core/core.html#ID-104682815 trong phần "tagName" (đối với phần tử nodeName == tagName) "HTML DOM trả về tagName của một phần tử HTML trong dạng chữ hoa chuẩn, bất kể trường hợp nào trong tài liệu HTML nguồn. "
bobwienholt

19

Có lẽ bạn cũng sẽ phải kiểm tra kiểu gật đầu:

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

Chỉnh sửa: Đã sửa giá trị nodeType


3
Hãy cẩn thận với trường hợp của tagName.
mí mắt

@Casey: Nó sẽ có trong một trang HTML; trong trang XHTML, trường hợp của thẻ được giữ nguyên (vì vậy "a" sẽ là "A" trong các trang HTML và "a" trong các trang XHTML): w3.org/TR/2000/REC-DOM-Level-2- Core-20001113 /… (Giả sử trang XHTML đã được phân phối chính xác và không được phân phát như vậy text/html.)
TJ Crowder

2
@TJCrowder như vậy có vẻ như lựa chọn tốt nhất làelement.tagName.toLowerCase() === 'a'
p3drosola

@Ped: Có, hoặc element.nodeName.toLowerCase()nếu có thể nó elementkhông thực sự là một phần tử (ví dụ: nếu bạn chưa thực hiện nodeType == 1kiểm tra được liệt kê ở trên). Các Nodegiao diện có nodeName. Đối với các Elementtrường hợp, nó giống như tagName. Đối với các loại nút khác, đó là những thứ như "#text"hoặc "#document". nodeTypeMặc dù vậy, tôi nghĩ tôi luôn sử dụng séc.
TJ Crowder

Bản cập nhật năm 2019: ít nhất là trên Chromium hiện đại (v79.0.3945.79), chuỗi thẻ tên là chữ hoa. "Đối với cây DOM đại diện cho tài liệu HTML, tên thẻ được trả về luôn ở dạng chữ hoa chuẩn. Ví dụ: tagName được gọi trên phần tử <div> trả về" DIV " https://developer.mozilla.org/en- US / docs / Web / API / Element / tagName cách chính xác để so sánh sẽ lànode.tagName == 'DIV'
marcs


2

Tôi thường lấy nó từ giá trị trả về toString (). Nó hoạt động trong các phần tử DOM được truy cập khác nhau:

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

Sau đó, phần liên quan:

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

Nó hoạt động trong Chrome, FF, Opera, Edge, IE9 + (trong IE cũ hơn, nó trả về "[object Object]").


2

Mặc dù các câu trả lời trước hoạt động hoàn hảo, tôi sẽ chỉ thêm một cách khác mà các phần tử cũng có thể được phân loại bằng cách sử dụng giao diện mà chúng đã triển khai.

Tham khảo W3 Org để biết các giao diện có sẵ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">

Kiểm tra giao diện có thể được thực hiện theo 2 cách elem instanceof HTMLAnchorElementhoặc elem.constructor.name == "HTMLAnchorElement"cả hai đều trả vềtrue


0

Tôi có một cách khác để kiểm tra tương tự.

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
}

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.