ฉันแค่ต้องแบ่งปัน 'ของฉัน'
แม้ว่าแนวความคิดจะเหมือนกับคำตอบของ Asaph (ได้รับประโยชน์จากการทำงานร่วมกันข้ามเบราว์เซอร์เดียวกันหรือแม้แต่ IE6) แต่ก็มีขนาดเล็กกว่ามากและมีประโยชน์เมื่อขนาดอยู่ในระดับพรีเมียมและ / หรือเมื่อไม่จำเป็นบ่อยครั้ง
function childOf(/*child node*/c, /*parent node*/p){ //returns boolean
while((c=c.parentNode)&&c!==p);
return !!c;
}
.. หรือเป็นหนึ่งซับ ( เพียง 64 ตัวอักษร !):
function childOf(c,p){while((c=c.parentNode)&&c!==p);return !!c}
และjsfiddle ที่นี่
การใช้งาน:
childOf(child, parent)
คืนค่าบูลีนtrue
| false
.
คำอธิบาย:ประเมินตราบใดที่ในขณะที่สภาพการประเมิน
while
(และ) ผู้ประกอบการผลตอบแทนนี้บูล / เท็จจริงหลังจากการประเมินด้านซ้ายมือและด้านขวามือ แต่ถ้าด้านซ้ายมือเป็นความจริง ( ) true
&&
left-hand && right-hand
ด้านซ้ายมือ (ของ&&
) (c=c.parentNode)
เป็น:
การดำเนินการนี้จะกำหนดค่าparentNode
ของc
ถึงc
และจากนั้นตัวดำเนินการ AND จะประเมินผลลัพธ์c
เป็นบูลีน
เนื่องจากparentNode
ส่งคืนnull
หากไม่มีพาเรนต์เหลือnull
อยู่และถูกแปลงไปfalse
เป็น while-loop จะหยุดอย่างถูกต้องเมื่อไม่มีพาเรนต์อีกต่อไป
ด้านขวามือ (ของ&&
) c!==p
เป็น:
ตัว!==
ดำเนินการเปรียบเทียบคือ ' ไม่เท่ากับทั้งหมด' ดังนั้นหากผู้ปกครองของเด็กที่ไม่ได้เป็นผู้ปกครอง (คุณระบุ) จะประเมินไปtrue
แต่ถ้าพ่อแม่ของเด็กเป็นfalse
ผู้ใหญ่แล้วก็ประเมิน
ดังนั้นหาก c!==p
ประเมินเป็นเท็จตัว&&
ดำเนินการจะคืนค่าfalse
เป็น while-condition และ while-loop หยุดทำงาน (โปรดทราบว่าไม่จำเป็นต้องใช้สักครู่ขณะหนึ่งและ;
ต้องใช้เครื่องหมายอัฒภาคปิด)
ดังนั้นเมื่อ while-loop สิ้นสุดลงc
เป็นทั้งโหนด (ไม่ใช่null
) เมื่อพบ parent หรือเป็นnull
(เมื่อวนรอบผ่านไปยังจุดสิ้นสุดโดยไม่ต้องค้นหาคู่)
ดังนั้นเราก็return
ว่าจริง (แปลงเป็นค่าบูลีนแทนของโหนด) ด้วย: return !!c;
ที่: !
( NOT
ผู้ดำเนินการ) ตีความค่าบูลีน ( true
กลายเป็นfalse
และในทางกลับกัน)
!c
แปลงc
(โหนดหรือ null) เป็นบูลีนก่อนที่จะสามารถกลับค่านั้น ดังนั้นการเพิ่มวินาที!
( !!c
) จะแปลงค่าเท็จกลับเป็นจริง (ซึ่งเป็นสาเหตุว่าทำไมค่า double !!
จึงถูกใช้เพื่อ 'แปลงค่าอะไรเป็นบูลีน')
พิเศษ:
ร่างกาย / น้ำหนักของฟังก์ชั่นนั้นเล็กมากทั้งนี้ขึ้นอยู่กับกรณี (เช่นเมื่อมันไม่ได้ใช้บ่อยและปรากฏเพียงครั้งเดียวในรหัส) หนึ่งคนสามารถละเว้นฟังก์ชั่น (ห่อ) และเพียงแค่ใช้ห่วงขณะ:
var a=document.getElementById('child'),
b=document.getElementById('parent'),
c;
c=a; while((c=c.parentNode)&&c!==b); //c=!!c;
if(!!c){ //`if(c)` if `c=!!c;` was used after while-loop above
//do stuff
}
แทน:
var a=document.getElementById('child'),
b=document.getElementById('parent'),
c;
function childOf(c,p){while((c=c.parentNode)&&c!==p);return !!c}
c=childOf(a, b);
if(c){
//do stuff
}