दिलचस्प पोस्ट
AngularJS फ़ोल्डर संरचना आगंतुक से वास्तविक आईपी कैसे प्राप्त करें? क्यूटी के साथ सीरियलाइज़ेशन कोर ग्राफिक्स वस्तुओं के साथ एआरसी काम करता है? जावास्क्रिप्ट का उपयोग करते हुए * .CSV फ़ाइल से डेटा कैसे पढ़ा जाए? एंड्रॉइड प्रोग्रामिंग: एक सरल फाइल ब्राउज़र बनाने के लिए कहाँ शुरू करें? सिथन के साथ सी कोड का सरल लपेटन मॉड्यूल डिस्क्रिप्टर वर्ग को लोड करने में विफल: कक्षा "com.google.android.gms.dynamite.descriptors.com.google.firebase.auth.ModuleDescriptor" नहीं मिला डीआईवी में वेबसाइट लोड करें Iostream.h कहां प्राप्त करें मैं अजैक्स को Django अनुप्रयोगों के साथ कैसे एकीकृत कर सकता हूं? उद्देश्य-सी में स्ट्रिंग प्रतिस्थापन क्या जावा में ग्रेडबल में एक चर को घोषित करना संभव है? स्प्रिंग-एमवीसी में सत्र के गुणों का उपयोग कैसे करें सीधी डीआई कोड के विरोध में मुझे आईओसी कंटेनर की आवश्यकता क्यों है?

क्लिक करें ड्रॉपडाउन मेनू पर क्लिक करें अंदर पर क्लिक करें

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

इससे बचने के लिए, मैं आसानी से ड्रॉप डाउन मेनू पर एक क्लिक ईवेंट हैंडलर संलग्न कर सकता हूं और बस प्रसिद्ध event.stopPropagation() जोड़ सकता event.stopPropagation()

 <ul class="nav navbar-nav"> <li class="dropdown mega-dropdown"> <a href="javascript:;" class="dropdown-toggle" data-toggle="dropdown"> <i class="fa fa-list-alt"></i> Menu item 1 <span class="fa fa-chevron-down pull-right"></span> </a> <ul class="dropdown-menu mega-dropdown-menu"> <li> <div id="carousel" class="carousel slide" data-ride="carousel"> <ol class="carousel-indicators"> <li data-slide-to="0" data-target="#carousel"></li> <li class="active" data-slide-to="1" data-target="#carousel"></li> </ol> <div class="carousel-inner"> <div class="item"> <img alt="" class="img-rounded" src="img1.jpg"> </div> <div class="item active"> <img alt="" class="img-rounded" src="img2.jpg"> </div> </div> <a data-slide="prev" role="button" href="#carousel" class="left carousel-control"> <span class="glyphicon glyphicon-chevron-left"></span> </a> <a data-slide="next" role="button" href="#carousel" class="right carousel-control"> <span class="glyphicon glyphicon-chevron-right"></span> </a> </div> </li> </ul> </li> </ul> 

