Skip to content

Commit dec8445

Browse files
committed
Autocomplete: When appendTo is a jQuery object or a DOM element, don't search against the document. Fixes #8858 - Autocomplete: Fails when appendTo is detached from the DOM.
1 parent e77edc6 commit dec8445

File tree

2 files changed

+24
-3
lines changed

2 files changed

+24
-3
lines changed

tests/unit/autocomplete/autocomplete_options.js

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,9 @@ module( "autocomplete: options" );
55
var data = [ "c++", "java", "php", "coldfusion", "javascript", "asp", "ruby", "python", "c", "scala", "groovy", "haskell", "perl" ];
66

77
test( "appendTo", function() {
8-
expect( 5 );
9-
var element = $( "#autocomplete" ).autocomplete();
8+
expect( 7 );
9+
var detached = $( "<div>" ),
10+
element = $( "#autocomplete" ).autocomplete();
1011
equal( element.autocomplete( "widget" ).parent()[0], document.body, "defaults to body" );
1112
element.autocomplete( "destroy" );
1213

@@ -26,6 +27,18 @@ test( "appendTo", function() {
2627
element.autocomplete().autocomplete( "option", "appendTo", "#ac-wrap1" );
2728
equal( element.autocomplete( "widget" ).parent()[0], $( "#ac-wrap1" )[0], "modified after init" );
2829
element.autocomplete( "destroy" );
30+
31+
element.autocomplete({
32+
appendTo: detached
33+
});
34+
equal( element.autocomplete( "widget" ).parent()[0], detached[0], "detached jQuery object" );
35+
element.autocomplete( "destroy" );
36+
37+
element.autocomplete({
38+
appendTo: detached[0]
39+
});
40+
equal( element.autocomplete( "widget" ).parent()[0], detached[0], "detached DOM element" );
41+
element.autocomplete( "destroy" );
2942
});
3043

3144
function autoFocusTest( afValue, focusedLength ) {

ui/jquery.ui.autocomplete.js

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -181,7 +181,7 @@ $.widget( "ui.autocomplete", {
181181
this._initSource();
182182
this.menu = $( "<ul>" )
183183
.addClass( "ui-autocomplete" )
184-
.appendTo( this.document.find( this.options.appendTo || "body" )[ 0 ] )
184+
.appendTo( this._appendTo() )
185185
.menu({
186186
// custom key handling for now
187187
input: $(),
@@ -320,6 +320,14 @@ $.widget( "ui.autocomplete", {
320320
}
321321
},
322322

323+
_appendTo: function() {
324+
var element = this.options.appendTo;
325+
if ( element && (element.jquery || element.nodeType) ) {
326+
return $( element );
327+
}
328+
return this.document.find( element || "body" ).eq( 0 );
329+
},
330+
323331
_isMultiLine: function() {
324332
// Textareas are always multi-line
325333
if ( this.element.is( "textarea" ) ) {

0 commit comments

Comments
 (0)