मुझे सिर्फ 'मेरा ’साझा करना था।
यद्यपि वैचारिक रूप से असफ के उत्तर (समान क्रॉस-ब्राउज़र संगतता, यहां तक कि 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
, जबकि अधिक माता-पिता नहीं होने पर लूप सही ढंग से बंद हो जाएगा।
(के दाएँ हाथ की ओर &&
) है: c!==p
। तुलना ऑपरेटर है ' नहीं बिल्कुल के बराबर'। तो अगर बच्चे के माता पिता माता पिता (आपके द्वारा निर्दिष्ट) यह करने के लिए मूल्यांकन करता है नहीं है , लेकिन अगर बच्चे के माता पिता है माता-पिता तो यह करने के लिए मूल्यांकन करता है ।
इसलिए यदि झूठ का मूल्यांकन किया जाता है, तो ऑपरेटर समय की स्थिति के रूप में लौटता है और समय-पाश रुक जाता है। (ध्यान दें कि थोड़ी देर के लिए शरीर की जरूरत नहीं है और समापन अर्धविराम की आवश्यकता है।)
!==
true
false
c!==p
&&
false
;
इसलिए जब लूप समाप्त हो जाता है, c
तो या तो एक नोड (नहीं null
) होता है जब यह एक माता-पिता को मिला या यह null
तब होता है (जब लूप एक मैच खोजने के बिना अंत तक चला गया)।
इस प्रकार हम बस return
उस तथ्य (नोड के बजाय, बूलियन मान के रूप में परिवर्तित) के साथ: return !!c;
: !
( NOT
ऑपरेटर) एक बूलियन मान (उलट true
हो जाता है false
और इसके विपरीत)। एक बूलियन में
!c
धर्मान्तरित c
(नोड या अशक्त) से पहले यह उस मूल्य को उल्टा कर सकता है। इसलिए एक दूसरा !
( !!c
) जोड़ना इस झूठी पीठ को सच में बदल देता है (यही वजह है कि डबल !!
का इस्तेमाल अक्सर 'बूलियन में कुछ भी बदलने के लिए' किया जाता है)।
अतिरिक्त:
फ़ंक्शन का शरीर / पेलोड इतना छोटा है कि, मामले पर निर्भर करता है (जैसे कि जब इसका उपयोग अक्सर नहीं किया जाता है और कोड में बस एक बार दिखाई देता है), तो कोई भी फ़ंक्शन (रैपिंग) को छोड़ सकता है और बस लूप का उपयोग कर सकता है:
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
}