大师兄 发表于 2017-11-21 01:54:46

分享一个discuz下拉菜单的完整js代码

无意中发现的discuz论坛中那个“发布新贴”等下拉菜单很有点特色,自动选择向上或向下显示菜单内容,对避免被其它控件遮住也有很好的处理方法(iframe)。
现把整个代码提出来,只需将整个代码复制下来保存为html文件即可,所有需要的js都在其中了。你可以运用在你的网站中,这绝对是一个成熟的方法。代码:<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">   
<html xmlns="http://www.w3.org/1999/xhtml">   
<head>   
    <meta http-equiv="Content-Type" content="text/html; charset=gb2312" />   
    <meta http-equiv="Content-Language" content="zh-CN" />   
    <title>下拉菜单兼容版 </title>   
    <script language="JavaScript">   
    <!--   
var userAgent = navigator.userAgent.toLowerCase();   
var is_opera = userAgent.indexOf('opera') != -1 && opera.version();   
var is_ie = (userAgent.indexOf('msie') != -1 && !is_opera) && userAgent.substr(userAgent.indexOf('msie') + 5, 3);   
function $(id) {return document.getElementById(id);}   
function isUndefined(variable) {return typeof variable == 'undefined' ? true : false;}   
         
function doane(event) {   
    e = event ? event : window.event;   
    if(is_ie) {   
      e.returnValue = false;   
      e.cancelBubble = true;   
    } else if(e) {   
      e.stopPropagation();   
      e.preventDefault();   
    }   
}   
         
var jsmenu = new Array();   
var ctrlobjclassName;   
jsmenu['active'] = new Array();   
jsmenu['timer'] = new Array();   
jsmenu['iframe'] = new Array();   
         
function initCtrl(ctrlobj, click, duration, timeout, layer) {   
    if(ctrlobj && !ctrlobj.initialized) {   
      ctrlobj.initialized = true;   
      ctrlobj.unselectable = true;   
         
      ctrlobj.outfunc = typeof ctrlobj.onmouseout == 'function' ? ctrlobj.onmouseout : null;   
      ctrlobj.onmouseout = function() {   
            if(this.outfunc) this.outfunc();   
            if(duration < 3) jsmenu['timer'] = setTimeout('hideMenu(' + layer + ')', timeout);   
      }   
         
      ctrlobj.overfunc = typeof ctrlobj.onmouseover == 'function' ? ctrlobj.onmouseover : null;   
      ctrlobj.onmouseover = function(e) {   
            doane(e);   
            if(this.overfunc) this.overfunc();   
            if(click) {   
                clearTimeout(jsmenu['timer']);   
            } else {   
                for(var id in jsmenu['timer']) {   
                  if(jsmenu['timer']) clearTimeout(jsmenu['timer']);   
                }   
            }   
      }   
    }   
}   
         
function initMenu(ctrlid, menuobj, duration, timeout, layer, drag) {   
    if(menuobj && !menuobj.initialized) {   
      menuobj.initialized = true;   
      menuobj.ctrlkey = ctrlid;   
      menuobj.onclick = ebygum;   
      menuobj.style.position = 'absolute';   
      if(duration < 3) {   
            if(duration > 1) {   
                menuobj.onmouseover = function() {   
                  clearTimeout(jsmenu['timer']);   
                }   
            }   
            if(duration != 1) {   
                menuobj.onmouseout = function() {   
                  jsmenu['timer'] = setTimeout('hideMenu(' + layer + ')', timeout);   
                }   
            }   
      }   
      menuobj.style.zIndex = 50;   
      if(is_ie) {   
            menuobj.style.filter += "progid:DXImageTransform.Microsoft.shadow(direction=135,color=#CCCCCC,strength=2)";   
      }   
      if(drag) {   
            menuobj.onmousedown = function(event) {try{menudrag(menuobj, event, 1);}catch(e){}};   
            menuobj.onmousemove = function(event) {try{menudrag(menuobj, event, 2);}catch(e){}};   
            menuobj.onmouseup = function(event) {try{menudrag(menuobj, event, 3);}catch(e){}};   
      }   
    }   
}   
         
var menudragstart = new Array();   
function menudrag(menuobj, e, op) {   
    if(op == 1) {   
      if(in_array(is_ie ? event.srcElement.tagName : e.target.tagName, ['TEXTAREA', 'INPUT', 'BUTTON', 'SELECT'])) {   
            return;   
      }   
      menudragstart = is_ie ? : ;   
      menudragstart = parseInt(menuobj.style.left);   
      menudragstart = parseInt(menuobj.style.top);   
      doane(e);   
    } else if(op == 2 && menudragstart) {   
      var menudragnow = is_ie ? : ;   
      menuobj.style.left = (menudragstart + menudragnow - menudragstart) + 'px';   
      menuobj.style.top = (menudragstart + menudragnow - menudragstart) + 'px';   
      doane(e);   
    } else if(op == 3) {   
      menudragstart = [];   
      doane(e);   
    }   
}   
         
