Skip to content

Commit c01b3ba

Browse files
committed
Autocomplete: Track input changes and fire change-event on blur, along with selected item, if available. Fix for #5490
1 parent 10ea61b commit c01b3ba

File tree

2 files changed

+30
-6
lines changed

2 files changed

+30
-6
lines changed

tests/unit/autocomplete/autocomplete_events.js

Lines changed: 21 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ module("autocomplete: events", {
1212
var data = ["c++", "java", "php", "coldfusion", "javascript", "asp", "ruby", "python", "c", "scala", "groovy", "haskell", "perl"];
1313

1414
test("all events", function() {
15-
expect(11);
15+
expect(12);
1616
var ac = $("#autocomplete").autocomplete({
1717
delay: 0,
1818
source: data,
@@ -34,21 +34,38 @@ test("all events", function() {
3434
same(event.type, "autocompleteselect");
3535
same(ui.item, {label:"java", value:"java"});
3636
},
37-
change: function(event) {
37+
change: function(event, ui) {
3838
same(event.type, "autocompletechange");
39+
same(ui.item, {label:"java", value:"java"});
3940
same( $(".ui-menu:visible").length, 0 );
41+
start();
4042
}
4143
});
4244
stop();
43-
ac.val("ja").keydown();
45+
ac.focus().val("ja").keydown();
4446
setTimeout(function() {
4547
same( $(".ui-menu:visible").length, 1 );
4648
ac.simulate("keydown", { keyCode: $.ui.keyCode.DOWN });
4749
ac.simulate("keydown", { keyCode: $.ui.keyCode.ENTER });
48-
start();
50+
ac.blur();
4951
}, 50);
5052
});
5153

54+
test("change without selection", function() {
55+
expect(2);
56+
stop();
57+
var ac = $("#autocomplete").autocomplete({
58+
delay: 0,
59+
source: data,
60+
change: function(event, ui) {
61+
same(event.type, "autocompletechange");
62+
same(ui.item, null);
63+
start();
64+
}
65+
});
66+
ac.focus().val("ja").blur();
67+
});
68+
5269
test("cancel search", function() {
5370
expect(6);
5471
var first = true;

ui/jquery.ui.autocomplete.js

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,7 @@ $.widget( "ui.autocomplete", {
8383
}
8484
})
8585
.bind( "focus.autocomplete", function() {
86+
self.selectedItem = null;
8687
self.previous = self.element.val();
8788
})
8889
.bind( "blur.autocomplete", function( event ) {
@@ -91,6 +92,7 @@ $.widget( "ui.autocomplete", {
9192
// TODO try to implement this without a timeout, see clearTimeout in search()
9293
self.closing = setTimeout(function() {
9394
self.close( event );
95+
self._change( event );
9496
}, 150 );
9597
});
9698
this._initSource();
@@ -116,11 +118,13 @@ $.widget( "ui.autocomplete", {
116118
self.element.val( item.value );
117119
}
118120
self.close( event );
119-
self.previous = self.element.val();
120121
// only trigger when focus was lost (click on menu)
122+
var previous = self.previous;
121123
if ( self.element[0] !== doc.activeElement ) {
122124
self.element.focus();
125+
self.previous = previous;
123126
}
127+
self.selectedItem = item;
124128
},
125129
blur: function( event, ui ) {
126130
if ( self.menu.element.is(":visible") ) {
@@ -219,8 +223,11 @@ $.widget( "ui.autocomplete", {
219223
this.menu.element.hide();
220224
this.menu.deactivate();
221225
}
226+
},
227+
228+
_change: function( event ) {
222229
if ( this.previous !== this.element.val() ) {
223-
this._trigger( "change", event );
230+
this._trigger( "change", event, { item: this.selectedItem } );
224231
}
225232
},
226233

0 commit comments

Comments
 (0)