mirror of
https://github.com/jquery/jquery-ui.git
synced 2024-11-21 11:04:24 +00:00
Dialog: Remove the instance-storing for the overlay, just create one whenever it is needed. Heavily simplifies the code, while the memorly leak should be hardly an issue anymore, since fixed positioning restricts the overlay size to the window dimensions. Fixes #6058 - Dialog overlays are not properly reused when multiple instances of a Dialog exist.
This commit is contained in:
parent
b9068c1523
commit
1e8baf5683
@ -107,17 +107,6 @@ test("#6137: dialog('open') causes form elements to reset on IE7", function() {
|
||||
d1.remove();
|
||||
});
|
||||
|
||||
test("#6645: Missing element not found check in overlay", function(){
|
||||
expect(2);
|
||||
var d1 = $('<div title="dialog 1">Dialog 1</div>').dialog({modal: true}),
|
||||
d2 = $('<div title="dialog 2">Dialog 2</div>').dialog({modal: true, close: function(){ d2.remove(); }});
|
||||
|
||||
equal($.ui.dialog.overlay.instances.length, 2, 'two overlays created');
|
||||
d2.dialog('close');
|
||||
equal($.ui.dialog.overlay.instances.length, 1, 'one overlay remains after closing the 2nd overlay');
|
||||
d1.add(d2).remove();
|
||||
});
|
||||
|
||||
// TODO merge this with the main destroy test
|
||||
test("#4980: Destroy should place element back in original DOM position", function(){
|
||||
expect( 2 );
|
||||
|
27
ui/jquery.ui.dialog.js
vendored
27
ui/jquery.ui.dialog.js
vendored
@ -661,13 +661,13 @@ $.widget("ui.dialog", {
|
||||
if ( !this.options.modal ) {
|
||||
return;
|
||||
}
|
||||
if ( $.ui.dialog.overlay.instances.length === 0 ) {
|
||||
if ( $.ui.dialog.overlayInstances === 0 ) {
|
||||
// prevent use of anchors and inputs
|
||||
// we use a setTimeout in case the overlay is created from an
|
||||
// event that we're going to be cancelling (see #2804)
|
||||
setTimeout(function() {
|
||||
// handle $(el).dialog().dialog('close') (see #4065)
|
||||
if ( $.ui.dialog.overlay.instances.length ) {
|
||||
if ( $.ui.dialog.overlayInstances ) {
|
||||
$( document ).bind( "focusin.dialog-overlay", function( event ) {
|
||||
if ( !$( event.target ).closest( ".ui-dialog").length ) {
|
||||
event.preventDefault();
|
||||
@ -678,40 +678,27 @@ $.widget("ui.dialog", {
|
||||
}, 1 );
|
||||
}
|
||||
|
||||
// reuse old instances due to IE memory leak with alpha transparency (see #5185)
|
||||
var $el = this.overlay = ( $.ui.dialog.overlay.oldInstances.pop() || $( "<div>" ).addClass( "ui-widget-overlay ui-front" ) );
|
||||
|
||||
var $el = this.overlay = $( "<div>" ).addClass( "ui-widget-overlay ui-front" );
|
||||
$el.appendTo( this.document[ 0 ].body );
|
||||
|
||||
this._on( $el, {
|
||||
mousedown: "_keepFocus"
|
||||
});
|
||||
|
||||
$.ui.dialog.overlay.instances.push( $el );
|
||||
$.ui.dialog.overlayInstances += 1;
|
||||
},
|
||||
|
||||
_destroyOverlay: function() {
|
||||
if ( !this.options.modal ) {
|
||||
return;
|
||||
}
|
||||
var indexOf = $.inArray( this.overlay, $.ui.dialog.overlay.instances );
|
||||
|
||||
if ( indexOf !== -1 ) {
|
||||
$.ui.dialog.overlay.oldInstances.push( $.ui.dialog.overlay.instances.splice( indexOf, 1 )[ 0 ] );
|
||||
}
|
||||
|
||||
if ( $.ui.dialog.overlay.instances.length === 0 ) {
|
||||
$.ui.dialog.overlayInstances -= 1;
|
||||
if ( $.ui.dialog.overlayInstances === 0 ) {
|
||||
$( [ document, window ] ).unbind( ".dialog-overlay" );
|
||||
}
|
||||
|
||||
this.overlay.remove();
|
||||
}
|
||||
});
|
||||
|
||||
$.ui.dialog.overlay = {
|
||||
instances: [],
|
||||
oldInstances: []
|
||||
};
|
||||
$.ui.dialog.overlayInstances = 0;
|
||||
|
||||
// DEPRECATED
|
||||
if ( $.uiBackCompat !== false ) {
|
||||
|
Loading…
Reference in New Issue
Block a user