ฉันจะตรวจสอบองค์ประกอบที่มีอยู่ใน DOM ที่มองเห็นได้อย่างไร


421

คุณจะทดสอบองค์ประกอบของการดำรงอยู่ได้อย่างไรโดยไม่ต้องใช้ getElementByIdวิธีการได้อย่างไร?

ฉันได้ตั้งค่าการสาธิตสดสำหรับการอ้างอิง ฉันจะพิมพ์รหัสที่นี่เช่นกัน:

<!DOCTYPE html>
<html>
<head>
    <script>
    var getRandomID = function (size) {
            var str = "",
                i = 0,
                chars = "0123456789abcdefghijklmnopqurstuvwxyzABCDEFGHIJKLMNOPQURSTUVWXYZ";
            while (i < size) {
                str += chars.substr(Math.floor(Math.random() * 62), 1);
                i++;
            }
            return str;
        },
        isNull = function (element) {
            var randomID = getRandomID(12),
                savedID = (element.id)? element.id : null;
            element.id = randomID;
            var foundElm = document.getElementById(randomID);
            element.removeAttribute('id');
            if (savedID !== null) {
                element.id = savedID;
            }
            return (foundElm) ? false : true;
        };
    window.onload = function () {
        var image = document.getElementById("demo");
        console.log('undefined', (typeof image === 'undefined') ? true : false); // false
        console.log('null', (image === null) ? true : false); // false
        console.log('find-by-id', isNull(image)); // false
        image.parentNode.removeChild(image);
        console.log('undefined', (typeof image === 'undefined') ? true : false); // false ~ should be true?
        console.log('null', (image === null) ? true : false); // false ~ should be true?
        console.log('find-by-id', isNull(image)); // true ~ correct but there must be a better way than this?
    };
    </script>
</head>
<body>
    <div id="demo"></div>
</body>
</html>

โดยทั่วไปรหัสข้างต้นแสดงให้เห็นถึงองค์ประกอบที่ถูกเก็บไว้ในตัวแปรแล้วลบออกจาก DOM แม้ว่าองค์ประกอบจะถูกลบออกจาก DOM ตัวแปรยังคงรักษาองค์ประกอบเหมือนเดิมเมื่อประกาศครั้งแรก กล่าวอีกนัยหนึ่งมันไม่ใช่การอ้างอิงสดถึงองค์ประกอบ แต่เป็นการจำลอง ดังนั้นการตรวจสอบค่าของตัวแปร (องค์ประกอบ) สำหรับการมีอยู่จะให้ผลลัพธ์ที่ไม่คาดคิด

isNullฟังก์ชั่นเป็นความพยายามของฉันที่จะตรวจสอบสำหรับการดำรงอยู่ขององค์ประกอบจากตัวแปรและการทำงาน แต่ผมอยากจะทราบว่ามีวิธีที่ง่ายขึ้นเพื่อให้บรรลุผลเดียวกัน

PS: ฉันยังสนใจว่าทำไมตัวแปร JavaScript ที่ทำตัวเป็นแบบนี้ถ้าใครรู้บทความดีๆเกี่ยวกับเรื่องนี้


18
จริงๆแล้วมันเป็นการอ้างอิงสดไปยังองค์ประกอบเองมันไม่ได้อยู่ในเอกสารอีกแล้ว จำเป็นต้องใช้ฟังก์ชั่นนั้นเพราะคุณสามารถดึงองค์ประกอบออกจาก DOM แล้วนำกลับมาใช้ใหม่ในภายหลังโดยที่ตัวจัดการเหตุการณ์ / etc ทั้งหมดยังคงเชื่อมต่ออยู่ ทำไมตัวแปร JS ถึงทำแบบนั้น? เพราะมันจะน่ารำคาญอย่างไม่น่าเชื่อถ้าพวกเขาไม่ได้ JS ลบเฉพาะตัวแปรเมื่อคุณไม่มีการอ้างอิงใด ๆ อีกต่อไป ภาษาไม่มีหนทางที่จะรู้ว่าการอ้างอิงใดที่คุณคิดว่าสำคัญและสิ่งที่คุณคิดว่าไร้ค่า
Mark Kahn

