मैं किसी तत्व के बाहर एक क्लिक का पता कैसे लगा सकता हूं?


2485

मेरे पास कुछ HTML मेनू हैं, जिन्हें मैं पूरी तरह से दिखाता हूं जब कोई उपयोगकर्ता इन मेनू के सिर पर क्लिक करता है। जब उपयोगकर्ता मेनू क्षेत्र के बाहर क्लिक करता है तो मैं इन तत्वों को छिपाना चाहूंगा।

क्या jQuery के साथ ऐसा कुछ संभव है?

$("#menuscontainer").clickOutsideThisElement(function() {
    // Hide the menus
});

47
यहाँ इस रणनीति का एक नमूना है: jsfiddle.net/tedp/aL7Xe/1
Ted

18
जैसा कि टॉम ने उल्लेख किया है, आप इस दृष्टिकोण का उपयोग करने से पहले css-tricks.com/dangers-stopping-event-propagation पढ़ना चाहेंगे । हालांकि jsfiddle टूल बहुत अच्छा है।
जॉन कूम्स 21

3
तत्व और फिर event.target का संदर्भ प्राप्त करें, और अंत में! = या == दोनों तब तदनुसार कोड निष्पादित करते हैं ..
रोहित कुमार


2
के साथ event.targetऔर बिना वेनिला जेएस समाधानevent.stopPropagation
लोटेकसून

जवाबों:


1811

ध्यान दें: का उपयोग करना stopEventPropagation()एक ऐसी चीज है जिससे बचना चाहिए क्योंकि यह DOM में सामान्य घटना प्रवाह को तोड़ती है। अधिक जानकारी के लिए यह लेख देखें । इसके बजाय इस विधि का उपयोग करने पर विचार करें

विंडो को बंद करने वाले दस्तावेज़ निकाय पर एक क्लिक ईवेंट संलग्न करें। कंटेनर के लिए एक अलग क्लिक ईवेंट संलग्न करें जो दस्तावेज़ निकाय के लिए प्रसार को रोकता है।

$(window).click(function() {
//Hide the menus if visible
});

$('#menucontainer').click(function(event){
    event.stopPropagation();
});

708
यह कई चीजों के मानक व्यवहार को तोड़ता है, जिसमें बटन और लिंक शामिल हैं, जो #menucontainer के भीतर निहित है। मुझे आश्चर्य है कि यह उत्तर इतना लोकप्रिय है।
आर्ट

75
यह #menucontainer के अंदर किसी भी चीज़ के व्यवहार को नहीं तोड़ता है, क्योंकि यह इसके अंदर किसी भी चीज़ के लिए प्रचार श्रृंखला के निचले भाग में है।
एरान गैल्परिन

94
इसकी बहुत ही सुंदर लेकिन आपको $('html').click()शरीर का उपयोग नहीं करना चाहिए । शरीर में हमेशा अपनी सामग्री की ऊंचाई होती है। इसमें बहुत अधिक सामग्री नहीं है या स्क्रीन बहुत अधिक है, यह केवल शरीर द्वारा भरे गए हिस्से पर काम करता है।
15:25

103
मुझे भी आश्चर्य है कि इस समाधान को इतने वोट मिले। यह बाहर के किसी भी तत्व के लिए विफल रहेगा जिसमें स्टॉपप्रोपेशन jsfiddle.net/Flandre/vaNFw/3
आंद्रे

140
फिलिप वाल्टन बहुत अच्छी तरह से समझाते हैं कि यह उत्तर सबसे अच्छा समाधान क्यों नहीं है: css-tricks.com/dangers-stopping-event-propagation
टॉम

1386

आप एक क्लिक ईवेंट के लिए सुन सकते हैं documentऔर फिर सुनिश्चित करें कि उपयोग करने #menucontainerसे पूर्वज या क्लिक किए गए तत्व का लक्ष्य नहीं है .closest()

यदि यह नहीं है, तो क्लिक किया गया तत्व बाहर है #menucontainerऔर आप इसे सुरक्षित रूप से छिपा सकते हैं।

$(document).click(function(event) { 
  $target = $(event.target);
  if(!$target.closest('#menucontainer').length && 
  $('#menucontainer').is(":visible")) {
    $('#menucontainer').hide();
  }        
});

संपादित करें - 2017-06-23

यदि आप मेनू को खारिज करने की योजना बनाते हैं और घटनाओं को सुनना बंद करना चाहते हैं, तो आप श्रोता के बाद भी सफाई कर सकते हैं। यह फ़ंक्शन केवल नए बनाए गए श्रोता को साफ करेगा, किसी भी अन्य क्लिक श्रोताओं को संरक्षित करेगा document। ES2015 सिंटैक्स के साथ:

export function hideOnClickOutside(selector) {
  const outsideClickListener = (event) => {
    $target = $(event.target);
    if (!$target.closest(selector).length && $(selector).is(':visible')) {
        $(selector).hide();
        removeClickListener();
    }
  }

  const removeClickListener = () => {
    document.removeEventListener('click', outsideClickListener)
  }

  document.addEventListener('click', outsideClickListener)
}

संपादित करें - 2018-03-11

उन लोगों के लिए जो jQuery का उपयोग नहीं करना चाहते हैं। यहाँ सादे वनीलाजेएस (ECMAScript6) में उपरोक्त कोड दिया गया है।

function hideOnClickOutside(element) {
    const outsideClickListener = event => {
        if (!element.contains(event.target) && isVisible(element)) { // or use: event.target.closest(selector) === null
          element.style.display = 'none'
          removeClickListener()
        }
    }

    const removeClickListener = () => {
        document.removeEventListener('click', outsideClickListener)
    }

    document.addEventListener('click', outsideClickListener)
}

const isVisible = elem => !!elem && !!( elem.offsetWidth || elem.offsetHeight || elem.getClientRects().length ) // source (2018-03-11): https://github.com/jquery/jquery/blob/master/src/css/hiddenVisibleSelectors.js 

नोट: यह केवल !element.contains(event.target)jQuery के भाग के बजाय उपयोग करने के लिए एलेक्स टिप्पणी पर आधारित है ।

लेकिन element.closest()अब सभी प्रमुख ब्राउज़रों में भी उपलब्ध है (W3C संस्करण jQuery के एक से थोड़ा अलग है)। पॉलीफ़िल यहां पाया जा सकता है:पॉलीफ़िल Element.closest ()

