pasckr 发表于 2016-5-9 15:29:45

dedecms导航条dropdown.js的改进




              可以设置一个一直都显示的二级菜单,修复了没有二级菜单时鼠标移上去仍然显示上一个二级菜单的问题.支持一级菜单鼠标离开事件
html代码

复制代码
代码如下:

<!DOCTYPE html PUBLIC &quot;-//W3C//DTD XHTML 1.0 Transitional//EN&quot; &quot;http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd&quot;>
<html xmlns=&quot;http://www.w3.org/1999/xhtml&quot;>
<head>
<meta http-equiv=&quot;Content-Type&quot; content=&quot;text/html; charset=gb2312&quot; />
<title>我的网站</title>
<meta name=&quot;description&quot; content=&quot;&quot; />
<meta name=&quot;keywords&quot; content=&quot;&quot; />
<link type=&quot;text/css&quot; rel=&quot;stylesheet&quot; href=&quot;http://www.188163.com/img/fnews/css/style.css&quot; />
</head>
<body>
<div class=&quot;w1000&quot;>
<div class=&quot;w960&quot;>
<!--f1-->
<!-- 菜单 -->
<div id=&quot;menu&quot; class=&quot;menus&quot;>
<ul>
<!-- class='navselect'根据此属性来判断需要默认显示的二级菜单,以便在织梦模板中通用 -->
<li class='navselect'><a href=&quot;/&quot; rel='dropmenu1'>主 页</a></li>
<li><a href='/a/jinrongzixun/'>金融资讯</a></li>
<li><a href='/a/gerenjinrong/' rel='dropmenu2'>个人金融</a></li>
<li><a href='/a/qiyejinrong/' rel='dropmenu4'>企业金融</a></li>
<li><a href='/a/caijingpindao/' rel='dropmenu5'>财经频道</a></li>
<li><a href='/a/zhifujiesuan/' rel='dropmenu6'>支付结算</a></li>
<li><a href='/a/yewushenqingtongdao/' rel='dropmenu7'>业务申请</a></li>
<li><a href='/a/zhongyaogonggao/' >重要公告</a></li>
<li><a href='/a/xinyongka/' >信用卡</a></li>
</ul>
</div>
<div class=&quot;menus_bottom&quot;>
</div>
<!-- //二级子类下拉菜单 -->
<script type=&quot;text/javascript&quot; src=&quot;dropdown.js&quot;></script>
<ul id=&quot;dropmenu1&quot; class=&quot;dropMenu&quot;>
<li><a href=&quot;/a/gerenjinrong/touzilicai/&quot;>首页列表</a>&nbsp;&nbsp;|&nbsp;&nbsp;</li>
</ul>
<ul id=&quot;dropmenu2&quot; class=&quot;dropMenu&quot;>
<li><a href=&quot;/a/gerenjinrong/touzilicai/&quot;>投资理财</a>&nbsp;&nbsp;|&nbsp;&nbsp;</li>
<li><a href=&quot;/a/gerenjinrong/grdk/&quot;>个人贷款</a>&nbsp;&nbsp;|&nbsp;&nbsp;</li>
<li><a href=&quot;/a/gerenjinrong/gerenxiaofei/&quot;>个人消费贷款</a>&nbsp;&nbsp;|&nbsp;&nbsp;</li>
<li><a href=&quot;/a/gerenjinrong/xinyong/&quot;>信用贷款</a>&nbsp;&nbsp;|&nbsp;&nbsp;</li>
<li><a href=&quot;/a/gerenjinrong/qichedaikuan/&quot;>汽车贷款</a>&nbsp;&nbsp;|&nbsp;&nbsp;</li>
<li><a href=&quot;/a/gerenjinrong/yishoulou/&quot;>一手楼按揭</a>&nbsp;&nbsp;|&nbsp;&nbsp;</li>
<li><a href=&quot;/a/gerenjinrong/ershoulou/&quot;>二手楼按揭</a>&nbsp;&nbsp;|&nbsp;&nbsp;</li>
<li><a href=&quot;/a/gerenjinrong/grjy/&quot;>个人经营贷款</a>&nbsp;&nbsp;|&nbsp;&nbsp;</li>
</ul>
<ul id=&quot;dropmenu4&quot; class=&quot;dropMenu&quot;>
<li><a href=&quot;/a/qiyejinrong/gongsirongzi/&quot;>公司融资</a>&nbsp;&nbsp;|&nbsp;&nbsp;</li>
<li><a href=&quot;/a/qiyejinrong/maoyirongzi/&quot;>贸易融资</a>&nbsp;&nbsp;|&nbsp;&nbsp;</li>
<li><a href=&quot;/a/qiyejinrong/gongsilicai/&quot;>公司理财</a>&nbsp;&nbsp;|&nbsp;&nbsp;</li>
<li><a href=&quot;/a/qiyejinrong/piaojuyewu/&quot;>票据业务</a>&nbsp;&nbsp;|&nbsp;&nbsp;</li>
<li><a href=&quot;/a/qiyejinrong/xiangmurongzi/&quot;>项目融资</a>&nbsp;&nbsp;|&nbsp;&nbsp;</li>
</ul>
<ul id=&quot;dropmenu5&quot; class=&quot;dropMenu&quot;>
<li><a href=&quot;/a/caijingpindao/huangjin/&quot;>黄金</a>&nbsp;&nbsp;|&nbsp;&nbsp;</li>
<li><a href=&quot;/a/caijingpindao/zhaiquan/&quot;>债券</a>&nbsp;&nbsp;|&nbsp;&nbsp;</li>
<li><a href=&quot;/a/caijingpindao/waihui/&quot;>外汇</a>&nbsp;&nbsp;|&nbsp;&nbsp;</li>
<li><a href=&quot;/a/caijingpindao/jijin/&quot;>基金</a>&nbsp;&nbsp;|&nbsp;&nbsp;</li>
</ul>
<ul id=&quot;dropmenu6&quot; class=&quot;dropMenu&quot;>
<li><a href=&quot;/a/zhifujiesuan/pos/&quot;>P0S支付</a>&nbsp;&nbsp;|&nbsp;&nbsp;</li>
</ul>
<ul id=&quot;dropmenu7&quot; class=&quot;dropMenu&quot;>
<li><a   href=&quot;/a/yewushenqingtongdao/gerenyewu/&quot;>个人业务咨询</a>&nbsp;& amp;nbsp;|&nbsp;&nbsp;</li>
<li><ahref=&quot;/a/yewushenqingtongdao/gongsiyewu/&quot;>公司业务咨询</a>&nbsp;& amp;nbsp;|&nbsp;&nbsp;</li>
</ul>
<ul id=&quot;dropmenu8&quot; class=&quot;dropMenu&quot;>
</ul>
<ul id=&quot;dropmenu3&quot; class=&quot;dropMenu&quot;>
</ul>
<script type=&quot;text/javascript&quot;> cssdropdown.startchrome(&quot;menu&quot;)</script>
</div>
</div>
<!--1000 end -->
</body>
</html>