function showMenu(ctrlid, click, offset, duration, timeout, layer, showid, maxh, drag) {   
    var ctrlobj = $(ctrlid);   
    if(!ctrlobj) return;   
    if(isUndefined(click)) click = false;   
    if(isUndefined(offset)) offset = 0;   
    if(isUndefined(duration)) duration = 2;   
    if(isUndefined(timeout)) timeout = 500;   
    if(isUndefined(layer)) layer = 0;   
    if(isUndefined(showid)) showid = ctrlid;   
    var showobj = $(showid);   
    var menuobj = $(showid + '_menu');   
    if(!showobj|| !menuobj) return;   
    if(isUndefined(maxh)) maxh = 400;   
    if(isUndefined(drag)) drag = false;   
         
    if(click && jsmenu['active'] == menuobj) {   
      hideMenu(layer);   
      return;   
    } else {   
      hideMenu(layer);   
    }   
         
    var len = jsmenu['timer'].length;   
    if(len > 0) {   
      for(var i=0; i<len; i++) {   
            if(jsmenu['timer']) clearTimeout(jsmenu['timer']);   
      }   
    }   
         
    initCtrl(ctrlobj, click, duration, timeout, layer);   
    ctrlobjclassName = ctrlobj.className;   
    ctrlobj.className += ' hover';   
    initMenu(ctrlid, menuobj, duration, timeout, layer, drag);   
         
    menuobj.style.display = '';   
    if(!is_opera) {   
      menuobj.style.clip = 'rect(auto, auto, auto, auto)';   
    }   
         
    setMenuPosition(showid, offset);   
         
    if(is_ie && is_ie < 7) {   
      if(!jsmenu['iframe']) {   
            var iframe = document.createElement('iframe');   
            iframe.style.display = 'none';   
            iframe.style.position = 'absolute';   
            iframe.style.filter = 'progid:DXImageTransform.Microsoft.Alpha(style=0,opacity=0)';   
            $('append_parent') ? $('append_parent').appendChild(iframe) : menuobj.parentNode.appendChild(iframe);   
            jsmenu['iframe'] = iframe;   
      }   
      jsmenu['iframe'].style.top = menuobj.style.top;   
      jsmenu['iframe'].style.left = menuobj.style.left;   
      jsmenu['iframe'].style.width = menuobj.w;   
      jsmenu['iframe'].style.height = menuobj.h;   
      jsmenu['iframe'].style.display = 'block';   
    }   
         
    if(maxh && menuobj.scrollHeight > maxh) {   
      menuobj.style.height = maxh + 'px';   
      if(is_opera) {   
            menuobj.style.overflow = 'auto';   
      } else {   
            menuobj.style.overflowY = 'auto';   
      }   
    }   
         
    if(!duration) {   
      setTimeout('hideMenu(' + layer + ')', timeout);   
    }   
         
    jsmenu['active'] = menuobj;   
}   
         
function setMenuPosition(showid, offset) {   
    var showobj = $(showid);   
    var menuobj = $(showid + '_menu');   
    if(isUndefined(offset)) offset = 0;   
    if(showobj) {   
      showobj.pos = fetchOffset(showobj);   
      showobj.X = showobj.pos['left'];   
      showobj.Y = showobj.pos['top'];   
      showobj.w = showobj.offsetWidth;   
      showobj.h = showobj.offsetHeight;   
      menuobj.w = menuobj.offsetWidth;   
      menuobj.h = menuobj.offsetHeight;   
      if(offset < 3) {   
            menuobj.style.left = (showobj.X + menuobj.w > document.body.clientWidth) && (showobj.X + showobj.w - menuobj.w >= 0) ? showobj.X + showobj.w - menuobj.w + 'px' : showobj.X + 'px';   
            menuobj.style.top = offset == 1 ? showobj.Y + 'px' : (offset == 2 || ((showobj.Y + showobj.h + menuobj.h > document.documentElement.scrollTop + document.documentElement.clientHeight) && (showobj.Y - menuobj.h >= 0)) ? (showobj.Y - menuobj.h) + 'px' : showobj.Y + showobj.h + 'px');   
      } else if(offset == 3) {   
            menuobj.style.left = (document.body.clientWidth - menuobj.clientWidth) / 2 + document.body.scrollLeft + 'px';   
            menuobj.style.top = (document.body.clientHeight - menuobj.clientHeight) / 2 + document.body.scrollTop + 'px';   
      }   
      if(menuobj.style.clip && !is_opera) {   
            menuobj.style.clip = 'rect(auto, auto, auto, auto)';   
      }   
    }   
}   
         
