मुझे सिर्फ 'मेरा ’साझा करना था।
यद्यपि वैचारिक रूप से असफ के उत्तर (समान क्रॉस-ब्राउज़र संगतता, यहां तक कि 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। तुलना ऑपरेटर है ' नहीं बिल्कुल के बराबर'। तो अगर बच्चे के माता पिता माता पिता (आपके द्वारा निर्दिष्ट) यह करने के लिए मूल्यांकन करता है नहीं है , लेकिन अगर बच्चे के माता पिता है माता-पिता तो यह करने के लिए मूल्यांकन करता है ।
इसलिए यदि झूठ का मूल्यांकन किया जाता है, तो ऑपरेटर समय की स्थिति के रूप में लौटता है और समय-पाश रुक जाता है। (ध्यान दें कि थोड़ी देर के लिए शरीर की जरूरत नहीं है और समापन अर्धविराम की आवश्यकता है।)
!==truefalse
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
}