2012-11-30 19 views
54

मैं एक और मोडल के अंदर एक मॉडल करने की कोशिश करता हूं। हालांकि, मुझे फ़ायरफ़ॉक्स में "बहुत अधिक रिकर्सन" जैसी त्रुटि मिली।ट्विटर बूटस्ट्रैप एकाधिक मोडल त्रुटि

मैंने नवीनतम jQuery और ट्विटरबूटस्ट्रैप का उपयोग किया लेकिन अभी भी यह समस्या है।

यहाँ plunker कि त्रुटि से पता चलता है

आप पा सकते हैं "Uncaught RangeError: अधिकतम कॉल स्टैक आकार से अधिक हो" या "बहुत ज्यादा प्रत्यावर्तन" कंसोल में

त्रुटि

किसी को भी जानता है कि कैसे करने के लिए इसे ठीक करो ? धन्यवाद

उत्तर

34

ठीक है, ऐसा लगता है कि यह एक समस्या है।

(जाहिरा तौर पर मैं कुंजी शब्द का प्रयोग करना चाहिए "Uncaught RangeError: अधिकतम कॉल स्टैक आकार से अधिक हो" के बदले "बहुत ज्यादा प्रत्यावर्तन" :()

यहाँ समाधान कर रहे हैं

1. मॉडल को संशोधित। .js

इस पोस्ट में

, https://github.com/twbs/bootstrap/pull/5022

@onassar एक समाधान को लाने

Follow up: for anyone working with bootstrap-modal v2.2.0, in the enforceFocus method, commenting out that.$element.focus() seems to fix the issue.

The result of this is the modal's don't get focused upon (pfft, I can do that myself :P), and thus, the multiple modals don't challenge one-another for focus (which resulted in an infinite loop, and a rangerror/recursive loop).

Hope that helps :)

मैंने कोशिश की और यह काम करता है। (plunker)

2. उपयोग another plugin संबोधित करने के लिए इसDemo

ऐसा लगता है यह बहुत अच्छी तरह से काम करता है की तरह।

3. आधिकारिक समाधान की प्रतीक्षा करें।

उनके roadmap में, वे किसी भी समय इस मॉडल प्लगइन को फिर से लिखना चाहते हैं।

+1

करके मैं अपने पहले समाधान का इस्तेमाल किया और यह पूरी तरह काम करता है। यह वास्तव में एक कष्टप्रद मुद्दा था। धन्यवाद! – cortex

+0

@maxisam modal.js को संशोधित करना गलत है - दूसरों को ऐसा करने का सुझाव देना और फिर उस प्रभाव के लिए अपना स्वयं का जवाब स्वीकार करना बेहद गलत है –

+0

@ जॉर्ज जॉर्जिया 3 विकल्प उपलब्ध कराए गए थे। और मुझे लगता है कि मेरा समाधान उस समय मेरे प्रश्न को ठीक करता है, और यह दूसरों के लिए जानकारी प्रदान करता है, इसलिए यह मेरे लिए अच्छा जवाब है। मैं अब इस प्लगइन का उपयोग नहीं करता हूं। और टीबी 3 बाहर है, मुझे संदेह है कि यह जवाब अभी भी उपयोगी है। मुझे खुशी है कि आप लगभग एक साल बाद बेहतर समाधान प्रदान कर सकते हैं। मुझे नहीं पता कि मुझे इसके साथ क्या करना चाहिए। और मुझे नहीं पता कि मैं अपने स्वयं के उपयोग के लिए प्लगइन को क्यों संशोधित नहीं कर सकता। यह एक आदर्श दृष्टिकोण नहीं हो सकता है, लेकिन इस मामले पर कोई अधिकार और गलत नहीं है। – maxisam

7

4. या आप कर सकता है निम्नलिखित जब एक नया मॉडल दिखा:

  1. छिपाएं किसी भी मॉडल है कि वर्तमान में सक्रिय
  2. नया मोडल
  3. दिखाएँ जब आप नए मॉडल बंद है यह शो पहले से छिपा मोडल (रों)

    var showModal = function ($dialog) { 
        var $currentModals = $('.modal.in'); 
        if ($currentModals.length > 0) { // if we have active modals 
         $currentModals.one('hidden', function() { 
          // when they've finished hiding 
          $dialog.modal('show'); 
          $dialog.one('hidden', function() { 
           // when we close the dialog 
           $currentModals.modal('show'); 
    
          }); 
         }).modal('hide'); 
        } else { // otherwise just simply show the modal 
         $dialog.modal('show'); 
        } 
    }; 
    

नोट: मैं केवल श्रोता एक बार और नहीं करने के लिए आवेदन किया है $.one का उपयोग देखभाल करने के लिए के बारे में bind/unbind (on/off)

+0

क्या आप AngularJS UI से ट्विटर बूटस्ट्रैप का उपयोग कर रहे हैं? – maxisam

+0

नहीं। मैं आधिकारिक संस्करण (2.3.1) – Matyas

+0

का उपयोग कर रहा हूं, यह एक अच्छा विचार है, हालांकि, यदि दूसरा मोडल लोडिंग पॉपअप मोडल है, तो आमतौर पर आप पिछले स्क्रीन को स्क्रीन पर भी रखना चाहते हैं। – maxisam

93

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

बस बूटस्ट्रैप फ़ाइलों को शामिल करने के बाद कहीं भी इस पंक्ति को लिखें।

