2010-01-19 18 views
5

मैं आईई 7 और कुछ jQuery संवाद के साथ काम कर रहा हूं और मैं प्रति डायलॉग के बारे में 6 मेगापिक्सल रिसाव में भाग रहा हूं। मुझे लगता है कि यह बंद होने के साथ है, लेकिन अब तक जो कुछ भी मैंने उन्हें हटाने के लिए किया है, उसकी मदद नहीं हुई है। इस बिंदु पर मुझे लगता है कि मैंने पास किए गए कॉलबैक फ़ंक्शन को छोड़कर सभी बंदियों का ख्याल रखा है, लेकिन संवाद बंद होने और हटाने के बाद भी यह 6 मेगापिक्सल लीक कर रहा है। प्रासंगिक स्रोत कोड है:jQuery-UI संवाद मेमोरी लीक

function DialogDestroyAndRemove(event) { 
    $(event.target).dialog("destroy").remove(); 
} 

function CallbackAndCloseDialog(event) { 
    if (event.data.callback != undefined) { 
     event.data.callback(event.data.callbackResponse); 
    } 
    $("#" + event.data.dialogId).unbind('dialogbeforeclose').dialog('close'); 
} 

// alert dialog modal with ok button 
function AlertDialog(dialogTitle, dialogText, callbackFunction) { 
    // dynamically generate and add a div so we can create the pop-up 
    $('body').append("<div id=\"alertDialog\" style=\"display:none;\" title=\"" + dialogTitle + "\">" + dialogText + "</div>"); 

    // define/configure the modal pop-up 
    $("#alertDialog").dialog({ 
     draggable: false, 
     resizable: false, 
     modal: true, 
     autoOpen: true, 
     open: function() { 
      $("#alertDialog").parents('.ui-dialog-buttonpane button:eq(0)') 
      .focus() //focus so the button is highlighted by default 
      .bind('click', { 
       callback: callbackFunction, 
       callbackResponse: 'OK', 
       dialogId: 'alertDialog' 
      }, CallbackAndCloseDialog); 
     }, 
     overlay: { backgroundColor: '#000', opacity: 0.5 }, 
     buttons: { 'OK': function() { } } 
    }).bind('dialogbeforeclose', function(event, ui) { 
     // Close (X) button was clicked; NOT the OK button 
     if (callbackFunction != undefined) { 
      callbackFunction('cancel'); 
     } 
     callbackFunction = null; 
    }).bind('dialogclose', DialogDestroyAndRemove); 
} 

एक बात मैं ऊपर किया है कि मुझे यकीन है कि अगर यह ठीक बटन के लिए कॉलबैक को परिभाषित जब यह निर्धारित किया है (और इसलिए एक बंद होने के बाद से यह संदर्भित है के बजाय था आवश्यक है नहीं कर रहा हूँ कॉलबैक) संवाद खोलने के बाद इसे एकबिंद का उपयोग करके परिभाषित करने के लिए। मैं उम्मीद कर रहा था कि क्लिक ईवेंट में डेटा के हिस्से के रूप में कॉलबैक पास करने में सक्षम होने से बंद होने में मदद मिल सकती है।

कोई भी विचार मैं इस रिसाव से छुटकारा पाने के लिए और क्या बदल सकता हूं?

उत्तर

5

यह वास्तव में समाप्त हुआ क्योंकि jQuery यूआई फ्रेमवर्क एक मोडल प्रदर्शित करते समय पृष्ठभूमि को भूरे रंग के साथ कैसे करता है। अगर मैं मोडल = सत्य को हटा देता हूं और ओवरले विशेषताएँ स्मृति रिसाव ~ 100k तक नीचे जाती है।

इस के आसपास जाने के लिए मुझे मोडल विकल्प के बिना संवाद करना पड़ा, और उसके बाद पृष्ठ को एक div (निश्चित स्थिति शीर्ष, बाएं, नीचे, दाएं सभी 0 को एक वैकल्पिक ग्रे पिक्सेल के साथ फिर पारदर्शी पिक्सेल पृष्ठभूमि के साथ जोड़ें) और संवाद के तहत एक ज़िन्डेक्स के साथ दिखा रहा है और छुपा रहा है।

हालांकि यह आदर्श नहीं है (डिफ़ॉल्ट मोडल ओवरले अच्छा और चिकना दिख रहा था) यह प्रति पॉप-अप डायलॉग जितनी मेमोरी लीक करने से बेहतर है।

+1

यह करना है कि आईई कैसे पीएनजी पारदर्शिता को नियंत्रित करता है, जो ... बहुत ही है। यदि आप किसी छवि के बजाय एक साधारण रंगीन आईई फ़िल्टर के साथ जाते हैं, तो आप मेमोरी हिट के बिना कुछ प्रभाव प्राप्त कर सकते हैं। आपके jQuery.UI.css में '.ui-widget-overlay' वर्ग को बदलें और 'url (' पृष्ठभूमि में आगे बढ़ें:' घोषणा से हरथा को हटा दें, इसके परिणामस्वरूप एक रंग का पारदर्शी ओवरले होगा। –

+0

के साथ होने वाला लगता है आईई सामान्य रूप से पारदर्शिता के साथ कैसे काम करता है। मैंने पृष्ठभूमि के यूआरएल पहलू को हटा दिया (केवल ठोस रंग छोड़कर) और यह अभी भी किया। यह तब तक नहीं था जब तक कि मैं अस्पष्टता फ़िल्टर को हटा नहीं देता। – Parrots

+0

वास्तव में मोडल को हटा रहा है: सत्य मेरे संवाद से आधा 8 मेमोरी उपयोग आधे में (150 एमबी से 70 तक)। – daschl

1

उम्मीद है कि यह मदद करता है, मैंने इस समस्या के लिए एक एक्सटेंशन बनाया है जहां मैं jQuery उपकरण (फ्लोप्लेयर) का उपयोग करता हूं जब jQuery UI संवाद के लिए modal = true होता है।

मैं folhttp: //jsfiddle.net/yZ56q/lowing कोड को एक अलग .js फ़ाइल में शामिल करना होगा और इस साइट से jQuery टूल को पहले प्लगइन का खुलासा करना सुनिश्चित कर दूंगा ... http://flowplayer.org/tools/download.html

(function($) { 
    var _init = $.ui.dialog.prototype._init; 
    $.ui.dialog.prototype._init = function() { 
     var self = this; 
     _init.apply(this, arguments); 

     // Remove the default modal behavior and exhibit the new one 
     if (self.options.modal) { 
      self.options.modal = false; 
      self.options.isModal = true; 
     } 

     this.uiDialog.bind('dialogopen', function(event, ui) { 
      if (self.options.isModal) { 
       if ($(this).expose == null) 
        window.alert("Dialog box depends on the expose plugin to be modal. Please include the jquery tools Javascript include."); 
       else { 
        $(this).expose({ opacity: 0.3 
          , color: '#CCCCCC' 
          , loadSpeed: 0 
          , closeSpeed: 0 
          , closeOnClick: false 
          , closeOnEsc: false 
          , api: true 
        }).load(); 
       } 
      } 
     }); 

     this.uiDialog.bind('dialogfocus', function(event, ui) { 
      if (self.options.isModal) { 
       $(this).css('z-index', '9999'); 
      } 
     }); 

     this.uiDialog.bind('dialogclose', function(event, ui) { 
      if (self.options.isModal) { 
       if ($(this).expose != null) { 
        $(this).expose({ api: true }).close(); 
       } 
      } 
     }); 
    }; 

     $.ui.dialog.defaults.isModal = false; 
})(jQuery); 
संबंधित मुद्दे