Its not perfect, but it works. Feel free to modify as you wish. I am sure this could be modified to handle the menubar component as well.
setMegaMenuTimeout("#menu-form\\:main-menu",2000); //Call to method with menu component id
function setMegaMenuTimeout(menuId,mSeconds) { var menuTimer = null; var parentMenuItems = $(menuId).find('.ui-menu-parent'); parentMenuItems.each(function() { var dropDown = $(this).children("ul").eq(0); dropDown.mouseout(function() { menuTimer = window.setTimeout(function() { closeMegaMenu(menuId); },mSeconds); }); dropDown.mouseover(function() { if(menuTimer !== null){window.clearTimeout(menuTimer);} }); }); $(document).on('mouseover',menuId,function(e){if(menuTimer !== null){window.clearTimeout(menuTimer);}}); } function closeMegaMenu(menuId) { var parentMenuItem = $(menuId).find(".ui-menu-parent.ui-menuitem-active"); parentMenuItem.each(function() { $(this).children("ul").eq(0).hide('slow'); $(this).removeClass("ui-menuitem-active"); $(this).children("a").eq(0).removeClass("ui-state-hover"); }); }