2009-07-07 2 views
7

मैं ओवरले क्लिक होने पर बॉक्स को बंद करने के लिए एक jQuery UI मोडल संवाद बॉक्स के डिफ़ॉल्ट व्यवहार को ओवरराइड करने का प्रयास कर रहा हूं। मेरे पास नीचे वाला कोड पहली बार खोलने के बाद डायलॉग बॉक्स बंद कर देगा और ओवरले पर क्लिक करेगा। जब मैं फिर से संवाद बॉक्स खोलता हूं, ओवरले पर क्लिक करने से कुछ भी नहीं होता है। मुझे यहां एक घटना याद आ रही है। क्या कोई यह बता सकता है कि मैं यहां क्या गलत कर रहा हूं?jQuery UI 1.7.1 ओवरले पर मॉडल बंद करें

धन्यवाद!

$(function(){ 

     $('#production_schedule_dialog').dialog({ 
      autoOpen: false, 
      width: 570, 
      modal: true, 
      closeOnEscape: true 
     }); 

     $('#production_schedule_dialog_link').click(function(){ 
      $('#production_schedule_dialog').dialog('open'); 
      return false; 
     }); 

     $(document).bind('click', dialogBlur); 
}); 


var dialogBlur = function(event){ 
    var target = $(event.target); 
    if (target.is('.ui-dialog') || target.parents('.ui-dialog').length) { 
     return; 
    } 

    $('.ui-dialog:visible').find('.ui-dialog-titlebar-close').trigger('click'); 

    $(document).unbind('click', dialogBlur); 
} 

उत्तर

1

आपके उदाहरण को देखते हुए ऐसा लगता है कि आप ईवेंट को अनबाइंड कर रहे हैं और इसे बैक अप सेट नहीं कर रहे हैं।

अपने बाँध कॉल ले जाने का प्रयास:

$('#production_schedule_dialog_link').click(function(){ 
      $('#production_schedule_dialog').dialog('open'); 
      $(document).bind('click', dialogBlur); 
      return false; 
    }); 

कि आपके कलंक श्रोता हर बार अपने संवाद को खोला जाता है rebind चाहिए।

4

मैं क्यों अपने कोड काम नहीं कर रहा यकीन नहीं है, लेकिन मैं इसे ले लिया है, इसे संशोधित, और एक संस्करण दोनों के रूप में आप काम करने के लिए लगता है कि हो गया और मैं चाहता हूँ:

var openDialogWindow = function(dialogId) 
{ 

    $(dialogId).dialog('open'); 
    $(".ui-widget-overlay").bind("click", closeDialogWindowOnOverlayClick); 
} 

var closeDialogWindowOnOverlayClick = function(event){ 
    var closeButton = $(".ui-dialog:visible").find(".ui-dialog-titlebar-close"); 
    closeButton.trigger("click"); 
    $(".ui-widget-overlay").unbind("click", closeDialogWindowOnOverlayClick); 
} 

बड़ा अंतर यहां यह है कि मैं JQuery के ओवरले ऑब्जेक्ट (दस्तावेज़ के बजाए, जैसा कि आप हैं) पर क्लिक करने के लिए संवाद-समापन तर्क को बाध्य कर रहा हूं। और जब संवाद बंद हो जाता है तो संवाद बाँधता है और इसे बाध्य करता है। वास्तव में जरूरी नहीं है, लेकिन यह चीजों को साफ रखता है।

भले ही, प्रेरणा के लिए धन्यवाद। एक

$('.ui-widget-overlay').live("click", function() { 
    //Close the dialog 
    $("#dialog").dialog("close"); 
}); 
+0

