ฉันแค่ต้องแบ่งปัน 'ของฉัน'
แม้ว่าแนวความคิดจะเหมือนกับคำตอบของ 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
}