@cwolves ที่น่าสนใจ ฉันเคยพบเจอมาหลายครั้งแล้วและไม่เคยคิดถึงมันมากนัก ในความเป็นจริงในโครงการปัจจุบันของฉันฉันบันทึกองค์ประกอบในอาร์เรย์ก่อนที่ฉันจะทำการเปลี่ยนแปลงใด ๆ กับพวกเขาในกรณีที่ฉันต้องการที่จะกลับการเปลี่ยนแปลง
จัสตินกระทิง

1
การรวบรวมขยะจะดำเนินการเป็นครั้งคราวและจะลบทุกอย่างที่คิดว่าทำได้ ดูเหมือนว่าเบราว์เซอร์ส่วนใหญ่จะค่อนข้างสวย แต่กำลังดีขึ้นเนื่องจากนักพัฒนาทราบว่าเบราว์เซอร์บางตัวทำงานเป็นเวลาหลายวันหรือหลายสัปดาห์ระหว่างการรีสตาร์ทดังนั้นการรวบรวมขยะที่ดีจึงมีความสำคัญต่อประสิทธิภาพของเบราว์เซอร์ นักพัฒนาเว็บสามารถช่วยด้วยการลบคุณสมบัติ (และอ้างอิงถึงสิ่งต่าง ๆ ในหน่วยความจำ) ที่ไม่ต้องการอีกต่อไป
RobG

2
@JustinBull ระมัดระวังการเก็บสำเนาขององค์ประกอบเพื่อย้อนกลับ เมื่อจัดเก็บองค์ประกอบ DOM ในอาร์เรย์การอ้างอิงไปยังองค์ประกอบ DOM จะถูกเก็บไว้ไม่ใช่การคัดลอกดังนั้นการเปลี่ยนแปลงที่เกิดขึ้นกับองค์ประกอบ DOM จะสะท้อนให้เห็นเมื่ออ้างอิงถึงองค์ประกอบของอาร์เรย์ นี่เป็นกรณีที่มีวัตถุทั้งหมดในจาวาสคริปต์ (ตัวแปรประเภท 'วัตถุ')
Anthony DiSanti

คำตอบ:


545

ดูเหมือนว่าบางคนกำลังลงจอดที่นี่และต้องการทราบว่ามีองค์ประกอบอยู่หรือไม่ (แตกต่างจากคำถามเดิมเล็กน้อย)

นั่นเป็นธรรมดาที่ใช้ใด ๆ ของการเลือกวิธีเบราว์เซอร์และการตรวจสอบสำหรับtruthyค่า (ทั่วไป)

ตัวอย่างเช่นหากองค์ประกอบidของ"find-me"ฉันฉันสามารถใช้ ...

var elementExists = document.getElementById("find-me");

nullนี้จะถูกระบุอย่างใดอย่างหนึ่งกลับอ้างอิงถึงองค์ประกอบหรือ หากคุณต้องมีค่าบูลีนเพียงแค่โยน a !!ก่อนการเรียกเมธอด

นอกจากนี้คุณสามารถใช้วิธีการอื่น ๆ ที่มีอยู่เพื่อค้นหาองค์ประกอบเช่น (ทุกสิ่งมีชีวิตdocument):

  • querySelector()/querySelectorAll()
  • getElementsByClassName()
  • getElementsByName()

บางส่วนของวิธีการเหล่านี้กลับมาNodeListเพื่อให้แน่ใจว่าการตรวจสอบของlengthสถานที่ให้บริการเพราะNodeListเป็นวัตถุและดังนั้นจึงtruthy


สำหรับจริงการกำหนดว่าเป็นองค์ประกอบที่มีอยู่เป็นส่วนหนึ่งของ DOM ที่มองเห็นได้ (เช่นคำถามเดิมถาม) Csuwldcat ให้แก้ปัญหาที่ดีกว่าการกลิ้งของคุณเอง (เป็นคำตอบนี้เคยมี) นั่นคือการใช้วิธีการในองค์ประกอบ DOMcontains()

คุณสามารถใช้มันอย่างนั้น ...

document.body.contains(someReferenceToADomElement);

1
สิ่งที่ฉันกำลังมองหา! เห็นได้ชัดเลยว่าทำไมฉันไม่คิดอย่างนั้น นอกจากนี้คุณรู้บทความที่ดีที่อธิบายว่าทำไมตัวแปรทำหน้าที่เช่นนี้หรือไม่
Justin Bull