मैं 5 अलग अलग तरीकों की तरह करने की कोशिश की इस एक ही है मैं 'ओपन' ईवेंट में निर्मित संवाद के माध्यम से काम कर रहा था (और सबसे साफ)। मैंने $ (".ui-widget-overlay") के साथ एक डिफ़ॉल्ट DialogOptions चर परिभाषित किया है। बाध्य ("क्लिक करें", closeDialogWindowOnOverlayClick); 'ओपन' इवेंट कॉलबैक के अंदर और मैं इस सेटिंग से अपने सभी साइट-व्यापी संवाद प्राप्त करता हूं उर्फ ​​$ ('

')। डियालॉग ($। विस्तार ({}, defualtSettings, {/ * विशिष्ट सेटिंग्स * /}); खूबसूरती से काम करता है। धन्यवाद! – parliament

15

सबसे आसान तरीका यह करने के लिए: http://www.ryanjeffords.com/blog/entry/closing-a-jquery-ui-dialog-when-the-dialog-loses-focus

इस जोड़े सरल पुन: प्रयोज्य एक।

$('.ui-widget-overlay').live('click', function(event) 
{ 
    $(this).prev().find('div:nth-child(2)').dialog('close'); 
}); 
+2

.live() को बहिष्कृत किया गया है, इसके बजाय .on() का उपयोग करें। –

+1

यहां अद्यतन उत्तर: http: // stackoverflow।कॉम/ए/10353694/124486 –

+0

यह किसी पृष्ठ पर एकाधिक संवादों के लिए एक्स्टेंसिबल नहीं है। – montrealist

0

इतने सारे जटिल जवाब ... यहाँ है:

+0

.live को –

10

यदि आप jQuery के पुराने संस्करण (प्री-1.7) का उपयोग कर रहे हैं तो पॉल का समाधान ठीक काम करता है। हालांकि .live() हालांकि बहिष्कृत है। इसके बजाय on() का उपयोग करने का प्रयास करें।

$('.ui-widget-overlay').on("click", function() { 
    //Close the dialog 
    $(this).find(".dialog").dialog("close"); 
}); 
+4

हटा दिया गया है '.ui-widget-overly' गतिशील रूप से बनाया गया है। आपको यह सुनिश्चित करने की आवश्यकता है कि इस लाइन को जोड़ने से पहले तत्व मौजूद है। दस्तावेज़ पर ईवेंट जोड़ने का एक बेहतर तरीका होगा: '$ (दस्तावेज़) .on ('क्लिक करें', फ़ंक्शन() {$ ('। संवाद')। संवाद (" बंद करें ");});' – tothemario

+0

हां , '.ui-widget-overly' गतिशील रूप से बनाया गया है, इसलिए आवश्यक होने पर यह कोड आवश्यक रूप से बाध्य नहीं होगा। मैंने इसे संवाद के 'खुले()' ईवेंट में डालकर हल किया, इसलिए यह'ui-widget-overly' बनने के बाद बाध्य करता है। पूरे दस्तावेज़ में 'क्लिक' ईवेंट असाइन करना थोड़ा अधिक हो सकता है। – dKen

3

सबसे अच्छा तरीका यह करने के लिए:

$('body').on("click", ".ui-widget-overlay", function() { 
     $("#dialog").dialog("close"); 
    }); 
+1

क्यों न केवल ईवेंट को '.ui-widget-overlay'' संलग्न करें? आप ऐसी घटना क्यों बना रहे हैं जो शरीर के लिए स्थायी रूप से उस चीज़ के लिए फंस जाएगी जो स्थायी रूप से वहां नहीं है? –

+0

क्योंकि यूई-विजेट-ओवरले गतिशील रूप से बनाया गया है हालांकि इसे शरीर पर संलग्न करना अच्छा विचार नहीं है –

1

पेज कुछ संवाद शामिल है, तो आप इस सार्वभौमिक विधि का उपयोग कर सकते हैं:

$(document).on('click', '.ui-widget-overlay', function() { 
    var $dialog = $(this).siblings('.ui-dialog:visible') 
    .find('.ui-dialog-content'); 
    if ($dialog.length && $dialog.dialog('isOpen')) { 
    $dialog.dialog('close'); 
    } 
}); 
+0

बस "भाई" को "अगली" के साथ बदलें और यह कई खुले संवादों के साथ भी काम करेगा .. –

+0

यह वही है जो मैं जरूरत है। मेरे पास कई अलग-अलग प्रकार के संवाद बॉक्स हैं, इसलिए प्रत्येक को कोड जोड़ना मूर्खतापूर्ण लग रहा था। यह शीर्ष जवाब होना चाहिए! बहुत ज्यादा पेस्ट-एंड-गो। धन्यवाद, रहस्यमय एक बिंदु अज्ञात उपयोगकर्ता! – JoLoCo