यह आसान और बहुत ही सामान्य व्यवहार लगता है, और क्योंकि carousel-controls (साथ ही carousel indicators ) ईवेंट हैंडलर को document ऑब्जेक्ट में सौंपे जाते हैं, इन तत्वों ( पिछला / अगले नियंत्रण, …) पर click ईवेंट हो जाएगा "अवहेलना करना"।

 $('ul.dropdown-menu.mega-dropdown-menu').on('click', function(event){ // The event won't be propagated up to the document NODE and // therefore delegated events won't be fired event.stopPropagation(); }); 

चहचहाना बूटस्ट्रैप ड्रॉपडाउन hide / hidden घटनाओं पर भरोसा करना निम्नलिखित कारणों का समाधान नहीं है:

  • दोनों ईवेंट हैंडलर के लिए प्रदान की गई घटना आपको क्लिक किए गए तत्व का संदर्भ नहीं देते
  • ड्रॉपडाउन मेनू सामग्री गतिशील रूप से उत्पन्न होती है इसलिए कोई flag श्रेणी जोड़ना संभव नहीं है

यह बेला सामान्य व्यवहार है और यह बेला event.stopPropagation() है।

अद्यतन करें

अपने जवाब के लिए रोमन के लिए धन्यवाद मुझे यह भी पता चला है कि आप नीचे पा सकते हैं

वेब के समाधान से एकत्रित समाधान "क्लिक करें ड्रॉपडाउन मेनू पर क्लिक करें अंदर पर क्लिक करें"

डेटा विशेषता data-toggle="dropdown" हटाने और data-toggle="dropdown" के खुले / बंद को कार्यान्वित करना एक समाधान हो सकता है।

इस तरह से ड्रॉपडाउन को खोलने / बंद करने के लिए लिंक पर क्लिक करने से पहले:

 $('li.dropdown.mega-dropdown a').on('click', function (event) { $(this).parent().toggleClass('open'); }); 

और फिर ड्रॉपडाउन के बाहर क्लिकों को इस तरह बंद करने के लिए सुनना:

 $('body').on('click', function (e) { if (!$('li.dropdown.mega-dropdown').is(e.target) && $('li.dropdown.mega-dropdown').has(e.target).length === 0 && $('.open').has(e.target).length === 0 ) { $('li.dropdown.mega-dropdown').removeClass('open'); } }); 

यहां डेमो है: http://jsfiddle.net/RomaLefrancois/hh81rhcm/2/

यह रूप में अच्छी तरह से मदद करनी चाहिए

 $(document).on('click', 'someyourContainer .dropdown-menu', function (e) { e.stopPropagation(); }); 

बूटस्ट्रैप निम्नलिखित फ़ंक्शन प्रदान करता है:

  |  छुपा उदाहरण विधि जब यह घटना तुरंत निकाल दी गई है 
 hide.bs.dropdown |  बुलाया गया।  टॉगलिंग एंकर तत्व के रूप में उपलब्ध है 
                  |  ईवेंट की संबंधित लक्षित संपत्ति 

इसलिए, इस फ़ंक्शन को कार्यान्वित करना बंद होने से ड्रॉपडाउन को अक्षम करने में सक्षम होना चाहिए।

 $('#myDropdown').on('hide.bs.dropdown', function (e) { var target = $(e.target); if(target.hasClass("keepopen") || target.parents(".keepopen").length){ return false; // returning false should stop the dropdown from hiding. }else{ return true; } }); 

मुझे एक समाधान मिला

यह सोचते हुए कि Twitter Bootstrap Components संबंधित ईवेंट हैंडलरों को document ऑब्जेक्ट में सौंप दिया जाता है, मैं संलग्न हैंडल को लूप करता हूं और जांचता हूं कि वर्तमान क्लिक तत्व (या इसके माता-पिता में से किसी) को एक प्रतिनिधि कार्यक्रम से चिंतित है या नहीं।

 $('ul.dropdown-menu.mega-dropdown-menu').on('click', function(event){ var events = $._data(document, 'events') || {}; events = events.click || []; for(var i = 0; i < events.length; i++) { if(events[i].selector) { //Check if the clicked element matches the event selector if($(event.target).is(events[i].selector)) { events[i].handler.call(event.target, event); } // Check if any of the clicked element parents matches the // delegated event selector (Emulating propagation) $(event.target).parents(events[i].selector).each(function(){ events[i].handler.call(this, event); }); } } event.stopPropagation(); //Always stop propagation }); 

आशा है कि यह किसी भी एक समान समाधान की तलाश में मदद करता है।

आपकी मदद के लिए आप सभी को शुक्रिया।

क्लास ड्रॉपडाउन-मेन्यू के बाद एक फॉर्म टैग डालने के लिए सबसे अच्छा जवाब है

तो आपका कोड है

 <ul class="dropdown-menu"> <form> <li> <div class="menu-item">bla bla bla</div> </li> </form> </ul> 
 $('body').on("click", ".dropdown-menu", function (e) { $(this).parent().is(".open") && e.stopPropagation(); }); 

यह किसी भी स्थिति के लिए काम कर सकता है

 $('ul.nav.navbar-nav').on('click.bs.dropdown', function(e){ var $a = $(e.target), is_a = $a.is('.is_a'); if($a.hasClass('dropdown-toggle')){ $('ul.dropdown-menu', this).toggle(!is_a); $a.toggleClass('is_a', !is_a); } }).on('mouseleave', function(){ $('ul.dropdown-menu',this).hide(); $('.is_a', this).removeClass('is_a'); }); 

मैंने इसे एक बार फिर अपडेट किया है ताकि संभव हो सके सबसे बढ़िया और कार्यात्मक हो। अब जब आप एनएवी के बाहर मंडराना करते हैं, तब इसे बंद कर देते हैं, जबकि आप इसे अंदर रखते हैं। बस एकदम सही।

मुझे हाल ही में एक समान समस्या मिली है और इसे डेटा विशेषता data-toggle="dropdown" को हटाने और event.stopPropagation() साथ click करने के लिए इसे हल करने के लिए अलग-अलग तरीकों का प्रयास किया गया। event.stopPropagation() कॉलिंग

दूसरा रास्ता अधिक बेहतर लग रहा है इसके अलावा डेवलपर्स बूटस्ट्रैप इस तरह से उपयोग करते हैं। स्रोत फ़ाइल में मुझे ड्रॉपडाउन तत्वों का आरम्भिकरण मिला है:

 // APPLY TO STANDARD DROPDOWN ELEMENTS $(document) .on('click.bs.dropdown.data-api', clearMenus) .on('click.bs.dropdown.data-api', '.dropdown form', function (e) { e.stopPropagation() }) .on('click.bs.dropdown.data-api', toggle, Dropdown.prototype.toggle) .on('keydown.bs.dropdown.data-api', toggle, Dropdown.prototype.keydown) .on('keydown.bs.dropdown.data-api', '.dropdown-menu', Dropdown.prototype.keydown) }(jQuery); 

तो, यह पंक्ति:

 .on('click.bs.dropdown.data-api', '.dropdown form', function (e) { e.stopPropagation() }) 

सुझाव देता है कि आप ड्रॉप डाउन मेनू बंद करने से बचने के लिए कक्षा .dropdown साथ कंटेनर के अंदर एक form तत्व डाल सकते हैं।

jQuery:

 <script> $(document).on('click.bs.dropdown.data-api', '.dropdown.keep-inside-clicks-open', function (e) { e.stopPropagation(); }); </script> 

HTML:

 <div class="dropdown keep-inside-clicks-open"> <button class="btn btn-primary dropdown-toggle" type="button" data-toggle="dropdown"> Dropdown Example <span class="caret"></span> </button> <ul class="dropdown-menu"> <li><a href="#">HTML</a></li> <li><a href="#">CSS</a></li> <li><a href="#">JavaScript</a></li> </ul> </div> 

डेमो :

सामान्य: https://jsfiddle.net/kerryjohnson/omefq68b/1/

इस समाधान के साथ आपका डेमो: http://jsfiddle.net/kerryjohnson/80oLdtbf/101/

आप प्रचार से ड्रॉपडाउन पर क्लिक करना बंद कर सकते हैं और फिर हिंडोला जावास्क्रिप्ट विधियों का उपयोग कर मैन्युअली हिंडोझल नियंत्रण को पुनःपूर्ति कर सकते हैं।

 $('ul.dropdown-menu.mega-dropdown-menu').on('click', function(event) { event.stopPropagation(); }); $('a.left').click(function () { $('#carousel').carousel('prev'); }); $('a.right').click(function () { $('#carousel').carousel('next'); }); $('ol.carousel-indicators li').click(function (event) { var index = $(this).data("slide-to"); $('#carousel').carousel(index); }); 

यहां जेएसफ़िल्ड है

Angular2 बूटस्ट्रैप के साथ, आप अधिकांश स्थितियों के लिए गैर-इनपुट का उपयोग कर सकते हैं:

 <div dropdown autoClose="nonInput"> 

nonInput – (डिफ़ॉल्ट) स्वचालित रूप से ड्रॉपडाउन को बंद कर देता है जब इसके तत्वों में से किसी एक पर क्लिक किया जाता है – जब तक कि क्लिक किया गया तत्व कोई इनपुट या टेक्स्टरेआ नहीं होता है

https://valor-software.com/ng2-bootstrap/#/dropdowns

उदाहरण के लिए बूटस्ट्रैप 4 अल्फा में यह मेनू इवेंट है क्यों नहीं उपयोग करें?

 // PREVENT INSIDE MEGA DROPDOWN $('.dropdown-menu').on("click.bs.dropdown", function (e) { e.stopPropagation(); e.preventDefault(); }); 

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

 angular.module('app').directive('dropdownPreventClose', function() { return { restrict: 'A', link: function(scope, element, attrs) { element.on('click', function(e) { e.stopPropagation(); //prevent the default behavior of closing the dropdown-menu }); } }; }); 

फिर बस अपने तत्व के dropdown-prevent-close विशेषता जोड़ें, जो मेनू को बंद करने के लिए ट्रिगर कर रहा है, और उसे इसे रोकना चाहिए। मेरे लिए, यह एक ऐसा तत्व था जो स्वचालित रूप से मेनू बंद कर देता था:

 <div class="dropdown-menu"> <select dropdown-prevent-close name="myInput" id="myInput" ng-model="myModel"> <option value="">Select Me</option> </select> </div> 

मुझे कोई समाधान नहीं मिला है क्योंकि मैं डिफ़ॉल्ट बूटस्ट्रैप एनएवी का उपयोग करना चाहूंगा इस समस्या का मेरा समाधान यहां है:

  $(document).on('hide.bs.dropdown', function (e) { if ($(e.currentTarget.activeElement).hasClass('dropdown-toggle')) { $(e.relatedTarget).parent().removeClass('open'); return true; } return false; }); 

कुछ जावास्क्रिप्ट या jquery कोड (पहिया reinventing) लिखने के बजाय उपरोक्त परिदृश्य बूटस्ट्रैप स्वत: बंद विकल्प द्वारा प्रबंधित किया जा सकता है। आप ऑटो-बंद करने के लिए मूल्यों में से कोई भी प्रदान कर सकते हैं:

  1. हमेशा – (डिफ़ॉल्ट) स्वचालित रूप से ड्रॉपडाउन को बंद कर देता है जब इसके किसी एक तत्व को क्लिक किया जाता है।

  2. outsideClick – ड्रॉपडाउन के बाहर उपयोगकर्ता किसी भी तत्व को क्लिक करने पर स्वचालित रूप से केवल ड्रॉपडाउन बंद कर देता है

  3. अक्षम – ऑटो बंद को अक्षम करता है

निम्नलिखित पाउडर पर एक नज़र डालें:

http://plnkr.co/edit/gnU8M2fqlE0GscUQtCWa?p=preview

सेट

 uib-dropdown auto-close="disabled" 

उम्मीद है की यह मदद करेगा 🙂

 $(function() { $('.mega-dropdown').on('hide.bs.dropdown', function(e) { var $target = $(e.target); return !($target.hasClass("keep-open") || $target.parents(".keep-open").size() > 0); }); $('.mega-dropdown > ul.dropdown-menu').on('mouseenter', function() { $(this).parent('li').addClass('keep-open') }).on('mouseleave', function() { $(this).parent('li').removeClass('keep-open') }); }); 

मेरे लिए सबसे आसान काम समाधान यह है:

  • उन तत्वों के लिए keep-open वर्ग जोड़ना जिससे ड्रॉपडाउन बंद होने का कारण नहीं होना चाहिए
  • और कोड का यह टुकड़ा बाकी है:
 $('.dropdown').on('click', function(e) { var target = $(e.target); var dropdown = target.closest('.dropdown'); return !dropdown.hasClass('open') || !target.hasClass('keep-open'); }); 

[बूटस्ट्रैप 4 अल्फा 6] [रेल] डेवलपर्स के लिए, ई e.stopPropagation() लिए अवांछनीय व्यवहार की ओर ले जाएगा, data-method साथ get करने के बराबर नहीं, क्योंकि यह डिफ़ॉल्ट रूप से आपके सभी अनुरोध को वापस get

इस समस्या का समाधान करने के लिए, मैं इस समाधान का सुझाव देता हूं, जो सार्वभौमिक है

 $('.dropdown .dropdown-menu').on('click.bs.dropdown', function() { return $('.dropdown').one('hide.bs.dropdown', function() { return false; }); }); 
 $('.dropdown .dropdown-menu').on('click.bs.dropdown', function() { return $('.dropdown').one('hide.bs.dropdown', function() { return false; }); }); 
 <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0-alpha.6/css/bootstrap.min.css" integrity="sha384-rwoIResjU2yc3z8GV/NPeZWAv56rSmLldC3R/AZzGRnGxQQKnKkoFVhFQhNUwEyJ" crossorigin="anonymous"> <script src="https://code.jquery.com/jquery-3.1.1.slim.min.js" integrity="sha384-A7FZj7v+d/sdmMqp/nOQwliLvUsJfDHW+k9Omg/a/EheAdgtzNs3hpfag6Ed950n" crossorigin="anonymous"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/tether/1.4.0/js/tether.min.js" integrity="sha384-DztdAPBWPRXSA/3eYEEUWrWCy7G5KFbe8fFjk5JAIxUYHKkDx6Qin1DkWx51bBrb" crossorigin="anonymous"></script> <script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0-alpha.6/js/bootstrap.min.js" integrity="sha384-vBWWzlZJ8ea9aCX4pEW3rVHjgjt7zpkNpZk+02D9phzyeVkE+jo0ieGizqPLForn" crossorigin="anonymous"></script> <ul class="nav navbar-nav"> <li class="dropdown mega-dropdown"> <a href="javascript:;" class="dropdown-toggle" data-toggle="dropdown"> <i class="fa fa-list-alt"></i> Menu item 1 <span class="fa fa-chevron-down pull-right"></span> </a> <ul class="dropdown-menu mega-dropdown-menu"> <li> <div id="carousel" class="carousel slide" data-ride="carousel"> <ol class="carousel-indicators"> <li data-slide-to="0" data-target="#carousel"></li> <li class="active" data-slide-to="1" data-target="#carousel"></li> </ol> <div class="carousel-inner"> <div class="item"> <img alt="" class="img-rounded" src="img1.jpg"> </div> <div class="item active"> <img alt="" class="img-rounded" src="img2.jpg"> </div> </div> <a data-slide="prev" role="button" href="#carousel" class="left carousel-control"> <span class="glyphicon glyphicon-chevron-left"></span> </a> <a data-slide="next" role="button" href="#carousel" class="right carousel-control"> <span class="glyphicon glyphicon-chevron-right"></span> </a> </div> </li> </ul> </li> </ul> 

.dropdown सामग्री में किसी भी लेबल पर .keep-open वर्ग को ऐसा करना:

 $('.dropdown').on('click', function (e) { var target = $(e.target); var dropdown = target.closest('.dropdown'); if (target.hasClass('keep-open')) { $(dropdown).addClass('keep-open'); } else { $(dropdown).removeClass('keep-open'); } }); $(document).on('hide.bs.dropdown', function (e) { var target = $(e.target); if ($(target).is('.keep-open')) { return false } }); 

पिछले मामलों में कंटेनर ऑब्जेक्ट से संबंधित घटनाओं से परहेज किया जाता था, अब कंटेनर वर्ग को रखता है और बंद होने से पहले चेक करता है।

मेरे लिए और कुछ भी काम नहीं किया, इसलिए मैंने आखिरकार ऐसा किया जो समस्या को खुद तय कर ले।

यह कुछ और ब्रेकिंग के बिना समस्या हल करता है

 $(".navbar").on("click",".megadropdown .dropdown-menu,.megadropdown .dropdown-menu *",function(e){ setTimeout(function(){$(e.target).parents(".dropdown").addClass("open");},50); }); 
 $(function() { var closeble = false; $('body').on('click', function (e) { if (!$(event.target).is("a.dropdown-toggle")) { closeble = false; } }); $('.dropdown').on({ "click": function(event) { if ($(event.target).closest('.dropdown-toggle').length) { closeble = true; } else { closeble = false; } }, "hide.bs.dropdown": function() { return closeble; } }); 

});