|
13 | 13 | */
|
14 | 14 | (function($) {
|
15 | 15 |
|
16 |
| -var idIncrement = 0; |
| 16 | +var idIncrement = 0, |
| 17 | + currentEventTarget; |
17 | 18 |
|
18 | 19 | $.widget( "ui.menu", {
|
19 | 20 | version: "@VERSION",
|
@@ -66,16 +67,22 @@ $.widget( "ui.menu", {
|
66 | 67 | event.preventDefault();
|
67 | 68 | },
|
68 | 69 | "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 | + } |
79 | 86 | }
|
80 | 87 | },
|
81 | 88 | "mouseover .ui-menu-item": function( event ) {
|
@@ -158,65 +165,49 @@ $.widget( "ui.menu", {
|
158 | 165 | case $.ui.keyCode.PAGE_UP:
|
159 | 166 | this.previousPage( event );
|
160 | 167 | event.preventDefault();
|
161 |
| - event.stopImmediatePropagation(); |
162 | 168 | break;
|
163 | 169 | case $.ui.keyCode.PAGE_DOWN:
|
164 | 170 | this.nextPage( event );
|
165 | 171 | event.preventDefault();
|
166 |
| - event.stopImmediatePropagation(); |
167 | 172 | break;
|
168 | 173 | case $.ui.keyCode.HOME:
|
169 | 174 | this._move( "first", "first", event );
|
170 | 175 | event.preventDefault();
|
171 |
| - event.stopImmediatePropagation(); |
172 | 176 | break;
|
173 | 177 | case $.ui.keyCode.END:
|
174 | 178 | this._move( "last", "last", event );
|
175 | 179 | event.preventDefault();
|
176 |
| - event.stopImmediatePropagation(); |
177 | 180 | break;
|
178 | 181 | case $.ui.keyCode.UP:
|
179 | 182 | this.previous( event );
|
180 | 183 | event.preventDefault();
|
181 |
| - event.stopImmediatePropagation(); |
182 | 184 | break;
|
183 | 185 | case $.ui.keyCode.DOWN:
|
184 | 186 | this.next( event );
|
185 | 187 | event.preventDefault();
|
186 |
| - event.stopImmediatePropagation(); |
187 | 188 | break;
|
188 | 189 | case $.ui.keyCode.LEFT:
|
189 |
| - if (this.collapse( event )) { |
190 |
| - event.stopImmediatePropagation(); |
191 |
| - } |
| 190 | + this.collapse( event ); |
192 | 191 | event.preventDefault();
|
193 | 192 | break;
|
194 | 193 | case $.ui.keyCode.RIGHT:
|
195 |
| - if (this.expand( event )) { |
196 |
| - event.stopImmediatePropagation(); |
197 |
| - } |
| 194 | + this.expand( event ); |
198 | 195 | event.preventDefault();
|
199 | 196 | break;
|
200 | 197 | case $.ui.keyCode.ENTER:
|
201 | 198 | if ( this.active.children( "a[aria-haspopup='true']" ).length ) {
|
202 |
| - if ( this.expand( event ) ) { |
203 |
| - event.stopImmediatePropagation(); |
204 |
| - } |
| 199 | + this.expand( event ); |
205 | 200 | }
|
206 | 201 | else {
|
207 | 202 | this.select( event );
|
208 |
| - event.stopImmediatePropagation(); |
209 | 203 | }
|
210 | 204 | event.preventDefault();
|
211 | 205 | break;
|
212 | 206 | case $.ui.keyCode.ESCAPE:
|
213 |
| - if ( this.collapse( event ) ) { |
214 |
| - event.stopImmediatePropagation(); |
215 |
| - } |
| 207 | + this.collapse( event ); |
216 | 208 | event.preventDefault();
|
217 | 209 | break;
|
218 | 210 | default:
|
219 |
| - event.stopPropagation(); |
220 | 211 | clearTimeout( this.filterTimer );
|
221 | 212 | var match,
|
222 | 213 | prev = this.previousFilter || "",
|
@@ -303,7 +294,7 @@ $.widget( "ui.menu", {
|
303 | 294 |
|
304 | 295 | focus: function( event, item ) {
|
305 | 296 | var nested, borderTop, paddingTop, offset, scroll, elementHeight, itemHeight;
|
306 |
| - this.blur( event ); |
| 297 | + this.blur( event, event.type == "focus" ); |
307 | 298 |
|
308 | 299 | if ( this._hasScroll() ) {
|
309 | 300 | borderTop = parseFloat( $.css( this.activeMenu[0], "borderTopWidth" ) ) || 0;
|
@@ -342,8 +333,10 @@ $.widget( "ui.menu", {
|
342 | 333 | this._trigger( "focus", event, { item: item } );
|
343 | 334 | },
|
344 | 335 |
|
345 |
| - blur: function( event ) { |
346 |
| - clearTimeout( this.timer ); |
| 336 | + blur: function( event, fromFocus ) { |
| 337 | + if ( !fromFocus ) { |
| 338 | + clearTimeout( this.timer ); |
| 339 | + } |
347 | 340 |
|
348 | 341 | if ( !this.active ) {
|
349 | 342 | return;
|
|
0 commit comments