संपादित करें - 2020-05-21

उस स्थिति में जहां आप चाहते हैं कि उपयोगकर्ता तत्व के अंदर क्लिक-एंड-ड्रैग कर सके, फिर तत्व को बाहर निकाले बिना, माउस को तत्व के बाहर छोड़ें:

      ...
      let lastMouseDownX = 0;
      let lastMouseDownY = 0;
      let lastMouseDownWasOutside = false;

      const mouseDownListener = (event: MouseEvent) => {
        lastMouseDownX = event.offsetX
        lastMouseDownY = event.offsetY
        lastMouseDownWasOutside = !$(event.target).closest(element).length
      }
      document.addEventListener('mousedown', mouseDownListener);

और में outsideClickListener:

const outsideClickListener = event => {
        const deltaX = event.offsetX - lastMouseDownX
        const deltaY = event.offsetY - lastMouseDownY
        const distSq = (deltaX * deltaX) + (deltaY * deltaY)
        const isDrag = distSq > 3
        const isDragException = isDrag && !lastMouseDownWasOutside

        if (!element.contains(event.target) && isVisible(element) && !isDragException) { // or use: event.target.closest(selector) === null
          element.style.display = 'none'
          removeClickListener()
          document.removeEventListener('mousedown', mouseDownListener); // Or add this line to removeClickListener()
        }
    }

