Skip to content

Commit 26d6952

Browse files
committed
Menu: Remove most event.stopImmediatePropagation() to allow proper event bubbling
1 parent d22edc8 commit 26d6952

File tree

1 file changed

+27
-34
lines changed

1 file changed

+27
-34
lines changed

ui/jquery.ui.menu.js

Lines changed: 27 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,8 @@
1313
*/
1414
(function($) {
1515

16-
var idIncrement = 0;
16+
var idIncrement = 0,
17+
currentEventTarget;
1718

1819
$.widget( "ui.menu", {
1920
version: "@VERSION",
@@ -66,16 +67,22 @@ $.widget( "ui.menu", {
6667
event.preventDefault();
6768
},
6869
"click .ui-menu-item:has(a)": function( event ) {
69-
event.stopImmediatePropagation();
70-
// Don't select disabled menu items
71-
if ( !$( event.target ).closest( ".ui-menu-item" ).is( ".ui-state-disabled" ) ) {
72-
this.select( event );
73-
// Redirect focus to the menu with a delay for firefox
74-
this._delay(function() {
75-
if ( !this.element.is(":focus") ) {
76-
this.element.focus();
77-
}
78-
}, 20 );
70+
var target = $( event.target );
71+
if ( target[0] != currentEventTarget ) {
72+
currentEventTarget = target[0];
73+
target.one( "click", function( event ) {
74+
currentEventTarget = "";
75+
});
76+
// Don't select disabled menu items
77+
if ( !target.closest( ".ui-menu-item" ).is( ".ui-state-disabled" ) ) {
78+
this.select( event );
79+
// Redirect focus to the menu with a delay for firefox
80+
this._delay(function() {
81+
if ( !this.element.is(":focus") ) {
82+
this.element.focus();
83+
}
84+
}, 20 );
85+
}
7986
}
8087
},
8188
"mouseover .ui-menu-item": function( event ) {
@@ -158,65 +165,49 @@ $.widget( "ui.menu", {
158165
case $.ui.keyCode.PAGE_UP:
159166
this.previousPage( event );
160167
event.preventDefault();
161-
event.stopImmediatePropagation();
162168
break;
163169
case $.ui.keyCode.PAGE_DOWN:
164170
this.nextPage( event );
165171
event.preventDefault();
166-
event.stopImmediatePropagation();
167172
break;
168173
case $.ui.keyCode.HOME:
169174
this._move( "first", "first", event );
170175
event.preventDefault();
171-
event.stopImmediatePropagation();
172176
break;
173177
case $.ui.keyCode.END:
174178
this._move( "last", "last", event );
175179
event.preventDefault();
176-
event.stopImmediatePropagation();
177180
break;
178181
case $.ui.keyCode.UP:
179182
this.previous( event );
180183
event.preventDefault();
181-
event.stopImmediatePropagation();
182184
break;
183185
case $.ui.keyCode.DOWN:
184186
this.next( event );
185187
event.preventDefault();
186-
event.stopImmediatePropagation();
187188
break;
188189
case $.ui.keyCode.LEFT:
189-
if (this.collapse( event )) {
190-
event.stopImmediatePropagation();
191-
}
190+
this.collapse( event );
192191
event.preventDefault();
193192
break;
194193
case $.ui.keyCode.RIGHT:
195-
if (this.expand( event )) {
196-
event.stopImmediatePropagation();
197-
}
194+
this.expand( event );
198195
event.preventDefault();
199196
break;
200197
case $.ui.keyCode.ENTER:
201198
if ( this.active.children( "a[aria-haspopup='true']" ).length ) {
202-
if ( this.expand( event ) ) {
203-
event.stopImmediatePropagation();
204-
}
199+
this.expand( event );
205200
}
206201
else {
207202
this.select( event );
208-
event.stopImmediatePropagation();
209203
}
210204
event.preventDefault();
211205
break;
212206
case $.ui.keyCode.ESCAPE:
213-
if ( this.collapse( event ) ) {
214-
event.stopImmediatePropagation();
215-
}
207+
this.collapse( event );
216208
event.preventDefault();
217209
break;
218210
default:
219-
event.stopPropagation();
220211
clearTimeout( this.filterTimer );
221212
var match,
222213
prev = this.previousFilter || "",
@@ -303,7 +294,7 @@ $.widget( "ui.menu", {
303294

304295
focus: function( event, item ) {
305296
var nested, borderTop, paddingTop, offset, scroll, elementHeight, itemHeight;
306-
this.blur( event );
297+
this.blur( event, event.type == "focus" );
307298

308299
if ( this._hasScroll() ) {
309300
borderTop = parseFloat( $.css( this.activeMenu[0], "borderTopWidth" ) ) || 0;
@@ -342,8 +333,10 @@ $.widget( "ui.menu", {
342333
this._trigger( "focus", event, { item: item } );
343334
},
344335

345-
blur: function( event ) {
346-
clearTimeout( this.timer );
336+
blur: function( event, fromFocus ) {
337+
if ( !fromFocus ) {
338+
clearTimeout( this.timer );
339+
}
347340

348341
if ( !this.active ) {
349342
return;

0 commit comments

Comments
 (0)