การทดสอบประเภทขององค์ประกอบ DOM ใน JavaScript


100

มีวิธีทดสอบประเภทขององค์ประกอบใน JavaScript หรือไม่?

คำตอบอาจต้องการไลบรารีต้นแบบหรือไม่ก็ได้ แต่การตั้งค่าต่อไปนี้จะใช้ประโยชน์จากไลบรารี

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

คำตอบ:


125

คุณสามารถใช้typeof(N)เพื่อรับประเภทออบเจ็กต์จริง แต่สิ่งที่คุณต้องการทำคือตรวจสอบแท็กไม่ใช่ประเภทขององค์ประกอบ DOM

ในกรณีนั้นให้ใช้คุณสมบัติelem.tagNameหรือelem.nodeName

หากคุณต้องการสร้างสรรค์อย่างแท้จริงคุณสามารถใช้พจนานุกรมของ tagnames และการปิดแบบไม่ระบุตัวตนแทนหากมีสวิตช์หรือ if / else


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

1
บางครั้งก็เป็น อย่างไรก็ตามคุณสามารถใช้element.nodeName.match(/\bTBODY\b/i)หรือelement.nodeName.toLowerCase() == 'tbody'อื่น ๆได้เสมอ
Robusto

9
@Robusto ไม่ถูกต้อง หากเอกสารเป็น HTML และการใช้งาน DOM ถูกต้องเอกสารนั้นจะเป็นตัวพิมพ์ใหญ่เสมอ อ้างอิงจาก: w3.org/TR/DOM-Level-3-Core/core.html#ID-104682815ภายใต้ส่วน "tagName" (สำหรับองค์ประกอบ nodeName == tagName) "DOM HTML จะส่งกลับ tagName ขององค์ประกอบ HTML ใน รูปแบบตัวพิมพ์ใหญ่ที่ยอมรับได้โดยไม่คำนึงถึงกรณีในเอกสาร HTML ต้นทาง "
bobwienholt

19

บางทีคุณอาจต้องตรวจสอบประเภทปมด้วย:

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

แก้ไข: แก้ไข nodeType-value


3
ระวังกรณีของ tagName
เปลือกตา

@ Casey: มันจะอยู่ในหน้า HTML; ในหน้า XHTML กรณีของแท็กจะถูกเก็บรักษาไว้ (ดังนั้น "a" จะเป็น "A" ในหน้า HTML และ "a" ในหน้า XHTML): w3.org/TR/2000/REC-DOM-Level-2- Core-20001113 / … (สมมติว่าหน้า XHTML ได้รับการแสดงอย่างถูกต้องและไม่ได้แสดงเป็นtext/html)
TJ Crowder

2
@TJCrowder ดังนั้นดูเหมือนว่าตัวเลือกที่ดีที่สุดคือelement.tagName.toLowerCase() === 'a'
p3drosola

@Ped: ใช่หรือelement.nodeName.toLowerCase()ถ้าเป็นไปได้ที่elementจะไม่เป็นองค์ประกอบ (เช่นหากคุณยังไม่ได้ทำnodeType == 1เช็คที่ระบุไว้ด้านบน) อินเตอร์เฟซที่มีNode nodeNameสำหรับElementอินสแตนซ์จะเหมือนกับtagName. สำหรับชนิดอื่น ๆ ของโหนดสิ่งที่มันต้องการหรือ"#text" "#document"ฉันคิดว่าฉันจะใช้nodeTypeเช็คเสมอ
TJ Crowder

การอัปเดตปี 2019: อย่างน้อยใน Chromium สมัยใหม่ (v79.0.3945.79) สตริง tagname เป็นตัวพิมพ์ใหญ่ "สำหรับโครงสร้าง DOM ซึ่งแสดงถึงเอกสาร HTML ชื่อแท็กที่ส่งคืนจะอยู่ในรูปแบบตัวพิมพ์ใหญ่ตามรูปแบบบัญญัติเสมอตัวอย่างเช่น tagName ที่เรียกบนองค์ประกอบ <div> จะส่งคืน" DIV " https://developer.mozilla.org/en- สหรัฐฯ / เอกสาร / Web / API / ธาตุ / tagname วิธีที่ถูกต้องเพื่อเปรียบเทียบจะเป็นnode.tagName == 'DIV'
Marcs

6

roenving ถูกต้อง แต่คุณต้องเปลี่ยนการทดสอบเป็น:

ถ้า (element.nodeType == 1) {
//รหัส
}

เนื่องจาก nodeType ของ 3 เป็นโหนดข้อความและ nodeType ของ 1 เป็นองค์ประกอบ HTML ดูhttp://www.w3schools.com/Dom/dom_nodetype.asp


2

ฉันมักจะได้รับจากค่าส่งคืน toString () ทำงานในองค์ประกอบ DOM ที่เข้าถึงต่างกัน:

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

จากนั้นชิ้นส่วนที่เกี่ยวข้อง:

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

ทำงานใน Chrome, FF, Opera, Edge, IE9 + (ใน IE รุ่นเก่าจะส่งคืน "[object Object]")


2

แม้ว่าคำตอบก่อนหน้านี้จะทำงานได้อย่างสมบูรณ์ แต่ฉันจะเพิ่มวิธีอื่นในการจัดประเภทองค์ประกอบโดยใช้อินเทอร์เฟซที่พวกเขานำไปใช้

อ้างถึงW3 Org สำหรับอินเทอร์เฟซที่พร้อมใช้งาน

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

การตรวจสอบอินเทอร์เฟซสามารถทำได้ 2 วิธีelem instanceof HTMLAnchorElementหรือelem.constructor.name == "HTMLAnchorElement"ทั้งส่งคืนtrue


0

ฉันมีวิธีอื่นในการทดสอบเหมือนกัน

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
}

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.