1 /** 2 * @fileOverview ComboBox menu constroller. 3 * @author yiminghe@gmail.com 4 */ 5 KISSY.add("combobox/menu", function (S, Event, Menu, ComboBoxMenuRender) { 6 7 var ComboBoxMenu, 8 9 window = S.Env.host; 10 11 /** 12 * @name Menu 13 * @memberOf ComboBox 14 * @extends Menu.PopupMenu 15 * @class 16 * DropDown menu for comboBox input. 17 * xclass: 'combobox-menu'. 18 */ 19 ComboBoxMenu = Menu.PopupMenu.extend( 20 /** 21 * @lends ComboBox.Menu# 22 */ 23 { 24 /** 25 * Bind event once after menu initialize and before menu shows. 26 * Bind only one time! 27 * @protected 28 */ 29 bindUI:function () { 30 var self = this; 31 32 self.on("click", function (e) { 33 var item = e.target; 34 var combobox = self.get("parent"); 35 // stop valuechange event 36 combobox._stopNotify = 1; 37 combobox._selectItem(item); 38 combobox.set("collapsed", true); 39 setTimeout( 40 function () { 41 combobox._stopNotify = 0; 42 }, 43 // valuechange interval 44 50 45 ); 46 }); 47 48 Event.on(window, "resize", reAlign, self); 49 50 var el = self.get("el"); 51 var contentEl = self.get("contentEl"); 52 53 el.on("focusin", clearDismissTimer, self); 54 55 el.on("focusout", delayHide, self); 56 57 contentEl.on("mouseover", function () { 58 var combobox = self.get("parent"); 59 // trigger el focus 60 combobox.get("input")[0].focus(); 61 // prevent menu from hiding 62 clearDismissTimer.call(self); 63 }); 64 }, 65 66 _clearDismissTimer:clearDismissTimer, 67 68 _delayHide:delayHide, 69 70 destructor:function () { 71 var self = this; 72 Event.remove(window, "resize", reAlign, self); 73 } 74 }, { 75 ATTRS:{ 76 head:{ 77 view:1 78 }, 79 foot:{ 80 view:1 81 }, 82 xrender:{ 83 value:ComboBoxMenuRender 84 } 85 } 86 }, { 87 xclass:'combobox-menu', 88 priority:40 89 }); 90 91 92 // # ---------------------- private start 93 94 function clearDismissTimer() { 95 var self = this; 96 if (self._dismissTimer) { 97 clearTimeout(self._dismissTimer); 98 self._dismissTimer = null; 99 } 100 } 101 102 function delayHide() { 103 var self = this; 104 self._dismissTimer = setTimeout(function () { 105 self.get("parent").set("collapsed", true); 106 }, 30); 107 } 108 109 var reAlign = S.buffer(function () { 110 var self = this; 111 if (self.get("visible")) { 112 self.get("parent")._onWindowResize(); 113 } 114 }, 50); 115 116 // # ---------------------- private end 117 118 return ComboBoxMenu; 119 }, { 120 requires:['event', 'menu', './menuRender'] 121 }); 122 /** 123 * 2012-03-26 yiminghe@gmail.com 124 * - refer http://www.w3.org/TR/wai-aria-practices/#combobox 125 **/