3
ยิ่งสั้นไปกว่า:var elementInDom = function( el ) { while ( el = el.parentNode ) if ( el === document ) return true; return false; }
bennedich

2
@ButtleButkus อ่านคำถามจริง วิธีแก้ปัญหาที่คุณใช้ไม่สมเหตุสมผลเท่าที่getElementById() จะส่งคืนการอ้างอิงไปยังองค์ประกอบ DOM หรือnullดังนั้นการใช้typeof(โดยเฉพาะอย่างยิ่งใน RHS) นั้นผิด (หากไม่ได้กำหนดไว้เงื่อนไข LHS จะส่ง a ReferenceError)
alex

2
มีเหตุผลใดบ้างที่จะใช้สิ่งนี้กับสิ่งที่โพสต์ด้านล่าง: document.body.contains()ซึ่งดูเหมือนว่าจะมีการสนับสนุนเบราว์เซอร์ที่ดีมาก?
บดขยี้

1
@Jonz ลบส่วนคำตอบเก่าอย่าลืมที่จะไปและลงคะแนนcsuwldcat
alex

310

ใช้getElementById()ถ้ามันใช้ได้

นอกจากนี้ต่อไปนี้เป็นวิธีง่ายๆในการทำกับ jQuery:

if ($('#elementId').length > 0) {
  // Exists.
}

และหากคุณไม่สามารถใช้ห้องสมุดบุคคลที่สามได้เพียงใช้ฐาน JavaScript:

var element =  document.getElementById('elementId');
if (typeof(element) != 'undefined' && element != null)
{
  // Exists.
}

2
สำหรับโครงการที่ฉันทำงานอยู่ฉันไม่สามารถใช้ห้องสมุดได้ Good-ol 'รหัสดิบแฟชั่นเท่านั้น ฉันตระหนักถึงวิธีการ jQuery ว่า แต่มันไม่ทำงานกับองค์ประกอบที่ไม่ได้ห่อในภาชนะ jQuery ตัวอย่างเช่น$('#elementId')[0].lengthจะไม่ให้ผลลัพธ์เดียวกัน
Justin Bull

8
มีเหตุผลที่ดีสำหรับความซับซ้อนเช่นนี้ถ้าคำสั่งในตัวอย่างรหัสที่สอง? ทำไมไม่ง่าย ๆif (element) {}? เมื่อองค์ประกอบไม่ได้กำหนดหรือ null แล้วการแสดงออกนี้เป็นเท็จ หากองค์ประกอบเป็นองค์ประกอบ DOM แล้วการแสดงออกเป็นจริง
kayahr

2
@kayahr มันซับซ้อนเกินไป getElementById()เป็น spec'd จะกลับมาnullถ้ามันไม่ได้หาองค์ประกอบเพื่อตรวจสอบหาtruthyค่าที่ส่งกลับเป็นสิ่งที่จำเป็น
alex

5
ฉันคิดว่ามันเป็นแค่สามัญสำนึก
Kon

8
getElementByIdundefinedไม่ควรกลับมา ในกรณีใด ๆ การelement != nullตรวจสอบจะรับนี้

191

การใช้Node.contain DOM APIคุณสามารถตรวจสอบว่ามีองค์ประกอบใด ๆ ในหน้า (อยู่ใน DOM) ได้อย่างง่ายดาย:

document.body.contains(YOUR_ELEMENT_HERE);

CROSS-BROWSER หมายเหตุ : documentวัตถุใน Internet Explorer ไม่มีcontains()วิธีการ - เพื่อให้แน่ใจถึงความเข้ากันได้ของเบราว์เซอร์ข้ามให้ใช้document.body.contains()แทน


4
ดูเหมือนจะเป็นคำตอบสุดท้ายสำหรับปัญหานี้ ... และการสนับสนุนหากเชื่อว่า MDN นั้นดีมาก
บดขยี้

2
นี่คือคำตอบที่ดีที่สุด โปรดทราบว่าการตรวจสอบdocument.contains()ควรจะเพียงพอ
alex

@csuwldcat จะทำงานให้ฉันอย่างน้อยใน Chrome document.contains(document.documentElement)ด้วย documentมีNodeในห่วงโซ่ต้นแบบเท่าที่ฉันสามารถบอกได้ ( document-> HTMLDocument-> Document-> Node)
alex

