1$.fn.menu = function(options) { 2 var inputJq = $(this); 3 var inputJqId = inputJq.attr('id'); 4 var menu; 5 var menuId = inputJqId + '_menu'; 6 var exist = $('#' + menuId).size() > 0; 7 8 var settings = { 9 width : inputJq.outerWidth() - 2, 10 height : null, 11 maxHeight : null, 12 tree : null, 13 content : null, 14 init : null, 15 event : 'click', 16 menuId : menuId, 17 callback: null 18 }; 19 20 settings = $.extend(settings, options); 21 22 var heightStyle = settings.height ? 'height:' + settings.height + 'px' : ''; 23 24 var menu; 25 if (exist) { 26 menu = $('#' + settings.menuId); 27 menu.css({ 28 width : settings.width, 29 height : settings.height, 30 maxHeight : settings.maxHeight 31 }); 32 } else { 33 $('body').append('<div id="' + settings.menuId + '" class="menu" ' + 'style="width:' + settings.width + 'px;' + heightStyle + '"><div class="menu-content"></div></div>'); 34 menu = $('#' + settings.menuId); 35 } 36 var menuContent = menu.children('.menu-content'); 37 38 if (settings.tree) { 39 menuContent.append('<ul id="' + settings.tree + '" class="ztree"></ul>'); 40 } else if (settings.content) { 41 menuContent.html(settings.content); 42 } 43 44 if (settings.init) { 45 var treeJq = $('#' + settings.tree); 46 settings.init(menu, inputJq, treeJq); 47 } 48 // 49 // if (inputJq.is('[readonly]')) { 50 // return; 51 // } 52 53 if (!exist) { 54 $("body").bind("mousedown", onMouseDownBody); 55 inputJq.css('cursor', 'pointer').focus(function() { 56 $(this).blur(); 57 }); 58 59 inputJq.on(settings.event, toggleMenu); 60 61 $(window).resize(hideMenu); 62 } 63 64 function toggleMenu() { 65 if (menu.is(':hidden')) { 66 showMenu(); 67 } else { 68 hideMenu(); 69 } 70 } 71 72 /** 73 * æ¾ç¤ºèå 74 */ 75 function showMenu() { 76 if (settings.height && menu.outerHeight() > settings.height) { 77 menu.height(settings.height); 78 } else if (settings.maxHeight && menu.outerHeight() > settings.maxHeight) { 79 menu.height(settings.maxHeight); 80 } else { 81 menu.height('auto'); 82 } 83 84 var inputJqOffset = inputJq.offset(); 85 var documentScrollTop = $(document).scrollTop(); 86 87 var left = inputJqOffset.left; 88 menu.css('left', left + 'px'); 89 var top = inputJqOffset.top + inputJq.outerHeight() + 1; 90 var bottom = $(window).height() - inputJqOffset.top + 1; 91 92 var winHeight = $(window).height(); 93 var upHeight = documentScrollTop + inputJqOffset.top - 1; //è¾å ¥æ¡ä¸è¾¹è· 94 var downHeight = documentScrollTop + winHeight - top; //è¾å ¥æ¡ä¸è¾¹è· 95 var menuHeight = menu.outerHeight(); 96 97 if (menuHeight < downHeight) { //èåé«åº¦å°äºä¸è¾¹è·ï¼åä¸å±å¼ 98 menu.css('bottom', 'auto'); 99 menu.css('top', top + 'px'); 100 } else if (menuHeight < upHeight ) { //èåé«åº¦å°äºä¸è¾¹è·ï¼åä¸å±å¼ 101 menu.css('top', 'auto'); 102 menu.css('bottom', bottom + 'px'); 103 } else { //èåé«åº¦å¤§äºä¸ä¸è¾¹è· 104 if (downHeight > upHeight) { //ä¸è¾¹è·å¤§äºä¸è¾¹è·ï¼åä¸å±å¼ï¼æå¤§é«åº¦ä¸è¾¹è· 105 menu.outerHeight(downHeight - 5); 106 menu.css('bottom', 'auto'); 107 menu.css('top', top + 'px'); 108 } else { //ä¸è¾¹è·å¤§äºä¸è¾¹è·ï¼åä¸å±å¼ï¼æå¤§é«åº¦ä¸è¾¹è· 109 menu.outerHeight(upHeight - 5); 110 menu.css('top', 'auto'); 111 menu.css('bottom', bottom + 'px'); 112 } 113 } 114 115 if (menu.is(':hidden')) { 116 menu.slideDown(50, function() { 117 menu.children('.menu-content').css('overflow', 'auto'); 118 }); 119 } 120 121 if (settings.callback && settings.callback.show) { 122 settings.callback.show(menu, inputJq, treeJq); 123 } 124 } 125 126 /** 127 * éèèå 128 */ 129 function hideMenu() { 130 menu.children('.menu-content').css('overflow', ''); 131 menu.fadeOut(50); 132 133 if (settings.callback && settings.callback.hide) { 134 settings.callback.hide(menu, inputJq, treeJq); 135 } 136 } 137 138 /** 139 * å ¶ä»åºåç¹å»éèèå 140 */ 141 function onMouseDownBody(event) { 142 if (event.target.id != inputJqId && $(event.target).closest('#' + inputJqId).size() == 0 && event.target.id != settings.menuId && $(event.target).closest('#' + settings.menuId).length == 0) { 143 hideMenu(); 144 } 145 } 146};
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.