28
मैंने कई अन्य उत्तरों की कोशिश की, लेकिन केवल इस एक ने काम किया। धन्यवाद। मैंने जिस कोड का उपयोग कर समाप्त किया वह यह था: $ (दस्तावेज़) .click (फंक्शन (इवेंट) {if ($ (इवेंट ()) .closest ('विंडो'))। लेंथ == 0) {$ ('' विंडो ') ) .fadeOut ('तेज');}});
पिस्टोस

39
मैंने वास्तव में इस समाधान के साथ जाना समाप्त कर दिया है क्योंकि यह एक ही पृष्ठ पर बेहतर तरीके से कई मेनू का समर्थन करता है जहां एक दूसरा मेनू पर क्लिक करते समय एक पहला खुला है, जो स्टॉपप्रॉपेजेशन समाधान में पहला खुला छोड़ देगा।
umassthrower

13
बहुत बढ़िया जवाब। जब आपके पास कई आइटम हैं जिन्हें आप बंद करना चाहते हैं तो जाने का यह तरीका है।
जॉन

5
खराबी के कारण यह स्वीकृत उत्तर होना चाहिए क्योंकि दूसरे समाधान में event.stopPropagation () के साथ है।
टमाटर

20
बिना jQuery के - Node.contains ()!element.contains(event.target) का उपयोग कर
एलेक्स रोस

303

किसी तत्व के बाहर एक क्लिक का पता लगाने के लिए कैसे?

कारण यह है कि यह प्रश्न इतना लोकप्रिय है और इतने सारे उत्तर हैं कि यह भ्रामक रूप से जटिल है। लगभग आठ वर्षों और दर्जनों जवाबों के बाद, मैं वास्तव में यह देखकर आश्चर्यचकित हूं कि अभिगम्यता का कितना कम ध्यान रखा गया है।

जब उपयोगकर्ता मेनू क्षेत्र के बाहर क्लिक करता है तो मैं इन तत्वों को छिपाना चाहूंगा।

यह एक नेक काम है और वास्तविक मुद्दा है। सवाल का शीर्षक- जो कि ज्यादातर जवाबों को संबोधित करने का प्रयास करता है-उसमें एक दुर्भाग्यपूर्ण लाल हेरिंग शामिल है।

संकेत: यह "क्लिक" शब्द है !

आप वास्तव में क्लिक हैंडलर्स को बांधना नहीं चाहते हैं।

यदि आप संवाद को बंद करने के लिए क्लिक हैंडलर्स को बाइंड कर रहे हैं, तो आप पहले ही विफल हो चुके हैं। आपके द्वारा विफल किए जाने का कारण यह है कि हर कोई clickघटनाओं को ट्रिगर नहीं करता है। माउस का उपयोग नहीं करने वाले उपयोगकर्ता आपके डायलॉग (और आपका पॉप-अप मेनू यकीनन एक प्रकार का डायलॉग है) को दबाकर बच सकते हैं Tab, और फिर वे बाद में बिना ट्रिगर किए डायलॉग के पीछे की सामग्री को नहीं पढ़ पाएंगेclick घटना ।

तो चलिए सवाल फिर से शुरू करते हैं।

जब कोई उपयोगकर्ता इसके साथ समाप्त होता है तो संवाद कैसे बंद करता है?

यही लक्ष्य है। दुर्भाग्य से, अब हमें इसे बांधने की जरूरत हैuserisfinishedwiththedialog घटना , और यह बाध्यकारी इतना सीधा नहीं है।

तो हम कैसे पता लगा सकते हैं कि एक उपयोगकर्ता ने एक संवाद का उपयोग करके समाप्त कर दिया है?

focusout प्रतिस्पर्धा

एक अच्छी शुरुआत यह निर्धारित करने के लिए है कि क्या फोकस ने संवाद छोड़ दिया है।

संकेत: blurघटना से सावधान रहें ,blur अगर प्रचार बुदबुदाती हुई अवस्था से बंधा हुआ हो तो प्रचार नहीं करता!

jQuery का focusoutकाम ठीक रहेगा। यदि आप jQuery का उपयोग नहीं कर सकते हैं, तो आप blurकैप्चरिंग चरण के दौरान उपयोग कर सकते हैं :

element.addEventListener('blur', ..., true);
//                       use capture: ^^^^

इसके अलावा, कई संवादों के लिए आपको कंटेनर को फ़ोकस करने की अनुमति देने की आवश्यकता होगी। tabindex="-1"टैबिंग प्रवाह को बाधित किए बिना संवाद को गतिशील रूप से प्राप्त करने की अनुमति देने के लिए जोड़ें ।

$('a').on('click', function () {
  $(this.hash).toggleClass('active').focus();
});

$('div').on('focusout', function () {
  $(this).removeClass('active');
});
div {
  display: none;
}
.active {
  display: block;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<a href="#example">Example</a>
<div id="example" tabindex="-1">
  Lorem ipsum <a href="http://example.com">dolor</a> sit amet.
</div>


यदि आप एक मिनट से अधिक समय तक उस डेमो के साथ खेलते हैं तो आपको जल्दी से मुद्दों को देखना शुरू कर देना चाहिए।

पहला यह है कि संवाद में लिंक क्लिक करने योग्य नहीं है। उस पर क्लिक करने या उस पर टैब करने का प्रयास करने से बातचीत बंद होने से पहले संवाद बंद हो जाएगा। ऐसा इसलिए है क्योंकि आंतरिक तत्व को केंद्रित करने focusoutसे पहले एक घटना को ट्रिगर किया जाता हैfocusin ईवेंट को फिर ।

इवेंट लूप पर स्थिति परिवर्तन की कतार को ठीक करना है। इसका उपयोग करके setImmediate(...), या setTimeout(..., 0)समर्थन न करने वाले ब्राउज़रों के लिए किया जा सकता है setImmediate। एक बार कतारबद्ध होने के बाद इसे बाद में रद्द किया जा सकता है focusin:

$('.submenu').on({
  focusout: function (e) {
    $(this).data('submenuTimer', setTimeout(function () {
      $(this).removeClass('submenu--active');
    }.bind(this), 0));
  },
  focusin: function (e) {
    clearTimeout($(this).data('submenuTimer'));
  }
});

दूसरा मुद्दा यह है कि जब लिंक फिर से दबाया जाएगा तो संवाद बंद नहीं होगा। ऐसा इसलिए है क्योंकि संवाद ध्यान केंद्रित खो देता है, घनिष्ठ व्यवहार को ट्रिगर करता है, जिसके बाद लिंक फिर से चालू हो जाता है संवाद को फिर से खोलने के लिए।

पिछले अंक की तरह ही, फोकस अवस्था को प्रबंधित करने की आवश्यकता है। यह देखते हुए कि राज्य परिवर्तन पहले ही कतारबद्ध हो चुका है, संवाद ट्रिगर पर ध्यान देने वाली घटनाओं को संभालने की बात है:

यह परिचित दिखना चाहिए
$('a').on({
  focusout: function () {
    $(this.hash).data('timer', setTimeout(function () {
      $(this.hash).removeClass('active');
    }.bind(this), 0));
  },
  focusin: function () {
    clearTimeout($(this.hash).data('timer'));  
  }
});


Esc चाभी

यदि आपको लगा कि आप फ़ोकस स्टेट्स को हैंडल करके किए गए हैं, तो उपयोगकर्ता अनुभव को सरल बनाने के लिए और भी बहुत कुछ कर सकते हैं।

यह अक्सर एक "अच्छा है" सुविधा है, लेकिन यह सामान्य है कि जब आपके पास किसी भी प्रकार का एक मोडल या पॉपअप होता है, तो Escकुंजी इसे बंद कर देगी।

keydown: function (e) {
  if (e.which === 27) {
    $(this).removeClass('active');
    e.preventDefault();
  }
}


यदि आप जानते हैं कि आपके पास संवाद के भीतर ध्यान देने योग्य तत्व हैं, तो आपको सीधे संवाद पर ध्यान केंद्रित करने की आवश्यकता नहीं होगी। यदि आप एक मेनू बना रहे हैं, तो आप इसके बजाय पहले मेनू आइटम पर ध्यान केंद्रित कर सकते हैं।

click: function (e) {
  $(this.hash)
    .toggleClass('submenu--active')
    .find('a:first')
    .focus();
  e.preventDefault();
}


WAI-ARIA रोल्स और अन्य एक्सेसिबिलिटी सपोर्ट

यह उत्तर उम्मीद है कि इस सुविधा के लिए सुलभ कीबोर्ड और माउस समर्थन की मूल बातें शामिल है, लेकिन जैसा कि यह पहले से ही काफी व्यवहार्य है मैं WAI-ARIA भूमिकाओं और विशेषताओं की किसी भी चर्चा से बचने के लिए जा रहा हूं , हालांकि मैं अत्यधिक अनुशंसा करता हूं कि कार्यान्वयनकर्ता विवरण के लिए कल्पना का संदर्भ देते हैं। उन्हें किन भूमिकाओं का उपयोग करना चाहिए और अन्य उपयुक्त विशेषताएँ।


29
यह सबसे पूर्ण उत्तर है, स्पष्टीकरण और पहुंच को ध्यान में रखते हुए। मुझे लगता है कि यह स्वीकृत उत्तर होना चाहिए क्योंकि अधिकांश अन्य उत्तर केवल क्लिक को हैंडल करते हैं और बिना किसी स्पष्टीकरण के केवल कोड स्निपेट गिराए जाते हैं।
साइरिल

4
अद्भुत, अच्छी तरह से समझाया गया। मैंने सिर्फ एक प्रतिक्रिया घटक पर इस दृष्टिकोण का उपयोग किया और पूरी तरह से धन्यवाद काम किया
डेविड लावेरी

2
गहरे उत्तर के लिए @zzzzBov धन्यवाद, मैं इसे वैनिला JS में हासिल करने की कोशिश कर रहा हूं, और मैं jquery के सभी सामानों के साथ थोड़ा सा खो गया हूं। वैनिला जेएस में भी ऐसा ही कुछ है?
हेंड्रिक एंजेल

2
@zzzzBov नहीं, मैं आपको jQuery मुक्त संस्करण लिखने के लिए नहीं देख रहा हूं, मैं इसे करने की कोशिश करूंगा और मुझे लगता है कि सबसे अच्छा यहां एक नया प्रश्न पूछना है अगर मैं वास्तव में फंस गया हूं। फिर से बहुत बहुत धन्यवाद।
हेंड्रिक एंजेल

7
हालांकि यह कस्टम ड्रॉपडाउन या अन्य इनपुट से बाहर का पता लगाने के लिए एक बढ़िया तरीका है, लेकिन कभी भी दो कारणों से मोडल या पॉपअप के लिए पसंदीदा तरीका नहीं होना चाहिए। जब उपयोगकर्ता किसी अन्य टैब या विंडो पर स्विच करता है, या एक संदर्भ मेनू खोलता है, जो वास्तव में f * कष्टप्रद है, तो मोडल बंद हो जाएगा। इसके अतिरिक्त, 'क्लिक' इवेंट माउस पर आग लगाता है, जबकि 'फ़ोकआउट' इवेंट तुरंत ही माउस को दबा देता है। आम तौर पर, एक बटन केवल एक क्रिया करता है यदि आप माउस बटन को नीचे दबाते हैं और फिर चलते हैं। मोडल के लिए ऐसा करने का उचित, सुलभ तरीका एक टैबेबल क्लोज बटन जोड़ना है।
केविन

144

यहाँ अन्य समाधान मेरे काम नहीं आए इसलिए मुझे इसका उपयोग करना पड़ा:

if(!$(event.target).is('#foo'))
{
    // hide menu
}

मैंने इवेंट का उपयोग करने का एक और व्यावहारिक उदाहरण पोस्ट किया है। अन्य Jquery UI विजेट को ट्रिगर करने से बचने के लिए कैसे उपयोग करें। html हैंडलर को अपने स्वयं के पॉप-ओवर बॉक्स में एम्बेड करते समय क्लिक करें: मूल लक्ष्य प्राप्त करने का सबसे अच्छा तरीका
जॉय टी

43
इसने मेरे लिए काम किया, सिवाय इसके कि मैंने बयान के && !$(event.target).parents("#foo").is("#foo")अंदर जोड़ा IFताकि क्लिक करने पर कोई भी बाल तत्व मेनू को बंद न करें।
19

1
इससे बेहतर नहीं मिल सकता है: // हम $ (event.target) .parents ('# foo') के बाहर हैं। लंबाई == 0
AlexG

3
गहरी नेस्टिंग को संभालने के लिए संक्षिप्त सुधार का उपयोग करना है .is('#foo, #foo *'), लेकिन मैं इस समस्या को हल करने के लिए बाइंडिंग क्लिक हैंडलर की सिफारिश नहीं करता हूं
zzzzBov

1
!$(event.target).closest("#foo").lengthबेहतर होगा और @ honyovk के जोड़ की आवश्यकता को कम करेगा।
टीवी

127

मेरे पास एक ऐसा अनुप्रयोग है जो एरन के उदाहरण के समान काम करता है, सिवाय इसके कि मैं मेनू खोलने पर शरीर को क्लिक इवेंट संलग्न करता हूं ... इसके लिए किंडा:

$('#menucontainer').click(function(event) {
  $('html').one('click',function() {
    // Hide the menus
  });

  event.stopPropagation();
});

JQuery के फ़ंक्शन के बारे में अधिक जानकारीone()


9
लेकिन तब यदि आप स्वयं मेनू पर क्लिक करते हैं, तो बाहर, यह काम नहीं करेगा :)
vsync

3
यह क्लिक श्रोता को शरीर से बांधने से पहले event.stopProgagantion () लगाने में मदद करता है।
जैस्पर केंस

4
इसके साथ समस्या यह है कि "एक" कई बार किसी सरणी में घटनाओं को जोड़ने के jQuery विधि पर लागू होता है। इसलिए यदि आप मेनू को एक से अधिक बार खोलने के लिए क्लिक करते हैं, तो घटना फिर से शरीर से जुड़ी होती है और मेनू को कई बार छिपाने का प्रयास करता है। इस समस्या को ठीक करने के लिए एक विफलता को लागू किया जाना चाहिए।
markyzm

बाइंडिंग का उपयोग करने के बाद .one- $('html')हैंडलर के अंदर - ए लिखें $('html').off('click')
कोडी

4
@ मुझे लगता है कि मदद नहीं करता है। oneहैंडलर स्वचालित रूप से कॉल करेंगे off(के रूप में यह jQuery डॉक्स में दिखाया गया है)।
Mariano Desanze

44

शोध के बाद मुझे तीन काम करने के उपाय मिले हैं (मैं संदर्भ के लिए पृष्ठ लिंक भूल गया)

पहला उपाय

<script>
    //The good thing about this solution is it doesn't stop event propagation.

    var clickFlag = 0;
    $('body').on('click', function () {
        if(clickFlag == 0) {
            console.log('hide element here');
            /* Hide element here */
        }
        else {
            clickFlag=0;
        }
    });
    $('body').on('click','#testDiv', function (event) {
        clickFlag = 1;
        console.log('showed the element');
        /* Show the element */
    });
</script>

दूसरा उपाय

<script>
    $('body').on('click', function(e) {
        if($(e.target).closest('#testDiv').length == 0) {
           /* Hide dropdown here */
        }
    });
</script>

तीसरा उपाय

<script>
    var specifiedElement = document.getElementById('testDiv');
    document.addEventListener('click', function(event) {
        var isClickInside = specifiedElement.contains(event.target);
        if (isClickInside) {
          console.log('You clicked inside')
        }
        else {
          console.log('You clicked outside')
        }
    });
</script>

8
तीसरा समाधान अब तक की जाँच का सबसे सुरुचिपूर्ण तरीका है। इसमें jQuery का कोई भी ओवरहेड शामिल नहीं है। बहुत अच्छा। इससे बहुत मदद मिली। धन्यवाद।
दुलर्थ

मैं तीसरे तत्व को कई तत्वों के साथ जोड़ने की कोशिश कर रहा हूं document.getElementsByClassName, अगर किसी के पास कोई सुराग है तो कृपया साझा करें।
लोटेकसून

@lowtechsun आपको प्रत्येक चेक करने के लिए लूप करना होगा।
डॉनी

वास्तव में तीसरा समाधान पसंद आया, हालांकि मेरी तलाक से पहले क्लिक ट्रिगर शुरू हो गया है जो इसे फिर से छुपाता है, किसी भी विचार क्यों?
indiehjaerta

तीसरा एक कंसोल.लॉग के लिए अनुमति देता है, निश्चित रूप से, लेकिन यह आपको वास्तव में डिस्प्ले को किसी के पास स्थापित करने की अनुमति नहीं देता है - क्योंकि यह मेनू दिखाए जाने से पहले ऐसा करेगा। क्या आपके पास इसके लिए कोई उपाय है?
रोलंडीएक्सॉर

40
$("#menuscontainer").click(function() {
    $(this).focus();
});
$("#menuscontainer").blur(function(){
    $(this).hide();
});

मेरे लिए ठीक काम करता है।


3
यह वह है जिसका मैं उपयोग करूंगा। यह सही नहीं हो सकता है, लेकिन एक शौकीन प्रोग्रामर के रूप में, इसका सरल स्पष्ट रूप से समझने के लिए पर्याप्त है।
kevtrout

कलंक #menucontainerएक क्लिक के बारे में सवाल के बाहर एक कदम है
झगड़ा था

4
कंटेनर के बाहर @borrel धब्बा नहीं है। ब्लर फोकस के विपरीत है, आप माउसआउट के बारे में सोच रहे हैं। इस समाधान ने मेरे लिए विशेष रूप से अच्छी तरह से काम किया जब मैं "क्लिक टू एडिट" टेक्स्ट बना रहा था जहां मैंने क्लिक पर सादे पाठ और इनपुट फ़ील्ड के बीच आगे और पीछे स्वैप किया।
पार्कर.सिक्कंड

मुझे इसे काम tabindex="-1"करने के लिए जोड़ना था #menuscontainer। ऐसा लगता है कि यदि आप कंटेनर के अंदर एक इनपुट टैग लगाते हैं और उस पर क्लिक करते हैं, तो कंटेनर छिप जाता है।
tyrion

मेनू और कंटेनरों के लिए मूसलीव घटना अधिक उपयुक्त है (रेफरी: w3schools.com/jquery/… )
एवगेनिया मनोलोवा

38

अब उस के लिए एक प्लगइन है: बाहर की घटनाओं ( ब्लॉग पोस्ट )

निम्न होता है जब एक क्लिकआउट हैंडलर (WLOG) एक तत्व के लिए बाध्य होता है:

  • तत्व को एक सरणी में जोड़ा जाता है जो क्लिकआउटसाइड हैंडलर के साथ सभी तत्वों को रखता है
  • ( नामांकित ) क्लिक हैंडलर दस्तावेज़ के लिए बाध्य है (यदि पहले से नहीं है)
  • दस्तावेज़ के किसी भी क्लिक पर , क्लिकआउट इवेंट में उन तत्वों के लिए ट्रिगर किया जाता है, जो उस पर क्लिक करने वाले लक्ष्य के माता-पिता के बराबर या बराबर नहीं होते हैं
  • इसके अलावा, क्लिकआउट इवेंट के लिए event.target उपयोगकर्ता द्वारा क्लिक किए गए तत्व पर सेट होता है (इसलिए आप यह भी जानते हैं कि उपयोगकर्ता ने क्या क्लिक किया, न कि केवल वह बाहर क्लिक किया)

इसलिए किसी भी घटना को प्रचार से नहीं रोका जाता है और अतिरिक्त क्लिक हैंडलर को "ऊपर" का उपयोग बाहरी हैंडलर के साथ किया जा सकता है।


अच्छा प्लगइन। "बाहर की घटनाओं" पर लिंक मृत है, जबकि ब्लॉग पोस्ट लिंक इसके बजाय जीवित है और "क्लिकआउट" प्रकार की घटनाओं के लिए एक बहुत उपयोगी प्लगइन प्रदान करता है। इसका लाइसेंस भी एमआईटी है।
TechNyquist

महान प्लगइन। पूरी तरह से काम किया। उपयोग इस तरह है:$( '#element' ).on( 'clickoutside', function( e ) { .. } );
गाविन

33

यह मेरे लिए पूरी तरह से काम करता है !!

$('html').click(function (e) {
    if (e.target.id == 'YOUR-DIV-ID') {
        //do something
    } else {
        //do something
    }
});

इस समाधान ने जो मैं कर रहा था उसके लिए अच्छी तरह से काम किया, जहां मुझे अभी भी क्लिक करने के लिए क्लिक इवेंट की आवश्यकता थी, धन्यवाद।
माइक

26

मुझे नहीं लगता कि जब उपयोगकर्ता बाहर क्लिक करता है तो आपको वास्तव में मेनू को बंद करने की क्या आवश्यकता है; जब उपयोगकर्ता पृष्ठ पर कहीं भी क्लिक करता है, तो आपको मेनू को बंद करने के लिए क्या चाहिए। यदि आप मेनू पर क्लिक करते हैं, या मेनू को बंद करना चाहिए तो यह सही है?

ऊपर कोई संतोषजनक उत्तर नहीं मिलने से मुझे इस ब्लॉग पोस्ट को दूसरे दिन लिखने के लिए प्रेरित किया । अधिक पांडित्य के लिए, नोट करने के लिए कई प्रकार के गोश्त हैं:

  1. यदि आप क्लिक करने के लिए बॉडी एलिमेंट पर एक क्लिक ईवेंट हैंडलर संलग्न करते हैं, तो मेन्यू बंद करने से पहले 2 क्लिक का इंतजार करना सुनिश्चित करें, और ईवेंट को अनबाइंड करें। अन्यथा मेनू पर खुलने वाला ईवेंट उस श्रोता तक पहुंच जाएगा, जिसे मेनू बंद करना है।
  2. यदि आप एक क्लिक ईवेंट पर event.stopPropogation () का उपयोग करते हैं, तो आपके पृष्ठ के किसी भी अन्य तत्व में क्लिक-ए-टू-क्लोज़ फ़ीचर नहीं हो सकता है।
  3. शरीर तत्व पर एक क्लिक ईवेंट हैंडलर को अनिश्चित काल के लिए संलग्न करना एक निष्पादन समाधान नहीं है
  4. घटना के लक्ष्य की तुलना करते हुए, और उसके माता-पिता ने हैंडलर के निर्माता को माना कि आप जो चाहते हैं, उसे क्लिक करने पर मेनू को बंद करना है, जब आप वास्तव में चाहते हैं तो पृष्ठ पर कहीं भी क्लिक करने पर उसे बंद करना है।
  5. शरीर तत्व पर घटनाओं के लिए सुनने से आपका कोड अधिक भंगुर हो जाएगा। मासूम के रूप में स्टाइल इसे तोड़ देगा:body { margin-left:auto; margin-right: auto; width:960px;}

2
"यदि आप मेनू पर क्लिक करते हैं, या मेनू को बंद करना चाहिए तो यह सही है?" हर बार नहीं। किसी तत्व को खींचकर एक क्लिक रद्द करना अभी भी एक दस्तावेज़ स्तर क्लिक को ट्रिगर करेगा, लेकिन मेनू को बंद करना जारी रखने का इरादा नहीं होगा। कई अन्य प्रकार के संवाद भी हैं जो "क्लिक-आउट" व्यवहार का उपयोग कर सकते हैं जो आंतरिक रूप से क्लिक करने की अनुमति देगा।
zzzzBov

25

जैसा कि एक अन्य पोस्टर में कहा गया है कि बहुत सारे गोचर्स हैं, खासकर यदि आप जिस तत्व को प्रदर्शित कर रहे हैं (इस मामले में एक मेनू) में इंटरैक्टिव तत्व हैं। मैंने निम्नलिखित विधि को काफी मजबूत पाया है:

$('#menuscontainer').click(function(event) {
    //your code that shows the menus fully

    //now set up an event listener so that clicking anywhere outside will close the menu
    $('html').click(function(event) {
        //check up the tree of the click target to check whether user has clicked outside of menu
        if ($(event.target).parents('#menuscontainer').length==0) {
            // your code to hide menu

            //this event listener has done its job so we can unbind it.
            $(this).unbind(event);
        }

    })
});

25

स्थिति का एक सरल समाधान है:

$(document).mouseup(function (e)
{
    var container = $("YOUR SELECTOR"); // Give you class or ID

    if (!container.is(e.target) &&            // If the target of the click is not the desired div or section
        container.has(e.target).length === 0) // ... nor a descendant-child of the container
    {
        container.hide();
    }
});

उपरोक्त स्क्रिप्ट divअगर बाहर की ओर छिपी होगीdiv क्लिक इवेंट के होने पर ट्रिगर हो जाएगी।

अधिक जानकारी के लिए आप निम्न ब्लॉग देख सकते हैं: http://www.codecanal.com/detect-click-outside-div-use-javascript/


22

solution1

Event.stopPropagation () का उपयोग करने के बजाय, जिसके कुछ पक्ष प्रभावित हो सकते हैं, बस एक साधारण ध्वज चर को परिभाषित करें और एक ifशर्त जोड़ें । मैंने यह परीक्षण किया और बिना किसी पक्ष के ठीक से काम किया

var flag = "1";
$('#menucontainer').click(function(event){
    flag = "0"; // flag 0 means click happened in the area where we should not do any action
});

$('html').click(function() {
    if(flag != "0"){
        // Hide the menus if visible
    }
    else {
        flag = "1";
    }
});

Solution2

बस एक साधारण ifशर्त के साथ:

$(document).on('click', function(event){
    var container = $("#menucontainer");
    if (!container.is(event.target) &&            // If the target of the click isn't the container...
        container.has(event.target).length === 0) // ... nor a descendant of the container
    {
        // Do whatever you want to do when click is outside the element
    }
});

मैंने बूलियन झंडे के साथ इस घोल का इस्तेमाल किया और यह एक अच्छे डीओएम के साथ भी अच्छा है और अगर # मेन्यूकोएंटेनर के अंदर बहुत सारे अन्य तत्व हैं
मिगियो बी

समाधान 1 बेहतर तरीके से काम करता है, क्योंकि यह उन मामलों को संभालता है जब क्लिक लक्ष्य को हटा दिया जाता है जब समय घटना दस्तावेज़ में प्रचार करती है।
ऐलिस

21

विंडो क्लिक इवेंट टारगेट की जाँच करें (इसे विंडो में तब तक प्रचारित करना चाहिए, जब तक यह कहीं और कैप्चर न हो जाए), और यह सुनिश्चित करें कि यह मेनू तत्वों में से कोई भी नहीं है। यदि यह नहीं है, तो आप अपने मेनू के बाहर हैं।

या क्लिक की स्थिति की जांच करें, और देखें कि क्या यह मेनू क्षेत्र के भीतर निहित है।


18

मुझे कुछ इस तरह से सफलता मिली है:

var $menuscontainer = ...;

$('#trigger').click(function() {
  $menuscontainer.show();

  $('body').click(function(event) {
    var $target = $(event.target);

    if ($target.parents('#menuscontainer').length == 0) {
      $menuscontainer.hide();
    }
  });
});

तर्क यह है: जब #menuscontainerदिखाया जाता है, तो एक क्लिक हैंडलर को उस शरीर से बांधें जो #menuscontainerकेवल तभी छुपाता है जब लक्ष्य (क्लिक का) उसका कोई बच्चा नहीं है।


17

एक प्रकार के रूप में:

var $menu = $('#menucontainer');
$(document).on('click', function (e) {

    // If element is opened and click target is outside it, hide it
    if ($menu.is(':visible') && !$menu.is(e.target) && !$menu.has(e.target).length) {
        $menu.hide();
    }
});

ईवेंट के प्रसार को रोकने के साथ इसे कोई समस्या नहीं है और एक ही पृष्ठ पर कई मेनू का बेहतर समर्थन करता है, जहां एक दूसरा मेनू पर क्लिक करते समय एक पहला खुला है, स्टॉपप्रॉपैग्यूशन समाधान में पहला खुला छोड़ देगा।


16

ईवेंट में एक प्रॉपर्टी होती है, जिसे Event.path कहा जाता है, जो "ट्री ऑर्डर में अपने सभी पूर्वजों की स्थिर क्रमबद्ध सूची" है । यह जाँचने के लिए कि क्या कोई घटना किसी विशिष्ट DOM तत्व या उसके किसी बच्चे से उत्पन्न हुई है, बस उस विशिष्ट DOM तत्व के लिए पथ की जाँच करें। यह फ़ंक्शन ORमें तत्व जाँच को तार्किक रूप से कई तत्वों की जाँच करने के लिए भी इस्तेमाल किया जा सकता है some

$("body").click(function() {
  target = document.getElementById("main");
  flag = event.path.some(function(el, i, arr) {
    return (el == target)
  })
  if (flag) {
    console.log("Inside")
  } else {
    console.log("Outside")
  }
});
#main {
  display: inline-block;
  background:yellow;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div id="main">
  <ul>
    <li>Test-Main</li>
    <li>Test-Main</li>
    <li>Test-Main</li>
    <li>Test-Main</li>
    <li>Test-Main</li>
  </ul>
</div>
<div id="main2">
  Outside Main
</div>

तो आपके मामले के लिए यह होना चाहिए

$("body").click(function() {
  target = $("#menuscontainer")[0];
  flag = event.path.some(function(el, i, arr) {
    return (el == target)
  });
  if (!flag) {
    // Hide the menus
  }
});

1
एज में काम नहीं करता है।
महापुरूष

event.pathबात नहीं है।
एंड्रयू

14

मुझे यह विधि कुछ jQuery कैलेंडर प्लगइन में मिली।

function ClickOutsideCheck(e)
{
  var el = e.target;
  var popup = $('.popup:visible')[0];
  if (popup==undefined)
    return true;

  while (true){
    if (el == popup ) {
      return true;
    } else if (el == document) {
      $(".popup").hide();
      return false;
    } else {
      el = $(el).parent()[0];
    }
  }
};

$(document).bind('mousedown.popup', ClickOutsideCheck);

13

यहां भविष्य के दर्शकों के लिए वेनिला जावास्क्रिप्ट समाधान है।

दस्तावेज़ के भीतर किसी भी तत्व को क्लिक करने पर, यदि क्लिक की गई तत्व की आईडी टॉगल की जाती है, या छिपे हुए तत्व को छिपाया नहीं जाता है और छिपे हुए तत्व में क्लिक किया गया तत्व नहीं होता है, तो तत्व को टॉगल करें।

(function () {
    "use strict";
    var hidden = document.getElementById('hidden');
    document.addEventListener('click', function (e) {
        if (e.target.id == 'toggle' || (hidden.style.display != 'none' && !hidden.contains(e.target))) hidden.style.display = hidden.style.display == 'none' ? 'block' : 'none';
    }, false);
})();

यदि आप एक ही पृष्ठ पर एक से अधिक टॉगल करने जा रहे हैं, तो आप कुछ इस तरह से उपयोग कर सकते हैं:

  1. श्रेणी के नाम hiddenको बंधनेवाला आइटम में जोड़ें।
  2. दस्तावेज़ पर क्लिक करने पर, सभी छिपे हुए तत्वों को बंद करें, जिनमें क्लिक किए गए तत्व शामिल नहीं हैं और छिपे नहीं हैं
  3. यदि क्लिक किया गया तत्व एक टॉगल है, तो निर्दिष्ट तत्व को टॉगल करें।

(function () {
    "use strict";
    var hiddenItems = document.getElementsByClassName('hidden'), hidden;
    document.addEventListener('click', function (e) {
        for (var i = 0; hidden = hiddenItems[i]; i++) {
            if (!hidden.contains(e.target) && hidden.style.display != 'none')
                hidden.style.display = 'none';
        }
        if (e.target.getAttribute('data-toggle')) {
            var toggle = document.querySelector(e.target.getAttribute('data-toggle'));
            toggle.style.display = toggle.style.display == 'none' ? 'block' : 'none';
        }
    }, false);
})();
<a href="javascript:void(0)" data-toggle="#hidden1">Toggle Hidden Div</a>
<div class="hidden" id="hidden1" style="display: none;" data-hidden="true">This content is normally hidden</div>
<a href="javascript:void(0)" data-toggle="#hidden2">Toggle Hidden Div</a>
<div class="hidden" id="hidden2" style="display: none;" data-hidden="true">This content is normally hidden</div>
<a href="javascript:void(0)" data-toggle="#hidden3">Toggle Hidden Div</a>
<div class="hidden" id="hidden3" style="display: none;" data-hidden="true">This content is normally hidden</div>


13

मुझे आश्चर्य है कि वास्तव में किसी ने भी इस focusoutघटना को स्वीकार नहीं किया है :

var button = document.getElementById('button');
button.addEventListener('click', function(e){
  e.target.style.backgroundColor = 'green';
});
button.addEventListener('focusout', function(e){
  e.target.style.backgroundColor = '';
});
<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
</head>
<body>
  <button id="button">Click</button>
</body>
</html>


आपको मेरा जवाब याद आ रहा है मुझे लगता है। stackoverflow.com/a/47755925/6478359
मुहम्मदी

यह स्वीकृत उत्तर होना चाहिए, सीधे बिंदु पर। धन्यवाद!!!
लकी लाम

8

यदि आप IE और FF 3. * के लिए स्क्रिप्टिंग कर रहे हैं और आप बस यह जानना चाहते हैं कि क्या क्लिक एक निश्चित बॉक्स क्षेत्र में हुआ है, तो आप कुछ इस तरह का उपयोग कर सकते हैं:

this.outsideElementClick = function(objEvent, objElement){   
var objCurrentElement = objEvent.target || objEvent.srcElement;
var blnInsideX = false;
var blnInsideY = false;

if (objCurrentElement.getBoundingClientRect().left >= objElement.getBoundingClientRect().left && objCurrentElement.getBoundingClientRect().right <= objElement.getBoundingClientRect().right)
    blnInsideX = true;

if (objCurrentElement.getBoundingClientRect().top >= objElement.getBoundingClientRect().top && objCurrentElement.getBoundingClientRect().bottom <= objElement.getBoundingClientRect().bottom)
    blnInsideY = true;

if (blnInsideX && blnInsideY)
    return false;
else
    return true;}

8

इसके बजाय प्रवाह रुकावट, धब्बा / फोकस घटना या किसी अन्य मुश्किल टेकनीक का उपयोग करके, तत्व के रिश्तेदारी के साथ बस घटना प्रवाह का मिलान करें:

$(document).on("click.menu-outside", function(event){
    // Test if target and it's parent aren't #menuscontainer
    // That means the click event occur on other branch of document tree
    if(!$(event.target).parents().andSelf().is("#menuscontainer")){
        // Click outisde #menuscontainer
        // Hide the menus (but test if menus aren't already hidden)
    }
});

केवल ईवेंट श्रोता पर क्लिक को हटाने के लिए:

$(document).off("click.menu-outside");

मेरे लिए यह सबसे अच्छा उपाय था। एनीमेशन के बाद एक कॉलबैक में इसका इस्तेमाल किया, इसलिए मुझे किसी घटना को अलग करने की जरूरत थी। +1
क्वर्टीज़मैन

यहाँ एक निरर्थक जाँच है। यदि तत्व वास्तव में #menuscontainerआप अभी भी माता-पिता के माध्यम से जा रहे हैं। आपको पहले यह जांचना चाहिए, और यदि यह वह तत्व नहीं है, तो DOM ट्री ऊपर जाएं।
vsync

सही ! आप स्थिति को बदल सकते हैं if(!($(event.target).is("#menuscontainer") || $(event.target).parents().is("#menuscontainer"))){। यह एक छोटा अनुकूलन है, लेकिन आपके कार्यक्रम के जीवनकाल में केवल कुछ ही बार होता है: प्रत्येक क्लिक के लिए, यदि click.menu-outsideघटना पंजीकृत है। यह अब (+32 वर्ण) और का उपयोग नहीं करते विधि श्रृंखलन है
एमईएमएस

8

उपयोग:

var go = false;
$(document).click(function(){
    if(go){
        $('#divID').hide();
        go = false;
    }
})

$("#divID").mouseover(function(){
    go = false;
});

$("#divID").mouseout(function (){
    go = true;
});

$("btnID").click( function(){
    if($("#divID:visible").length==1)
        $("#divID").hide(); // Toggle
    $("#divID").show();
});

7

यदि कोई व्यक्ति यहाँ जावास्क्रिप्ट समाधान (es6) है:

window.addEventListener('mouseup', e => {
        if (e.target != yourDiv && e.target.parentNode != yourDiv) {
            yourDiv.classList.remove('show-menu');
            //or yourDiv.style.display = 'none';
        }
    })

और es5, बस मामले में:

window.addEventListener('mouseup', function (e) {
if (e.target != yourDiv && e.target.parentNode != yourDiv) {
    yourDiv.classList.remove('show-menu'); 
    //or yourDiv.style.display = 'none';
}

});


7

यहाँ शुद्ध जावास्क्रिप्ट द्वारा एक सरल समाधान है। यह ES6 के साथ अद्यतित है :

var isMenuClick = false;
var menu = document.getElementById('menuscontainer');
document.addEventListener('click',()=>{
    if(!isMenuClick){
       //Hide the menu here
    }
    //Reset isMenuClick 
    isMenuClick = false;
})
menu.addEventListener('click',()=>{
    isMenuClick = true;
})

"ईएस 6 के साथ अप-टू-डेट" एक बहुत ही साहसिक दावा है, जब ईएस 6 के साथ केवल एक ही तारीख अप-टू-डेट कर रही () => {}है function() {}। आपके पास जो कुछ भी है उसे ES6 के मोड़ के साथ सादे जावास्क्रिप्ट के रूप में वर्गीकृत किया गया है।
मोर्टेनमॉल्डर

@MortenMoulder: हां। यह केवल ध्यान के लिए है भले ही यह वास्तव में ईएस 6 है। लेकिन जरा समाधान देखिए। मुझे लगता है कि यह अच्छा है।
डुआनेक्स

यह वेनिला JS है और DOM से हटाए गए ईवेंट टारगेट के लिए काम करता है (जैसे कि जब आंतरिक पॉपअप से मूल्य का चयन किया जाता है, तो तुरंत पॉपअप बंद हो जाता है)। मुझ से +1!
ऐलिस

6

दस्तावेज़ पर एक क्लिक ईवेंट श्रोता हुक करें। ईवेंट श्रोता के अंदर, आप ईवेंट ऑब्जेक्ट को देख सकते हैं , विशेष रूप से, ईवेंट। यह देखने के लिए कि किस तत्व को क्लिक किया गया था:

$(document).click(function(e){
    if ($(e.target).closest("#menuscontainer").length == 0) {
        // .closest can help you determine if the element 
        // or one of its ancestors is #menuscontainer
        console.log("hide");
    }
});

6

मैंने स्क्रिप्ट के नीचे उपयोग किया है और jQuery के साथ किया है।

jQuery(document).click(function(e) {
    var target = e.target; //target div recorded
    if (!jQuery(target).is('#tobehide') ) {
        jQuery(this).fadeOut(); //if the click element is not the above id will hide
    }
})

नीचे HTML कोड खोजें

<div class="main-container">
<div> Hello I am the title</div>
<div class="tobehide">I will hide when you click outside of me</div>
</div>

आप यहाँ ट्यूटोरियल पढ़ सकते हैं


5
$(document).click(function() {
    $(".overlay-window").hide();
});
$(".overlay-window").click(function() {
    return false;
});

यदि आप दस्तावेज़ पर क्लिक करते हैं, तो दिए गए तत्व को छिपाएँ, जब तक कि आप उसी तत्व पर क्लिक न करें।


5

सबसे लोकप्रिय उत्तर के लिए अपवोट करें, लेकिन जोड़ें

&& (e.target != $('html').get(0)) // ignore the scrollbar

इसलिए, एक स्क्रॉल बार पर क्लिक करने से आपका लक्ष्य तत्व [छुपाने या जो भी] नहीं होता है।


5

आसान उपयोग और अधिक अभिव्यंजक कोड के लिए, मैंने इसके लिए एक jQuery प्लगइन बनाया:

$('div.my-element').clickOut(function(target) { 
    //do something here... 
});

नोट: लक्ष्य वह तत्व है जिस पर उपयोगकर्ता वास्तव में क्लिक करता है। लेकिन कॉलबैक को अभी भी मूल तत्व के संदर्भ में निष्पादित किया जाता है, इसलिए आप इसका उपयोग कर सकते हैं इस के रूप में आप एक jQuery कॉलबैक में उम्मीद थी।

लगाना:

$.fn.clickOut = function (parent, fn) {
    var context = this;
    fn = (typeof parent === 'function') ? parent : fn;
    parent = (parent instanceof jQuery) ? parent : $(document);

    context.each(function () {
        var that = this;
        parent.on('click', function (e) {
            var clicked = $(e.target);
            if (!clicked.is(that) && !clicked.parents().is(that)) {
                if (typeof fn === 'function') {
                    fn.call(that, clicked);
                }
            }
        });

    });
    return context;
};

डिफ़ॉल्ट रूप से, क्लिक इवेंट श्रोता को दस्तावेज़ पर रखा जाता है। हालाँकि, यदि आप ईवेंट श्रोता स्कोप को सीमित करना चाहते हैं, तो आप एक jQuery ऑब्जेक्ट में एक पेरेंट लेवल एलिमेंट का प्रतिनिधित्व कर सकते हैं जो कि टॉप पेरेंट होगा, जिस पर क्लिक की बात सुनी जाएगी। यह अनावश्यक दस्तावेज़ स्तर ईवेंट श्रोताओं को रोकता है। जाहिर है, यह तब तक काम नहीं करेगा जब तक कि आपूर्ति की गई मूल तत्व आपके प्रारंभिक तत्व के माता-पिता न हों।

ऐसे उपयोग करें:

$('div.my-element').clickOut($('div.my-parent'), function(target) { 
    //do something here...
});
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.