4
นี่เป็นคำตอบที่ดีที่สุด: - เป็นเว็บมาตรฐาน - ได้รับการสนับสนุนเป็นอย่างดี (ค่อนข้างแปลกใจที่ไม่ปรากฏใน Firefox จนถึงรุ่น 9 ฉันเดาเพราะมันเป็นฟังก์ชั่นที่ไม่ได้มาตรฐานที่คิดค้นใน IE ที่ไม่ได้มาตรฐาน มาตรฐานจนกระทั่งต่อมา) - จะต้องเร็วที่สุดเพราะใช้การเรียก API แบบเนทีฟครั้งเดียว
Jon z

2
@LeeSaxon ไวยากรณ์คือdocument.body.contains([selector])คือdocument.body.contains(document.getElementById('div')
iglesiasedd

67

ฉันแค่ทำ:

if(document.getElementById("myElementId")){
    alert("Element exists");
} else {
    alert("Element does not exist");
}

มันใช้งานได้สำหรับฉันและยังไม่มีปัญหากับมัน ...


1
นี่ไม่เกี่ยวอะไรกับคำถามต้นฉบับเลย OP ต้องการทราบว่าการอ้างอิงถึงองค์ประกอบ DOM เป็นส่วนหนึ่งของ DOM ที่มองเห็นได้หรือไม่
alex

16
ช่วยฉันด้วย ฉันกำลังมองหาการทดสอบองค์ประกอบอย่างง่าย ๆ สิ่งนี้ใช้ได้ผล ขอบคุณ
khaverim

1
คำตอบนี้ทำงานได้ดี idแต่เมื่อองค์ประกอบที่มี ทางออกที่ดีกว่าที่ตอบคำถามวิธีการตรวจสอบว่าองค์ประกอบที่มีอยู่ใน DOM ที่มองเห็นได้อย่างไร มีองค์ประกอบใดองค์ประกอบแม้จะไม่ได้คือการทำid document.body.contains(element)
Edward

@Edward นี่เป็นสิ่งที่แตกต่างอย่างสิ้นเชิงกับcontains()
alex

ฉันเข้าใจ. ฉันแค่เสนอความคิดเห็นของฉันว่าคำตอบอื่นดีกว่าและเหมาะสมกว่าสำหรับคำถาม
Edward

11

คุณสามารถตรวจสอบเพื่อดูว่าคุณสมบัติ parentNode เป็นโมฆะหรือไม่

นั่นคือ,

if(!myElement.parentNode)
{
    // The node is NOT in the DOM
}
else
{
    // The element is in the DOM
}

ฉันรู้ว่านี่เป็นคำถามเก่า แต่คำตอบนี้เป็นวิธีการแก้ปัญหาที่เรียบง่ายและสง่างามสำหรับคำถามที่ฉันกำลังมองหา
poby

11
@poby: มันอาจดูสง่า แต่ก็ไม่ได้ทำตามที่ขอจริงๆ มันจะตรวจสอบว่าองค์ประกอบนั้นมีองค์ประกอบหลักหรือไม่ สิ่งนี้ไม่ได้หมายความว่าองค์ประกอบนั้นอยู่ใน DOM ที่มองเห็นได้เพราะบางทีองค์ประกอบหลักไม่ได้เชื่อมต่ออยู่
kayahr

หนึ่งจะต้องผ่านผู้ปกครองของผู้ปกครองทั้งหมดเพื่อดูว่าคนสุดท้ายเป็นเอกสาร ปัญหาอื่นคือยังคงอยู่นอกช่วงที่มองเห็นหรือครอบคลุมหรือมองไม่เห็นเนื่องจากเหตุผลอื่น ๆ
Arek Bal

องค์ประกอบอาจมี parentNode โดยอาศัยการผนวกเข้ากับส่วนของเอกสาร

11

จากMozilla Developer Network :

ฟังก์ชันนี้ตรวจสอบเพื่อดูว่าองค์ประกอบอยู่ในเนื้อหาของหน้าหรือไม่ ตามที่มี () รวมอยู่ด้วยและการพิจารณาว่าเนื้อหามีตัวเองไม่ใช่ความตั้งใจของ isInPage กรณีนี้จะส่งกลับเท็จอย่างชัดเจน

function isInPage(node) {
  return (node === document.body) ? false : document.body.contains(node);
}

nodeเป็นโหนดที่เราต้องการตรวจสอบใน <body>


+1 นี้ใช้งานได้กับโหนดข้อความ (โดยพลการ) หรือโหนดความคิดเห็นด้วยหรือไม่
Nikos M.

@NikosM ควรทำงานในแท็ก html ใดก็ได้ แต่ฉันไม่ได้ทดสอบ
Ekramul Hoque

4
ไม่ควรfalseจะเป็นtrue?
Marc-André Lafortune

ถ้าnodeเป็นdocument.bodyแน่นอนวิธีควรจะกลับมาtrue? เช่น,return (node === document.body) || document.body.contains(node);
daiscog

7

วิธีที่ง่ายที่สุดคือการตรวจสอบคุณสมบัติbaseURIซึ่งถูกตั้งค่าเฉพาะเมื่อองค์ประกอบถูกแทรกใน DOM และมันจะเปลี่ยนเป็นสตริงว่างเปล่าเมื่อมันถูกลบออก

var div = document.querySelector('div');

// "div" is in the DOM, so should print a string
console.log(div.baseURI);

// Remove "div" from the DOM
document.body.removeChild(div);

// Should print an empty string
console.log(div.baseURI);
<div></div>


5
ฉันไม่รู้ด้วยซ้ำว่ามีคุณสมบัติ baseURI บนโหนด DOM สิ่งที่ฉันชอบเกี่ยวกับวิธีการนี้คือมันใช้คุณสมบัติขององค์ประกอบเองซึ่งน่าจะหมายความว่ามันจะทำงานได้แม้ว่าองค์ประกอบนั้นจะอยู่ในเอกสารอื่น (เช่น iframe) สิ่งที่ฉันไม่ชอบเกี่ยวกับมันคือมันดูเหมือนจะไม่ทำงานนอก Webkit
DoctorDestructo

Cannot read property 'baseURI' of nullโปรดใช้ความระมัดระวังเช่นนี้จะโยนความผิดพลาดต่อไปนี้ถ้าองค์ประกอบไม่ได้อยู่ในเอกสาร: ตัวอย่าง:console.log(document.querySelector('aside').baseURI)
Ian Davis

ไม่สามารถใช้วิธีนี้ได้เนื่องจากจะพิมพ์สตริงเดิมเสมอ
Kagami Sascha Rosylight

4

โซลูชั่น jQuery:

if ($('#elementId').length) {
    // element exists, do something...
}

สิ่งนี้ใช้ได้กับฉันโดยใช้ jQuery และไม่จำเป็นต้อง$('#elementId')[0]ใช้


ทำไม$('#elementId')[0]บางสิ่งต้องหลีกเลี่ยง
alex

นานมาแล้วที่ฉันตอบคำถามนี้ดังนั้นการใช้ $ ('# elementId') [0] ฉันเชื่อว่าคุณมักจะระบุว่าค่าจะอยู่ที่ดัชนีที่ 0 วิธีนี้คุณจะตรวจสอบองค์ประกอบที่เกิดขึ้นครั้งแรกเสมอ มีช่องทำเครื่องหมายหลายช่องที่มีชื่อเหมือนกันดังนั้นจึงเหมือนปุ่มตัวเลือก เวลานั้นความยาวจะเป็นประโยชน์
รหัสบัสเตอร์

3

โซลูชันของ csuwldcatนั้นดีที่สุดในกลุ่ม แต่จำเป็นต้องมีการแก้ไขเล็กน้อยเพื่อให้ทำงานได้อย่างถูกต้องกับองค์ประกอบที่อยู่ในเอกสารที่แตกต่างจากรหัส JavaScript ที่กำลังทำงานเช่น iframe:

YOUR_ELEMENT.ownerDocument.body.contains(YOUR_ELEMENT);

โปรดสังเกตการใช้ownerDocumentคุณสมบัติขององค์ประกอบต่างจากเดิมเพียงอย่างเดียวdocument(ซึ่งอาจหรืออาจไม่อ้างอิงเอกสารเจ้าขององค์ประกอบ)

torazaburo โพสต์วิธีการได้ง่ายว่ายังทำงานร่วมกับองค์ประกอบที่ไม่ใช่ท้องถิ่น แต่โชคไม่ดีที่จะใช้baseURIทรัพย์สินซึ่งไม่ได้ดำเนินการอย่างสม่ำเสมอเบราว์เซอร์ในขณะนี้ (ฉันเท่านั้นที่จะได้รับมันในการทำงานในWebKitคน-based) ฉันไม่สามารถหาองค์ประกอบหรือคุณสมบัติของโหนดอื่น ๆ ที่สามารถใช้ในรูปแบบที่คล้ายกันดังนั้นฉันคิดว่าในขณะที่การแก้ปัญหาข้างต้นเป็นสิ่งที่ดีเท่าที่ได้รับ


3

แทนที่จะเป็นผู้ปกครองซ้ำคุณสามารถรับสี่เหลี่ยม bounding ซึ่งเป็นศูนย์ทั้งหมดเมื่อองค์ประกอบถูกแยกออกจาก DOM:

function isInDOM(element) {
    if (!element)
        return false;
    var rect = element.getBoundingClientRect();
    return (rect.top || rect.left || rect.height || rect.width)?true:false;
}

หากคุณต้องการจัดการกับตัวเรือนขอบขององค์ประกอบความกว้างและความสูงเป็นศูนย์ที่ด้านบนเป็นศูนย์และด้านซ้ายเป็นศูนย์คุณสามารถตรวจสอบซ้ำได้โดยทำซ้ำผู้ปกครองจนถึงdocument.body:

function isInDOM(element) {
    if (!element)
        return false;
    var rect = element.getBoundingClientRect();
    if (element.top || element.left || element.height || element.width)
        return true;
    while(element) {
        if (element == document.body)
            return true;
        element = element.parentNode;
    }
    return false;
}

สิ่งนี้ทำให้เค้าโครงใหม่: gist.github.com/paulirish/5d52fb081b3570c81e3a#box-metrics
Steven Vachon

3

วิธีง่ายๆในการตรวจสอบว่าองค์ประกอบมีอยู่สามารถทำได้ผ่านรหัสหนึ่งบรรทัดของ jQuery

นี่คือรหัสด้านล่าง:

if ($('#elementId').length > 0) {
    // Do stuff here if the element exists
} else {
    // Do stuff here if the element does not exist
}


2

รหัสนี้ใช้ได้สำหรับฉันและฉันไม่มีปัญหาใด ๆ กับมัน


    if(document.getElementById("mySPAN")) {
        // If the element exists, execute this code
        alert("Element exists");
    }
    else {
        // If the element does not exist execute this code
        alert("Element does not exists");
    }

1

นอกจากนี้คุณยังสามารถใช้jQuery.containsซึ่งจะตรวจสอบว่าองค์ประกอบเป็นลูกหลานขององค์ประกอบอื่น ฉันผ่านในการdocumentเป็นองค์ประกอบหลักในการค้นหาเพราะองค์ประกอบใด ๆ ที่มีอยู่บน DOM documentหน้าเป็นลูกหลานของ

jQuery.contains( document, YOUR_ELEMENT)

1

ตรวจสอบว่าองค์ประกอบเป็นลูกของ<html>ผ่านNode::contains():

const div = document.createElement('div');
document.documentElement.contains(div); //-> false

document.body.appendChild(div);
document.documentElement.contains(div); //-> true

ฉันได้รับการคุ้มครองนี้และอื่น ๆ ในการเป็น-Dom แฝด


1

ทางออกที่ง่ายด้วย jQuery:

$('body').find(yourElement)[0] != null

2
... หรือ$(document).find(yourElement).length !== 0
Grinn

1
null == undefinedการหาประโยชน์นี้ว่า undefinedค่ากลับมาจริงจะเป็น เปรียบเทียบกับnullเป็นบิตแปลก
alex

1
// This will work prefectly in all :D
function basedInDocument(el) {

    // This function is used for checking if this element in the real DOM
    while (el.parentElement != null) {
        if (el.parentElement == document.body) {
            return true;
        }
        el = el.parentElement; // For checking the parent of.
    } // If the loop breaks, it will return false, meaning
      // the element is not in the real DOM.

    return false;
}

ในทุกสิ่ง ทุกกรณี?
Peter Mortensen

1
  • หากองค์ประกอบอยู่ในองค์ประกอบDOMผู้ปกครองก็ควรอยู่ด้วย
  • และปู่ย่าตายายคนสุดท้ายควรเป็น document

เพื่อตรวจสอบว่าเราแค่วนรอบองค์ประกอบของ parentNodeต้นไม้จนกว่าเราจะถึงปู่ย่าตายายสุดท้าย

ใช้สิ่งนี้:

/**
 * @param {HTMLElement} element - The element to check
 * @param {boolean}     inBody  - Checks if the element is in the body
 * @return {boolean}
 */
var isInDOM = function(element, inBody) {
    var _ = element, last;

    while (_) {
        last = _;
        if (inBody && last === document.body) { break;}
        _ = _.parentNode;
    }

    return inBody ? last === document.body : last === document;
};

2
นี่อาจเป็นคำตอบที่ดีที่สุดเนื่องจากไม่ทำให้เกิดการแสดงผลซ้ำใน DOM
Steven Vachon

คำอธิบายจะเป็นไปตามลำดับ (ตอบโดยแก้ไขคำตอบของคุณไม่ใช่ที่นี่ในความคิดเห็น)
Peter Mortensen

0

ฉันชอบวิธีนี้:

var elem = document.getElementById('elementID');

if (elem)
    do this
else
    do that

ด้วย

var elem = ((document.getElementById('elemID')) ? true:false);

if (elem)
    do this
else
    do that

1
ทำไมไม่เพียงแค่!!คุณต้องการบูลีน
alex

ดังนั้นถ้าองค์ประกอบไม่มี id แสดงว่าไม่มีใน DOM? ฉันว่านี่มันผิด
Steven Vachon

0

ใช้querySelectorAllกับforEach,

document.querySelectorAll('.my-element').forEach((element) => {
  element.classList.add('new-class');
});

ตรงข้ามกับ:

const myElement = document.querySelector('.my-element');
if (myElement) {
  element.classList.add('new-class');
}

0

ลองทำสิ่งต่อไปนี้ มันเป็นทางออกที่น่าเชื่อถือที่สุด:

window.getComputedStyle(x).display == ""

ตัวอย่างเช่น,

var x = document.createElement("html")
var y = document.createElement("body")
var z = document.createElement("div")
x.appendChild(y);
y.appendChild(z);

z.style.display = "block";

console.log(z.closest("html") == null); // 'false'
console.log(z.style.display); // 'block'
console.log(window.getComputedStyle(z).display == ""); // 'true'

1
สิ่งนี้อาจทำให้เกิดการจัดวางใหม่: gist.github.com/paulirish/5d52fb081b3570c81e3a#getcomputedstyle
Steven Vachon

0

องค์ประกอบที่มีอยู่ทั้งหมดมีชุด parentElement ยกเว้นองค์ประกอบ HTML!

function elExists (e) { 
    return (e.nodeName === 'HTML' || e.parentElement !== null);
};

มันเป็น"HTML"เสมอหรือไม่ มันอาจจะเป็น"HTML" ?
Peter Mortensen

x.tagName หรือ x.nodeName เป็นตัวพิมพ์ใหญ่เสมอไม่ว่าคุณจะเขียนมันอย่างไรในโค้ดของคุณ
Jonah

0

เงื่อนไขนี้เจี๊ยบทุกกรณี

function del() {
//chick if dom has this element 
//if not true condition means null or undifind or false .

if (!document.querySelector("#ul_list ")===true){

// msg to user
    alert("click btn load ");

// if console chick for you and show null clear console.
    console.clear();

// the function will stop.
    return false;
}

// if its true function will log delet .
console.log("delet");

}


0

ฉันชอบใช้node.isConnectedอสังหาริมทรัพย์ ( เยี่ยมชม MDN )

หมายเหตุ: สิ่งนี้จะส่งคืนจริงถ้าองค์ประกอบถูกผนวกเข้ากับ ShadowRoot เช่นกันซึ่งอาจไม่ใช่ทุกคนที่ต้องการพฤติกรรม

ตัวอย่าง:

const element = document.createElement('div');
console.log(element.isConnected); // Returns false
document.body.append(element);
console.log(element.isConnected); // Returns true
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.