立即注册 找回密码

QQ登录

只需一步,快速开始

查看: 4899|回复: 0

[Discuz 通用教程] 分享一个discuz下拉菜单的完整js代码

[复制链接]

114

主题

10

回帖

1564

积分

超级版主

Rank: 8Rank: 8

积分
1564

最佳新人活跃会员热心会员推广达人宣传达人突出贡献优秀版主荣誉管理论坛元老

发表于 2017-11-21 01:54:46 | 显示全部楼层 |阅读模式
道勤网-数据www.daoqin.net

亲注册登录道勤网-可以查看更多帖子内容哦!(包涵精彩图片、文字详情等)请您及时注册登录-www.daoqin.net

您需要 登录 才可以下载或查看,没有账号?立即注册

x

无意中发现的discuz论坛中那个“发布新贴”等下拉菜单很有点特色,自动选择向上或向下显示菜单内容,对避免被其它控件遮住也有很好的处理方法(iframe)。

现把整个代码提出来,只需将整个代码复制下来保存为html文件即可,所有需要的js都在其中了。你可以运用在你的网站中,这绝对是一个成熟的方法。

代码:

  1. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">   
  2. <html xmlns="http://www.w3.org/1999/xhtml">   
  3. <head>   
  4.     <meta http-equiv="Content-Type" content="text/html; charset=gb2312" />   
  5.     <meta http-equiv="Content-Language" content="zh-CN" />   
  6.     <title>下拉菜单兼容版 </title>     
  7.     <script language="JavaScript">   
  8.     <!--   
  9. var userAgent = navigator.userAgent.toLowerCase();   
  10. var is_opera = userAgent.indexOf('opera') != -1 && opera.version();   
  11. var is_ie = (userAgent.indexOf('msie') != -1 && !is_opera) && userAgent.substr(userAgent.indexOf('msie') + 5, 3);   
  12. function $(id) {return document.getElementById(id);}   
  13. function isUndefined(variable) {return typeof variable == 'undefined' ? true : false;}   
  14.          
  15. function doane(event) {   
  16.     e = event ? event : window.event;   
  17.     if(is_ie) {   
  18.         e.returnValue = false;   
  19.         e.cancelBubble = true;   
  20.     } else if(e) {   
  21.         e.stopPropagation();   
  22.         e.preventDefault();   
  23.     }   
  24. }   
  25.          
  26. var jsmenu = new Array();   
  27. var ctrlobjclassName;   
  28. jsmenu['active'] = new Array();   
  29. jsmenu['timer'] = new Array();   
  30. jsmenu['iframe'] = new Array();   
  31.          
  32. function initCtrl(ctrlobj, click, duration, timeout, layer) {   
  33.     if(ctrlobj && !ctrlobj.initialized) {   
  34.         ctrlobj.initialized = true;   
  35.         ctrlobj.unselectable = true;   
  36.          
  37.         ctrlobj.outfunc = typeof ctrlobj.onmouseout == 'function' ? ctrlobj.onmouseout : null;   
  38.         ctrlobj.onmouseout = function() {   
  39.             if(this.outfunc) this.outfunc();   
  40.             if(duration < 3) jsmenu['timer'][ctrlobj.id] = setTimeout('hideMenu(' + layer + ')', timeout);   
  41.         }   
  42.          
  43.         ctrlobj.overfunc = typeof ctrlobj.onmouseover == 'function' ? ctrlobj.onmouseover : null;   
  44.         ctrlobj.onmouseover = function(e) {   
  45.             doane(e);   
  46.             if(this.overfunc) this.overfunc();   
  47.             if(click) {   
  48.                 clearTimeout(jsmenu['timer'][this.id]);   
  49.             } else {   
  50.                 for(var id in jsmenu['timer']) {   
  51.                     if(jsmenu['timer'][id]) clearTimeout(jsmenu['timer'][id]);   
  52.                 }   
  53.             }   
  54.         }   
  55.     }   
  56. }   
  57.          
  58. function initMenu(ctrlid, menuobj, duration, timeout, layer, drag) {   
  59.     if(menuobj && !menuobj.initialized) {   
  60.         menuobj.initialized = true;   
  61.         menuobj.ctrlkey = ctrlid;   
  62.         menuobj.onclick = ebygum;   
  63.         menuobj.style.position = 'absolute';   
  64.         if(duration < 3) {   
  65.             if(duration > 1) {   
  66.                 menuobj.onmouseover = function() {   
  67.                     clearTimeout(jsmenu['timer'][ctrlid]);   
  68.                 }   
  69.             }   
  70.             if(duration != 1) {   
  71.                 menuobj.onmouseout = function() {   
  72.                     jsmenu['timer'][ctrlid] = setTimeout('hideMenu(' + layer + ')', timeout);   
  73.                 }   
  74.             }   
  75.         }   
  76.         menuobj.style.zIndex = 50;   
  77.         if(is_ie) {   
  78.             menuobj.style.filter += "progid:DXImageTransform.Microsoft.shadow(direction=135,color=#CCCCCC,strength=2)";   
  79.         }   
  80.         if(drag) {   
  81.             menuobj.onmousedown = function(event) {try{menudrag(menuobj, event, 1);}catch(e){}};   
  82.             menuobj.onmousemove = function(event) {try{menudrag(menuobj, event, 2);}catch(e){}};   
  83.             menuobj.onmouseup = function(event) {try{menudrag(menuobj, event, 3);}catch(e){}};   
  84.         }   
  85.     }   
  86. }   
  87.          
  88. var menudragstart = new Array();   
  89. function menudrag(menuobj, e, op) {   
  90.     if(op == 1) {   
  91.         if(in_array(is_ie ? event.srcElement.tagName : e.target.tagName, ['TEXTAREA', 'INPUT', 'BUTTON', 'SELECT'])) {   
  92.             return;   
  93.         }   
  94.         menudragstart = is_ie ? [event.clientX, event.clientY] : [e.clientX, e.clientY];   
  95.         menudragstart[2] = parseInt(menuobj.style.left);   
  96.         menudragstart[3] = parseInt(menuobj.style.top);   
  97.         doane(e);   
  98.     } else if(op == 2 && menudragstart[0]) {   
  99.         var menudragnow = is_ie ? [event.clientX, event.clientY] : [e.clientX, e.clientY];   
  100.         menuobj.style.left = (menudragstart[2] + menudragnow[0] - menudragstart[0]) + 'px';   
  101.         menuobj.style.top = (menudragstart[3] + menudragnow[1] - menudragstart[1]) + 'px';   
  102.         doane(e);   
  103.     } else if(op == 3) {   
  104.         menudragstart = [];   
  105.         doane(e);   
  106.     }   
  107. }   
  108.          
  109. function showMenu(ctrlid, click, offset, duration, timeout, layer, showid, maxh, drag) {   
  110.     var ctrlobj = $(ctrlid);   
  111.     if(!ctrlobj) return;   
  112.     if(isUndefined(click)) click = false;   
  113.     if(isUndefined(offset)) offset = 0;   
  114.     if(isUndefined(duration)) duration = 2;   
  115.     if(isUndefined(timeout)) timeout = 500;   
  116.     if(isUndefined(layer)) layer = 0;   
  117.     if(isUndefined(showid)) showid = ctrlid;   
  118.     var showobj = $(showid);   
  119.     var menuobj = $(showid + '_menu');   
  120.     if(!showobj|| !menuobj) return;   
  121.     if(isUndefined(maxh)) maxh = 400;   
  122.     if(isUndefined(drag)) drag = false;   
  123.          
  124.     if(click && jsmenu['active'][layer] == menuobj) {   
  125.         hideMenu(layer);   
  126.         return;   
  127.     } else {   
  128.         hideMenu(layer);   
  129.     }   
  130.          
  131.     var len = jsmenu['timer'].length;   
  132.     if(len > 0) {   
  133.         for(var i=0; i<len; i++) {   
  134.             if(jsmenu['timer'][i]) clearTimeout(jsmenu['timer'][i]);   
  135.         }   
  136.     }   
  137.          
  138.     initCtrl(ctrlobj, click, duration, timeout, layer);   
  139.     ctrlobjclassName = ctrlobj.className;   
  140.     ctrlobj.className += ' hover';   
  141.     initMenu(ctrlid, menuobj, duration, timeout, layer, drag);   
  142.          
  143.     menuobj.style.display = '';   
  144.     if(!is_opera) {   
  145.         menuobj.style.clip = 'rect(auto, auto, auto, auto)';   
  146.     }   
  147.          
  148.     setMenuPosition(showid, offset);   
  149.          
  150.     if(is_ie && is_ie < 7) {   
  151.         if(!jsmenu['iframe'][layer]) {   
  152.             var iframe = document.createElement('iframe');   
  153.             iframe.style.display = 'none';   
  154.             iframe.style.position = 'absolute';   
  155.             iframe.style.filter = 'progid:DXImageTransform.Microsoft.Alpha(style=0,opacity=0)';   
  156.             $('append_parent') ? $('append_parent').appendChild(iframe) : menuobj.parentNode.appendChild(iframe);   
  157.             jsmenu['iframe'][layer] = iframe;   
  158.         }   
  159.         jsmenu['iframe'][layer].style.top = menuobj.style.top;   
  160.         jsmenu['iframe'][layer].style.left = menuobj.style.left;   
  161.         jsmenu['iframe'][layer].style.width = menuobj.w;   
  162.         jsmenu['iframe'][layer].style.height = menuobj.h;   
  163.         jsmenu['iframe'][layer].style.display = 'block';   
  164.     }   
  165.          
  166.     if(maxh && menuobj.scrollHeight > maxh) {   
  167.         menuobj.style.height = maxh + 'px';   
  168.         if(is_opera) {   
  169.             menuobj.style.overflow = 'auto';   
  170.         } else {   
  171.             menuobj.style.overflowY = 'auto';   
  172.         }   
  173.     }   
  174.          
  175.     if(!duration) {   
  176.         setTimeout('hideMenu(' + layer + ')', timeout);   
  177.     }   
  178.          
  179.     jsmenu['active'][layer] = menuobj;   
  180. }   
  181.          
  182. function setMenuPosition(showid, offset) {   
  183.     var showobj = $(showid);   
  184.     var menuobj = $(showid + '_menu');   
  185.     if(isUndefined(offset)) offset = 0;   
  186.     if(showobj) {   
  187.         showobj.pos = fetchOffset(showobj);   
  188.         showobj.X = showobj.pos['left'];   
  189.         showobj.Y = showobj.pos['top'];   
  190.         showobj.w = showobj.offsetWidth;   
  191.         showobj.h = showobj.offsetHeight;   
  192.         menuobj.w = menuobj.offsetWidth;   
  193.         menuobj.h = menuobj.offsetHeight;   
  194.         if(offset < 3) {   
  195.             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';   
  196.             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');   
  197.         } else if(offset == 3) {   
  198.             menuobj.style.left = (document.body.clientWidth - menuobj.clientWidth) / 2 + document.body.scrollLeft + 'px';   
  199.             menuobj.style.top = (document.body.clientHeight - menuobj.clientHeight) / 2 + document.body.scrollTop + 'px';   
  200.         }   
  201.         if(menuobj.style.clip && !is_opera) {   
  202.             menuobj.style.clip = 'rect(auto, auto, auto, auto)';   
  203.         }   
  204.     }   
  205. }   
  206.          
  207. function hideMenu(layer) {   
  208.     if(isUndefined(layer)) layer = 0;   
  209.     if(jsmenu['active'][layer]) {   
  210.         try {   
  211.             $(jsmenu['active'][layer].ctrlkey).className = ctrlobjclassName;   
  212.         } catch(e) {}   
  213.         clearTimeout(jsmenu['timer'][jsmenu['active'][layer].ctrlkey]);   
  214.         jsmenu['active'][layer].style.display = 'none';   
  215.         if(is_ie && is_ie < 7 && jsmenu['iframe'][layer]) {   
  216.             jsmenu['iframe'][layer].style.display = 'none';   
  217.         }   
  218.         jsmenu['active'][layer] = null;   
  219.     }   
  220. }   
  221.          
  222. function fetchOffset(obj) {   
  223.     var left_offset = obj.offsetLeft;   
  224.     var top_offset = obj.offsetTop;   
  225.     while((obj = obj.offsetParent) != null) {   
  226.         left_offset += obj.offsetLeft;   
  227.         top_offset += obj.offsetTop;   
  228.     }   
  229.     return { 'left' : left_offset, 'top' : top_offset };   
  230. }   
  231.          
  232. function ebygum(eventobj) {   
  233.     if(!eventobj || is_ie) {   
  234.         window.event.cancelBubble = true;   
  235.         return window.event;   
  236.     } else {   
  237.         if(eventobj.target.type == 'submit') {   
  238.             eventobj.target.form.submit();   
  239.         }   
  240.         eventobj.stopPropagation();   
  241.         return eventobj;   
  242.     }   
  243. }   
  244.          
  245. function menuoption_onclick_function(e) {   
  246.     this.clickfunc();   
  247.     hideMenu();   
  248. }   
  249.          
  250. function menuoption_onclick_link(e) {   
  251.     choose(e, this);   
  252. }   
  253.          
  254. function menuoption_onmouseover(e) {   
  255.     this.className = 'popupmenu_highlight';   
  256. }   
  257.          
  258. function menuoption_onmouseout(e) {   
  259.     this.className = 'popupmenu_option';   
  260. }   
  261.          
  262. function choose(e, obj) {   
  263.     var links = obj.getElementsByTagName('a');   
  264.     if(links[0]) {   
  265.         if(is_ie) {   
  266.             links[0].click();   
  267.             window.event.cancelBubble = true;   
  268.         } else {   
  269.             if(e.shiftKey) {   
  270.                 window.open(links[0].href);   
  271.                 e.stopPropagation();   
  272.                 e.preventDefault();   
  273.             } else {   
  274.                 window.location = links[0].href;   
  275.                 e.stopPropagation();   
  276.                 e.preventDefault();   
  277.             }   
  278.         }   
  279.         hideMenu();   
  280.     }   
  281. }   
  282.          
  283. </script>   
  284.          
  285.          
  286. <STYLE TYPE="text/css">   
  287. * { word-wrap: break-word;  }   
  288. body { background: #FFF; text-align: center;}   
  289. body, td, input, textarea, select, button { color: #000; font: 12px/1.6em Helvetica, Arial, sans-serif; }   
  290. body, ul { margin: 0; padding: 0; }   
  291. div {width:100%;height:800px;padding-top:400px;text-align: center;}   
  292. 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;}   
  293. a:hover{background: #396;color:#222;}   
  294.          
  295.         
  296. .dropmenu {cursor: pointer;background: #393;}   
  297. .popupmenu_popup { text-align: left; line-height: 1.4em; overflow: hidden; border: 1px solid #ccc; background: #FFF; }   
  298. .headermenu_popup { width: 120px; }   
  299. .headermenu_popup li { float: left; width: 114px;margin:0 3px; line-height: 24px; height: 24px; overflow: hidden;  }   
  300. .headermenu_popup li a:link,.headermenu_popup li a:visited{display: block;text-align: center;color:#666;width:100%;background: #fff;border:0;}   
  301. .headermenu_popup li a:hover {background: #eee;}   
  302. </STYLE>   
  303. </head>   
  304. <body>   
  305. <div>   
  306. <a href="http://www.jcodecraeer.com" id="post" class="dropmenu" onmouseover="showMenu(this.id)">发表</a>   
  307. <a href="http://www.jcodecraeer.com/a/jquery_js_ajaxjishu/2012/0531/219.html" id="my" class="dropmenu" onmouseover="showMenu(this.id)">我的</a>   
  308.          
  309. <br>   
  310. <br>   
  311. <select name="" style="clear:left;float:left;">   
  312.     <option value="" selected>这里是测试select会不会显示在上面   
  313.     <option value="">不会   
  314. </select>   
  315.          
  316.          
  317. <ul class="popupmenu_popup headermenu_popup" id="post_menu" style="display: none">   
  318.     <li><a href="#1">新话题</a></li>   
  319.     <li><a href="#2">新投票</a></li>   
  320.     <li><a href="#3">新文章</a></li>   
  321.     <li><a href="#4">新商品</a></li>   
  322.     <li><a href="#5">新活动</a></li>   
  323.         
  324. </ul>   
  325. <ul class="popupmenu_popup headermenu_popup" id="my_menu" style="display: none">   
  326.     <li><a href="#1">我的话题2</a></li>   
  327.     <li><a href="#2">我的收藏2</a></li>   
  328.     <li><a href="#3">我的订阅2</a></li>   
  329.     <li><a href="#4">我的权限2</a></li>   
  330.     <li><a href="#5">我的投票2</a></li>   
  331.     <li><a href="#6">我的商品2</a></li>   
  332.     <li><a href="#7">我的悬赏2</a></li>   
  333.     <li><a href="#8">我的活动2</a></li>   
  334.     <li><a href="#9">我的辩论2</a></li>   
  335.         
  336. </ul>   
  337.          
  338.          
  339.          
  340. </div>   
  341.          
  342. </body>   
  343. </html>
复制代码


道勤主机提供365天*24小时全年全天无休、实时在线、零等待的售后技术支持。竭力为您免费处理您在使用道勤主机过程中所遇到的一切问题! 如果您是道勤主机用户,那么您可以通过QQ【792472177】、售后QQ【59133755】、旺旺【诠释意念】、微信:q792472177免费电话、后台提交工单这些方式联系道勤主机客服! 如果您不是我们的客户也没问题,点击页面最右边的企业QQ在线咨询图标联系我们并购买后,我们为您免费进行无缝搬家服务,让您享受网站零访问延迟的迁移到道勤主机的服务!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

道勤网- 推荐内容!上一条 /2 下一条

!jz_fbzt! !jz_sgzt! !jz_xgzt! 快速回复 !jz_fhlb! !jz_lxwm! !jz_gfqqq!

关于我们|手机版|小黑屋|地图|【道勤网】-www.daoqin.net 软件视频自学教程|免费教程|自学电脑|3D教程|平面教程|影视动画教程|办公教程|机械设计教程|网站设计教程 ( 皖ICP备15000319号-1 )

GMT+8, 2024-12-24 03:37

Powered by DaoQin! X3.4 © 2016-2063 Dao Qin & 道勤科技

快速回复 返回顶部 返回列表