Skip to content

Commit 6b3eead

Browse files
committed
Menu: Use event delegation for mouseover/out events, instead of binding to menu items directly
1 parent 0746f99 commit 6b3eead

File tree

1 file changed

+23
-20
lines changed

1 file changed

+23
-20
lines changed

ui/jquery.ui.menu.js

Lines changed: 23 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ $.widget("ui.menu", {
2323
"aria-activedescendant": "ui-active-menuitem"
2424
})
2525
.bind("click.menu", function( event ) {
26-
if (self.options.disabled) {
26+
if ( self.options.disabled ) {
2727
return false;
2828
}
2929
if ( !$( event.target ).closest( ".ui-menu-item a" ).length ) {
@@ -32,7 +32,25 @@ $.widget("ui.menu", {
3232
// temporary
3333
event.preventDefault();
3434
self.select( event );
35-
});
35+
})
36+
.bind("mouseover.menu", function( event ) {
37+
if ( self.options.disabled ) {
38+
return;
39+
}
40+
var target = $( event.target ).closest( ".ui-menu-item" );
41+
if ( target.length && target.parent()[0] === self.element[0] ) {
42+
self.activate( event, target );
43+
}
44+
})
45+
.bind("mouseout.menu", function( event ) {
46+
if ( self.options.disabled ) {
47+
return;
48+
}
49+
var target = $( event.target ).closest( ".ui-menu-item" );
50+
if ( target.length && target.parent()[0] === self.element[0] ) {
51+
self.deactivate( event );
52+
}
53+
});;
3654
this.refresh();
3755

3856
if (!this.options.input) {
@@ -91,29 +109,14 @@ $.widget("ui.menu", {
91109
},
92110

93111
refresh: function() {
94-
var self = this;
95-
96112
// don't refresh list items that are already adapted
97113
var items = this.element.children("li:not(.ui-menu-item):has(a)")
98114
.addClass("ui-menu-item")
99115
.attr("role", "menuitem");
100116

101117
items.children("a")
102118
.addClass("ui-corner-all")
103-
.attr("tabIndex", -1)
104-
// mouseenter doesn't work with event delegation
105-
.bind("mouseenter.menu", function( event ) {
106-
if (self.options.disabled) {
107-
return;
108-
}
109-
self.activate( event, $(this).parent() );
110-
})
111-
.bind("mouseleave.menu", function() {
112-
if (self.options.disabled) {
113-
return;
114-
}
115-
self.deactivate();
116-
});
119+
.attr("tabIndex", -1);
117120
},
118121

119122
activate: function( event, item ) {
@@ -136,13 +139,13 @@ $.widget("ui.menu", {
136139
this._trigger("focus", event, { item: item });
137140
},
138141

139-
deactivate: function() {
142+
deactivate: function(event) {
140143
if (!this.active) { return; }
141144

142145
this.active.children("a")
143146
.removeClass("ui-state-hover")
144147
.removeAttr("id");
145-
this._trigger("blur");
148+
this._trigger("blur", event);
146149
this.active = null;
147150
},
148151

0 commit comments

Comments
 (0)