function hideMenu(layer) {   
    if(isUndefined(layer)) layer = 0;   
    if(jsmenu['active']) {   
      try {   
            $(jsmenu['active'].ctrlkey).className = ctrlobjclassName;   
      } catch(e) {}   
      clearTimeout(jsmenu['timer'].ctrlkey]);   
      jsmenu['active'].style.display = 'none';   
      if(is_ie && is_ie < 7 && jsmenu['iframe']) {   
            jsmenu['iframe'].style.display = 'none';   
      }   
      jsmenu['active'] = null;   
    }   
}   
         
function fetchOffset(obj) {   
    var left_offset = obj.offsetLeft;   
    var top_offset = obj.offsetTop;   
    while((obj = obj.offsetParent) != null) {   
      left_offset += obj.offsetLeft;   
      top_offset += obj.offsetTop;   
    }   
    return { 'left' : left_offset, 'top' : top_offset };   
}   
         
function ebygum(eventobj) {   
    if(!eventobj || is_ie) {   
      window.event.cancelBubble = true;   
      return window.event;   
    } else {   
      if(eventobj.target.type == 'submit') {   
            eventobj.target.form.submit();   
      }   
      eventobj.stopPropagation();   
      return eventobj;   
    }   
}   
         
function menuoption_onclick_function(e) {   
    this.clickfunc();   
    hideMenu();   
}   
         
function menuoption_onclick_link(e) {   
    choose(e, this);   
}   
         
function menuoption_onmouseover(e) {   
    this.className = 'popupmenu_highlight';   
}   
         
function menuoption_onmouseout(e) {   
    this.className = 'popupmenu_option';   
}   
         
function choose(e, obj) {   
    var links = obj.getElementsByTagName('a');   
    if(links) {   
      if(is_ie) {   
            links.click();   
            window.event.cancelBubble = true;   
      } else {   
            if(e.shiftKey) {   
                window.open(links.href);   
                e.stopPropagation();   
                e.preventDefault();   
            } else {   
                window.location = links.href;   
                e.stopPropagation();   
                e.preventDefault();   
            }   
      }   
      hideMenu();   
    }   
}   
         
</script>   
         
         
<STYLE TYPE="text/css">   
* { word-wrap: break-word;}   
body { background: #FFF; text-align: center;}   
body, td, input, textarea, select, button { color: #000; font: 12px/1.6em Helvetica, Arial, sans-serif; }   
body, ul { margin: 0; padding: 0; }   
div {width:100%;height:800px;padding-top:400px;text-align: center;}   
a:link,a:visited{float:left;display: block;color:#fff;height:28px;line-height:28px;width:120px;background:#990;border:solid#CCC;border-width:3px 0;overflow:hidden;}   
a:hover{background: #396;color:#222;}   
         
      
.dropmenu {cursor: pointer;background: #393;}   
.popupmenu_popup { text-align: left; line-height: 1.4em; overflow: hidden; border: 1px solid #ccc; background: #FFF; }   
.headermenu_popup { width: 120px; }   
.headermenu_popup li { float: left; width: 114px;margin:0 3px; line-height: 24px; height: 24px; overflow: hidden;}   
.headermenu_popup li a:link,.headermenu_popup li a:visited{display: block;text-align: center;color:#666;width:100%;background: #fff;border:0;}   
.headermenu_popup li a:hover {background: #eee;}   
</STYLE>   
</head>   
<body>   
<div>   
<a href="http://www.jcodecraeer.com" id="post" class="dropmenu" onmouseover="showMenu(this.id)">发表</a>   
<a href="http://www.jcodecraeer.com/a/jquery_js_ajaxjishu/2012/0531/219.html" id="my" class="dropmenu" onmouseover="showMenu(this.id)">我的</a>   
         
<br>   
<br>   
<select name="" style="clear:left;float:left;">   
    <option value="" selected>这里是测试select会不会显示在上面   
    <option value="">不会   
</select>   
         
         
<ul class="popupmenu_popup headermenu_popup" id="post_menu" style="display: none">   
    <li><a href="#1">新话题</a></li>   
    <li><a href="#2">新投票</a></li>   
    <li><a href="#3">新文章</a></li>   
    <li><a href="#4">新商品</a></li>   
    <li><a href="#5">新活动</a></li>   
      
</ul>   
<ul class="popupmenu_popup headermenu_popup" id="my_menu" style="display: none">   
    <li><a href="#1">我的话题2</a></li>   
    <li><a href="#2">我的收藏2</a></li>   
    <li><a href="#3">我的订阅2</a></li>   
    <li><a href="#4">我的权限2</a></li>   
    <li><a href="#5">我的投票2</a></li>   
    <li><a href="#6">我的商品2</a></li>   
    <li><a href="#7">我的悬赏2</a></li>   
    <li><a href="#8">我的活动2</a></li>   
    <li><a href="#9">我的辩论2</a></li>   
      
</ul>   
         
         
         
</div>   
         
</body>   
</html>

页: [1]
查看完整版本: 分享一个discuz下拉菜单的完整js代码