Skip to content

Commit 70b16ef

Browse files
committed
Dialog: Added appendTo option. Fixes #7948 - Dialog: Allow dialog to be attached to a element other than body.
1 parent da17a23 commit 70b16ef

File tree

4 files changed

+58
-1
lines changed

4 files changed

+58
-1
lines changed

tests/unit/dialog/dialog.html

+2
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,8 @@ <h2 id="qunit-userAgent"></h2>
6161
<label for="favorite-food">Favorite food</label><input id="favorite-food">
6262
</div>
6363
</div>
64+
<div class="wrap" id="wrap1"></div>
65+
<div class="wrap" id="wrap2"></div>
6466
</div>
6567
</body>
6668
</html>

tests/unit/dialog/dialog_common.js

+1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
TestHelpers.commonWidgetTests( "dialog", {
22
defaults: {
3+
appendTo: "body",
34
autoOpen: true,
45
buttons: {},
56
closeOnEscape: true,

tests/unit/dialog/dialog_options.js

+41
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,47 @@
55

66
module("dialog: options");
77

8+
test( "appendTo", function() {
9+
expect( 8 );
10+
var detached = $( "<div>" ),
11+
element = $( "#dialog1" ).dialog();
12+
equal( element.dialog( "widget" ).parent()[0], document.body, "defaults to body" );
13+
element.dialog( "destroy" );
14+
15+
element.dialog({
16+
appendTo: ".wrap"
17+
});
18+
equal( element.dialog( "widget" ).parent()[0], $( "#wrap1" )[0], "first found element" );
19+
equal( $( "#wrap2 .ui-dialog" ).length, 0, "only appends to one element" );
20+
element.dialog( "destroy" );
21+
22+
element.dialog({
23+
appendTo: null
24+
});
25+
equal( element.dialog( "widget" ).parent()[0], document.body, "null" );
26+
element.dialog( "destroy" );
27+
28+
element.dialog({ autoOpen: false }).dialog( "option", "appendTo", "#wrap1" ).dialog( "open" );
29+
equal( element.dialog( "widget" ).parent()[0], $( "#wrap1" )[0], "modified after init" );
30+
element.dialog( "destroy" );
31+
32+
element.dialog({
33+
appendTo: detached
34+
});
35+
equal( element.dialog( "widget" ).parent()[0], detached[0], "detached jQuery object" );
36+
element.dialog( "destroy" );
37+
38+
element.dialog({
39+
appendTo: detached[0]
40+
});
41+
equal( element.dialog( "widget" ).parent()[0], detached[0], "detached DOM element" );
42+
element.dialog( "destroy" );
43+
44+
element.dialog({ autoOpen: false }).dialog( "option", "appendTo", detached );
45+
equal( element.dialog( "widget" ).parent()[0], detached[0], "detached DOM element via option()" );
46+
element.dialog( "destroy" );
47+
});
48+
849
test("autoOpen", function() {
950
expect(2);
1051

ui/jquery.ui.dialog.js

+14-1
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ var uiDialogClasses = "ui-dialog ui-widget ui-widget-content ui-corner-all ui-fr
3939
$.widget("ui.dialog", {
4040
version: "@VERSION",
4141
options: {
42+
appendTo: "body",
4243
autoOpen: true,
4344
buttons: {},
4445
closeOnEscape: true,
@@ -124,6 +125,14 @@ $.widget("ui.dialog", {
124125
}
125126
},
126127

128+
_appendTo: function() {
129+
var element = this.options.appendTo;
130+
if ( element && (element.jquery || element.nodeType) ) {
131+
return $( element );
132+
}
133+
return this.document.find( element || "body" ).eq( 0 );
134+
},
135+
127136
_destroy: function() {
128137
var next,
129138
oldPosition = this.oldPosition;
@@ -276,7 +285,7 @@ $.widget("ui.dialog", {
276285
tabIndex: -1,
277286
role: "dialog"
278287
})
279-
.appendTo( this.document[ 0 ].body );
288+
.appendTo( this._appendTo() );
280289

281290
this._on( this.uiDialog, {
282291
keydown: function( event ) {
@@ -569,6 +578,10 @@ $.widget("ui.dialog", {
569578

570579
this._super( key, value );
571580

581+
if ( key === "appendTo" ) {
582+
this.uiDialog.appendTo( this._appendTo() );
583+
}
584+
572585
if ( key === "buttons" ) {
573586
this._createButtons();
574587
}

0 commit comments

Comments
 (0)