]> source.dussan.org Git - jquery-ui.git/commitdiff
Menu: Implement delaying of opening and closing submenus
authorjzaefferer <joern.zaefferer@gmail.com>
Thu, 17 Mar 2011 09:37:37 +0000 (10:37 +0100)
committerjzaefferer <joern.zaefferer@gmail.com>
Thu, 17 Mar 2011 09:37:37 +0000 (10:37 +0100)
ui/jquery.ui.menu.js

index 2addba37e3035ca0833d4da7cc9e412f7b9b8ad4..ad2fa3092894d7cf83decd359b2392a2b8a25739 100644 (file)
@@ -17,6 +17,7 @@ var idIncrement = 0;
 
 $.widget("ui.menu", {
        defaultElement: "<ul>",
+       delay: 150,
        options: {
                position: {
                        my: "left top",
@@ -219,11 +220,13 @@ $.widget("ui.menu", {
                // need to remove the attribute before adding it for the screenreader to pick up the change
                // see http://groups.google.com/group/jquery-a11y/msg/929e0c1e8c5efc8f
                this.element.removeAttr("aria-activedescendant").attr("aria-activedescendant", self.itemId)
-                               
-               self._close();
+               
+               self.timer = setTimeout(function() {
+                       self._close();
+               }, self.delay)
                var nested = $(">ul", item);
                if (nested.length && /^mouse/.test(event.type)) {
-                       self._open(nested);
+                       self._startOpening(nested);
                }
                this.activeMenu = item.parent();
                
@@ -235,6 +238,8 @@ $.widget("ui.menu", {
                        return;
                }
                
+               clearTimeout(this.timer);
+               
                this.active.children( "a" ).removeClass( "ui-state-focus" );
                // remove only generated id
                $( "#" + this.menuId + "-activedescendant" ).removeAttr( "id" );
@@ -243,9 +248,18 @@ $.widget("ui.menu", {
                this.active = null;
        },
 
+       _startOpening: function(submenu) {
+               clearTimeout(this.timer);
+               var self = this;
+               self.timer = setTimeout(function() {
+                       self._close();
+                       self._open(submenu);
+               }, self.delay);
+       },
+       
        _open: function(submenu) {
                this.element.find(".ui-menu").not(submenu.parents()).hide();
-               
+                       
                var position = $.extend({}, {
                        of: this.active
                }, $.type(this.options.position) == "function"