dropdown.js
复制代码
代码如下:

var cssdropdown = {
disappeardelay: 250,
disablemenuclick: false,
enableswipe: 1,
enableiframeshim: 1,
dropmenuobj: null,
ie: document.all,
firefox: document.getElementById && !document.all,
swipetimer: undefined,
bottomclip: 0,
getposOffset: function(what, offsettype) {
var totaloffset = (offsettype == &quot;left&quot;) ? what.offsetLeft: what.offsetTop;
var parentEl = what.offsetParent;
while (parentEl != null) {
totaloffset = (offsettype == &quot;left&quot;) ? totaloffset + parentEl.offsetLeft: totaloffset + parentEl.offsetTop;
parentEl = parentEl.offsetParent;
}
return totaloffset;
},
swipeeffect: function() {
if (this.bottomclip < parseInt(this.dropmenuobj.offsetHeight)) {
this.bottomclip += 10 + (this.bottomclip / 10);
this.dropmenuobj.style.clip = &quot;rect(0 auto &quot; + this.bottomclip + &quot;px 0)&quot;;
} else return;
this.swipetimer = setTimeout(&quot;cssdropdown.swipeeffect()&quot;, 10);
},
//隐藏或者显示二级菜单
showhide: function(obj, e) {
if (this.ie || this.firefox) this.dropmenuobj.style.left = this.dropmenuobj.style.top = &quot;-500px&quot;;
if (e.type == &quot;click&quot; && obj.visibility == hidden || e.type == &quot;mouseover&quot;) {
if (this.enableswipe == 1) {
if (typeof this.swipetimer != &quot;undefined&quot;) clearTimeout(this.swipetimer);
obj.clip = &quot;rect(0 auto 0 0)&quot;;
this.bottomclip = 0;
this.swipeeffect();
}
obj.visibility = &quot;visible&quot;;
} else if (e.type == &quot;click&quot;) obj.visibility = &quot;hidden&quot;;
},
iecompattest: function() {
return (document.compatMode && document.compatMode != &quot;BackCompat&quot;) ? document.documentElement: document.body;
},
clearbrowseredge: function(obj, whichedge) {
var edgeoffset = 0;
if (whichedge == &quot;rightedge&quot;) {
varwindowedge = this.ie && !window.opera ?this.iecompattest().scrollLeft + this.iecompattest().clientWidth - 15 :window.pageXOffset + window.innerWidth - 15;
this.dropmenuobj.contentmeasure = this.dropmenuobj.offsetWidth;
if(windowedge - this.dropmenuobj.x < this.dropmenuobj.contentmeasure)edgeoffset = this.dropmenuobj.contentmeasure - obj.offsetWidth;
} else {
var topedge = this.ie && !window.opera ? this.iecompattest().scrollTop: window.pageYOffset;
varwindowedge = this.ie && !window.opera ?this.iecompattest().scrollTop + this.iecompattest().clientHeight - 15 :window.pageYOffset + window.innerHeight - 18;
this.dropmenuobj.contentmeasure = this.dropmenuobj.offsetHeight;
if (windowedge - this.dropmenuobj.y < this.dropmenuobj.contentmeasure) {
edgeoffset = this.dropmenuobj.contentmeasure + obj.offsetHeight;
if((this.dropmenuobj.y - topedge) < this.dropmenuobj.contentmeasure)edgeoffset = this.dropmenuobj.y + obj.offsetHeight - topedge;
}
}
return edgeoffset;
},
//鼠标移动到一级菜单上执行
dropit: function(obj, e, dropmenuID) {
//隐藏上次显示的二级菜单
if (this.dropmenuobj != null) this.dropmenuobj.style.visibility = &quot;hidden&quot;;
this.clearhidemenu();
if (this.ie || this.firefox) {
var me = this;
//一级菜单鼠标离开事件
obj.onmouseout = function() {
cssdropdown.delayhidemenu();
};
//一级菜单鼠标点击事件
obj.onclick = function() {
return ! cssdropdown.disablemenuclick
};
if (!dropmenuID) {
return;
}
this.dropmenuobj = document.getElementById(dropmenuID);
if (!this.dropmenuobj) return;
//为二级菜单绑定鼠标移动到事件
this.dropmenuobj.onmouseover = function() {
//移除从一级菜单离开时触发的方法,防止误执行
cssdropdown.clearhidemenu();
}
//为二级菜单绑定鼠标离开事件
this.dropmenuobj.onmouseout = function(e) {
cssdropdown.dynamichide(e);
}
//为二级菜单绑定鼠标点击事件
this.dropmenuobj.onclick = function() {
cssdropdown.delayhidemenu();
}
this.showhide(this.dropmenuobj.style, e);
//调整二级菜单位置,以免位置错乱
this.dropmenuobj.x = this.getposOffset(obj, &quot;left&quot;);
this.dropmenuobj.y = this.getposOffset(obj, &quot;top&quot;);
this.dropmenuobj.style.left = this.dropmenuobj.x - this.clearbrowseredge(obj, &quot;rightedge&quot;) + &quot;px&quot;;
this.dropmenuobj.style.top = this.dropmenuobj.y - this.clearbrowseredge(obj, &quot;bottomedge&quot;) + obj.offsetHeight + 1 + &quot;px&quot;;
this.positionshim();
}
},
positionshim: function() {
if (this.enableiframeshim && typeof this.shimobject != &quot;undefined&quot;) {
if (this.dropmenuobj.style.visibility == &quot;visible&quot;) {
this.shimobject.style.width = this.dropmenuobj.offsetWidth + &quot;px&quot;;
this.shimobject.style.height = this.dropmenuobj.offsetHeight + &quot;px&quot;;
this.shimobject.style.left = this.dropmenuobj.style.left;
this.shimobject.style.top = this.dropmenuobj.style.top;
}
this.shimobject.style.display = (this.dropmenuobj.style.visibility == &quot;visible&quot;) ? &quot;block&quot;: &quot;none&quot;;
}
},
hideshim: function() {
if (this.enableiframeshim && typeof this.shimobject != &quot;undefined&quot;) this.shimobject.style.display = 'none';
},
contains_firefox: function(a, b) {
while (b.parentNode) if ((b = b.parentNode) == a) return true;
return false;
},
//隐藏二级菜单,兼容性处理
dynamichide: function(e) {
var evtobj = window.event ? window.event: e;
//确认是鼠标离开事件,避免误触发
if (this.ie && !this.dropmenuobj.contains(evtobj.toElement)) this.delayhidemenu();
elseif (this.firefox && e.currentTarget != evtobj.relatedTarget&& !this.contains_firefox(evtobj.currentTarget,evtobj.relatedTarget)) this.delayhidemenu();
},
//鼠标点击菜单,或者离开菜单时执行
delayhidemenu: function() {
this.delayhide = setTimeout(function() {
cssdropdown.dropmenuobj.style.visibility = 'hidden';
cssdropdown.hideshim();
cssdropdown.showAlways();
},
this.disappeardelay);
},
//移除定时方法
clearhidemenu: function() {
if (this.delayhide != &quot;undefined&quot;) clearTimeout(this.delayhide);
},
//显示默认被选中的一级菜单
showAlways: function() {
if (this.always) {
this.always.onmouseover({
type: &quot;mouseover&quot;
});
}
},
//初始化
startchrome: function() {
for (var ids = 0; ids < arguments.length; ids++) {
var menuitems = document.getElementById(arguments).getElementsByTagName(&quot;a&quot;);
for (var i = 0; i < menuitems.length; i++) {
var relvalue = menuitems.getAttribute(&quot;rel&quot;);
//绑定鼠标移动到事件
menuitems.onmouseover = function(e) {
var event = typeof e != &quot;undefined&quot; ? e: window.event;
cssdropdown.dropit(this, event, this.getAttribute(&quot;rel&quot;));
};
//显示默认被选中的一级菜单
if (!this.always && menuitems.parentNode.getAttribute(&quot;class&quot;) == &quot;navselect&quot;) {
this.always = menuitems;
this.showAlways();
}
}
}
if (window.createPopup && !window.XmlHttpRequest) {
document.write('<IFRAMEid=&quot;iframeshim&quot; src=&quot;&quot; style=&quot;display: none; left: 0; top: 0; z-index:90; position: absolute; filter:progid:DXImageTransform.Microsoft.Alpha(style=0,opacity=0)&quot;frameBorder=&quot;0&quot; scrolling=&quot;no&quot;></IFRAME>');
this.shimobject = document.getElementById(&quot;iframeshim&quot;);
}
}
}

演示地址:http://www.188163.com(我不知道啥时候失效...)
页: [1]
查看完整版本: dedecms导航条dropdown.js的改进