$.fn.modal.Constructor.prototype.enforceFocus = function() {}; 

नोट: यह केवल, बूटस्ट्रैप 3.

+0

मैंने बूटस्ट्रैप मोडल का उपयोग करने का प्रयास किया जिसमें मॉडलों को ढेर करने के लिए एक मॉडलमेनर (https://github.com/jschr/bootstrap-modal) है। बाहर निकलने के लिए आपको एक मॉडल के भीतर से एक मॉडल को बनाने और कॉल करने की आवश्यकता है। यह चाल है! –

+2

धन्यवाद, यह स्रोत संपादित करने से कहीं अधिक आसान है और मैं इसे केवल उन पृष्ठों पर उपयोग कर सकता हूं जहां इसकी आवश्यकता है। –

+0

इस तरह से काम करता है, लेकिन उम्मीद है कि यह smth अन्य के लिए कोई समस्या नहीं होगी – dav

1

साथ नहीं बूटस्ट्रैप 2 के साथ परीक्षण किया गया है मैं इस एक ढेर का उपयोग कर हल किया।

var openmodals = []; 
$(function(){ 
    var ts = new Date().getTime(); 
    $("div.modal").each(function(d) { 
    ts++; 
    $(this).data("uid", ts); 
    }); 

    // after closing > 1 level modals we want to reopen the previous level modal 
    $('div.modal').on('show', function (d) { 
    openmodals.push({ 'id' : $(this).data("uid"), 'el' : this }); 
    if(openmodals.length > 1){ 
     $(openmodals[ openmodals.length - 2 ].el).modal('hide'); 
    } 
    }); 
    $('div.modal').on('hide', function (d) { 
    if(openmodals.length > 1){ 
     if(openmodals[ openmodals.length - 1 ].id == $(this).data("uid")){ 
      openmodals.pop(); // pop current modal 
      $(openmodals.pop().el).modal('show'); // pop previous modal and show, will be pushed on show 
     } 
    } else if(openmodals.length > 0){ 
     openmodals.pop(); // last modal closing, empty the stack 
    } 
    }); 
}); 
23

स्मार्टलोव का जवाब दुर्भाग्य से कम हो जाता है; यदि आप नो-ऑप $.fn.modal.Constructor.prototype.enforceFocus पर जा रहे हैं, तो आपको अपना मोडल बंद होने पर इसे रीसेट करना चाहिए;

// Since confModal is essentially a nested modal it's enforceFocus method 
// must be no-op'd or the following error results 
// "Uncaught RangeError: Maximum call stack size exceeded" 
// But then when the nested modal is hidden we reset modal.enforceFocus 
var enforceModalFocusFn = $.fn.modal.Constructor.prototype.enforceFocus; 

$.fn.modal.Constructor.prototype.enforceFocus = function() {}; 

$confModal.on('hidden', function() { 
    $.fn.modal.Constructor.prototype.enforceFocus = enforceModalFocusFn; 
}); 

$confModal.modal({ backdrop : false }); 
+0

मुझे खुशी है कि आपको एक वर्ष के बाद एक अच्छा दृष्टिकोण मिला। मैं आपको एक उथल-पुथल दूंगा। चूंकि मैं अब इसका उपयोग नहीं करता, इसलिए मुझे नहीं पता कि यह उस समय मेरी समस्या को पूरी तरह से संबोधित कर सकता है या नहीं। – maxisam

+1

मैं आपके उत्तर से बेहतर उत्तर उन्मुख लोगों के लिए एक लिंक बनाने के लिए तैयार हूं, लेकिन क्या आप अपने उत्तर के सटीक लाभ (ओं) के बारे में अधिक विशिष्ट हो सकते हैं? मैंने बिना किसी समस्या के कई महीनों से उत्पादन में अपना जवाब इस्तेमाल किया है। कृपया ध्यान दें कि मेरे पास मूल प्रवर्तन फोकस() के लक्ष्य का केवल एक दूरस्थ विचार है। मैंने सोचा कि यह स्वचालित रूप से मोडल पर ध्यान केंद्रित करता है लेकिन ऐसा लगता है कि ऐसा नहीं लगता है (भले ही मैं अपना हैक हटा दूं)। –

+0

मुझे यह समझने के लिए पर्याप्त रूप से ढांचे को नहीं पता कि फोकस क्या करता है। हालांकि, जब आप इसे ओवर-राइड करते हैं, तो इसे बस मूलभूत कार्य/मूल्य पर सेट करने के लिए सबसे अच्छा * होना चाहिए, और यह सभी जावास्क्रिप्ट ढांचे में सबसे अच्छा अभ्यास है - उदाहरण के लिए यह मेरी तरह की चीज है ExtJS का उपयोग कर अपने 4.5 वर्षों के दौरान करो। –

1

निम्नलिखित सीएसएस का प्रयास करें: निम्न हमारे कोड, जिसके बारे में मैं कोई हिचक उत्पादन में डाल दिया है से सीधे है। यह मेरे लिए काम किया।

span.select2-container { 
    z-index:10050; 
} 
+0

यह मेरे लिए काम किया :) धन्यवाद। – user3616741

0

बूटस्ट्रैप 4 के लिए, की जगह: $.fn.modal.Constructor.prototype.**enforceFocus** $.fn.modal.Constructor.prototype.**_enforceFocus**

संबंधित मुद्दे