js实现完全自定义可带多级目录的网页鼠标右键菜单方法


Posted in Javascript onFebruary 28, 2015

本文实例讲述了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=utf-8" />

<title>JS自定义网页多级导航菜单</title>

<style type="text/css">

html,body{height:100%;overflow:hidden;}

body,div,ul,li{margin:0;padding:0;}

body{font:12px/1.5 \5fae\8f6f\96c5\9ed1;}

ul{list-style-type:none;}

#rightMenu{position:absolute;top:-9999px;left:-9999px;}

#rightMenu ul{float:left;border:1px solid #979797;background:#f1f1f1 url(images/line.png) 24px 0 repeat-y;padding:2px;box-shadow:2px 2px 2px rgba(0,0,0,.6);}

#rightMenu ul li{float:left;clear:both;height:24px;cursor:pointer;line-height:24px;white-space:nowrap;padding:0 30px;}

#rightMenu ul li.sub{background-repeat:no-repeat;background-position:right 9px;background-image:url(images/arrow.png);}

#rightMenu ul li.active{background-color:#f1f3f6;border-radius:3px;border:1px solid #aecff7;height:22px;line-height:22px;background-position:right -8px;padding:0 29px;}

#rightMenu ul ul{display:none;position:absolute;}

</style>

<script type="text/javascript">

var getOffset = {

top: function (obj) {

return obj.offsetTop + (obj.offsetParent ? arguments.callee(obj.offsetParent) : 0)

},

left: function (obj) {

return obj.offsetLeft + (obj.offsetParent ? arguments.callee(obj.offsetParent) : 0)

}

};

window.onload = function ()

{

var oMenu = document.getElementById("rightMenu");

var aUl = oMenu.getElementsByTagName("ul");

var aLi = oMenu.getElementsByTagName("li");

var showTimer = hideTimer = null;

var i = 0;

var maxWidth = maxHeight = 0;

var aDoc = [document.documentElement.offsetWidth, document.documentElement.offsetHeight];

oMenu.style.display = "none";

for (i = 0; i < aLi.length; i++)

{

//为含有子菜单的li加上箭头

aLi[i].getElementsByTagName("ul")[0] && (aLi[i].className = "sub");

//鼠标移入

aLi[i].onmouseover = function ()

{

var oThis = this;

var oUl = oThis.getElementsByTagName("ul");

//鼠标移入样式

oThis.className += " active";

//显示子菜单

if (oUl[0])

{

clearTimeout(hideTimer);

showTimer = setTimeout(function ()

{

for (i = 0; i < oThis.parentNode.children.length; i++)

{

oThis.parentNode.children[i].getElementsByTagName("ul")[0] &&

(oThis.parentNode.children[i].getElementsByTagName("ul")[0].style.display = "none");

}

oUl[0].style.display = "block";

oUl[0].style.top = oThis.offsetTop + "px";

oUl[0].style.left = oThis.offsetWidth + "px";

setWidth(oUl[0]);

//最大显示范围

maxWidth = aDoc[0] - oUl[0].offsetWidth;

maxHeight = aDoc[1] - oUl[0].offsetHeight;

//防止溢出

maxWidth < getOffset.left(oUl[0]) && (oUl[0].style.left = -oUl[0].clientWidth + "px");

maxHeight < getOffset.top(oUl[0]) && (oUl[0].style.top = -oUl[0].clientHeight + oThis.offsetTop + oThis.clientHeight + "px")

},300);

}

};

//鼠标移出

aLi[i].onmouseout = function ()

{

var oThis = this;

var oUl = oThis.getElementsByTagName("ul");

//鼠标移出样式

oThis.className = oThis.className.replace(/\s?active/,"");

clearTimeout(showTimer);

hideTimer = setTimeout(function ()

{

for (i = 0; i < oThis.parentNode.children.length; i++)

{

oThis.parentNode.children[i].getElementsByTagName("ul")[0] &&

(oThis.parentNode.children[i].getElementsByTagName("ul")[0].style.display = "none");

}

},300);

};

}

//自定义右键菜单

document.oncontextmenu = function (event)

{

var event = event || window.event;

oMenu.style.display = "block";

oMenu.style.top = event.clientY + "px";

oMenu.style.left = event.clientX + "px";

setWidth(aUl[0]);

//最大显示范围

maxWidth = aDoc[0] - oMenu.offsetWidth;

maxHeight = aDoc[1] - oMenu.offsetHeight;

//防止菜单溢出

oMenu.offsetTop > maxHeight && (oMenu.style.top = maxHeight + "px");

oMenu.offsetLeft > maxWidth && (oMenu.style.left = maxWidth + "px");

return false;

};

//点击隐藏菜单

document.onclick = function ()

{

oMenu.style.display = "none"

};

//取li中最大的宽度, 并赋给同级所有li

function setWidth(obj)

{

maxWidth = 0;

for (i = 0; i < obj.children.length; i++)

{

var oLi = obj.children[i];

var iWidth = oLi.clientWidth - parseInt(oLi.currentStyle ? oLi.currentStyle["paddingLeft"] : getComputedStyle(oLi,null)["paddingLeft"]) * 2

if (iWidth > maxWidth) maxWidth = iWidth;

}

for (i = 0; i < obj.children.length; i++) obj.children[i].style.width = maxWidth + "px";

}

};

</script>

</head>

<body>

<center>自定义右键菜单,请在页面点击右键查看效果。</center>

<div id="rightMenu">

<ul>

<li><strong>JavaScript 学习</strong></li>

<li>

三水点靠木

<ul>

<li>网页特效原理分析</li>

<li>响应用户操作</li>

<li>提示框效果</li>

<li>事件驱动</li>

<li>元素属性操作</li>

</ul>

</li>

<li>

3water.com

<ul>

<li>改变网页背景颜色</li>

<li>函数传参</li>

<li>高重用性函数的编写</li>

<li>126邮箱全选效果</li>

<li>循环及遍历操作</li>

</ul>

</li>

<li>

第三课

<ul>

<li>

JavaScript组成

<ul>

<li>ECMAScript</li>

<li>DOM</li>

<li>BOM</li>

<li>JavaScript兼容性来源</li>

</ul>

</li>

<li>JavaScript出现的位置、优缺点</li>

<li>变量、类型、typeof、数据类型转换、变量作用域</li>

<li>

闭包

<ul>

<li>什么是闭包</li>

<li>简单应用</li>

<li>闭包缺点</li>

</ul>

</li>

<li>运算符</li>

<li>程序流程控制</li>

<li>

定时器的使用

<ul>

<li>setInterval</li>

<li>setTimeout</li>

</ul>

</li>

</ul>

</li>

</ul>

</div>

</body>

</html>

希望本文所述对大家的javascript程序设计有所帮助。

Javascript 相关文章推荐
jQuery select操作控制方法小结
May 26 Javascript
jquery统计复选框选中示例
Nov 05 Javascript
Jquery中的层次选择器与find()的区别示例介绍
Feb 20 Javascript
jQuery实现按钮只点击一次后就取消点击事件绑定的方法
Jun 26 Javascript
最丑的时钟效果!js canvas时钟制作方法
Aug 15 Javascript
JavaScript常用正则函数用法示例
Jan 23 Javascript
详解React Native网络请求fetch简单封装
Aug 10 Javascript
js单页hash路由原理与应用实战详解
Aug 14 Javascript
浅谈Vue数据响应思路之数组
Nov 06 Javascript
js实现图片上传即时显示效果
Sep 30 Javascript
微信小程序实现注册登录功能(表单校验、错误提示)
Dec 10 Javascript
关于antd tree 和父子组件之间的传值问题(react 总结)
Jun 02 Javascript
js实现同一页面可多次调用的图片幻灯切换效果
Feb 28 #Javascript
js获取当前日期前七天的方法
Feb 28 #Javascript
JQuery的ON()方法支持的所有事件罗列
Feb 28 #Javascript
使用命令对象代替switch语句的写法示例
Feb 28 #Javascript
Underscore.js常用方法总结
Feb 28 #Javascript
js实现文字跟随鼠标移动而移动的方法
Feb 28 #Javascript
jQuery实现tab标签自动切换的方法
Feb 28 #Javascript
You might like
基于php split()函数的用法详解
2013/06/05 PHP
zf框架的校验器InArray使用示例
2014/03/13 PHP
php过滤所有的空白字符(空格、全角空格、换行等)
2015/10/27 PHP
php递归函数怎么用才有效
2018/02/24 PHP
JavaScript Scoping and Hoisting 翻译
2012/07/03 Javascript
捕获和分析JavaScript Error的方法
2014/03/25 Javascript
浅谈JavaScript中的字符编码转换问题
2015/07/07 Javascript
JS随机打乱数组的方法小结
2016/06/22 Javascript
15位和18位身份证JS校验的简单实例
2016/07/18 Javascript
Extjs让combobox写起来简洁又漂亮
2017/01/05 Javascript
JS中showModalDialog关闭子窗口刷新主窗口用法详解
2017/03/25 Javascript
js实现数字递增特效【仿支付宝我的财富】
2017/05/05 Javascript
深入浅出webpack教程系列_安装与基本打包用法和命令参数详解
2017/09/10 Javascript
浅谈Vuejs中nextTick()异步更新队列源码解析
2017/12/31 Javascript
详解swipe使用及竖屏页面滚动方法
2018/06/28 Javascript
vue 中 elment-ui table合并上下两行相同数据单元格
2019/12/26 Javascript
Vue数字输入框组件使用方法详解
2020/02/10 Javascript
详解JavaScript 事件流
2020/09/02 Javascript
Python and、or以及and-or语法总结
2015/04/14 Python
Python设计模式中单例模式的实现及在Tornado中的应用
2016/03/02 Python
解决python web项目意外关闭,但占用端口的问题
2019/12/17 Python
Python常用库大全及简要说明
2020/01/17 Python
python GUI库图形界面开发之PyQt5图片显示控件QPixmap详细使用方法与实例
2020/02/27 Python
python对execl 处理操作代码
2020/06/22 Python
解决Python3.7.0 SSL低版本导致Pip无法使用问题
2020/09/03 Python
python爬虫scrapy框架的梨视频案例解析
2021/02/20 Python
SportsDirect.com马来西亚:英国第一体育零售商
2018/11/21 全球购物
科颜氏香港官方网店:Kiehl’s香港
2021/03/07 全球购物
GC是什么?为什么要有GC?
2013/12/08 面试题
土木工程毕业生自荐信
2013/09/21 职场文书
出纳岗位职责
2013/11/09 职场文书
2015年初中元旦晚会活动总结
2014/11/28 职场文书
办公室岗位职责
2015/02/04 职场文书
JS Object构造函数之Object.freeze
2021/04/28 Javascript
Springboot配置suffix指定mvc视图的后缀方法
2021/07/03 Java/Android
Java 通过手写分布式雪花SnowFlake生成ID方法详解
2022/04/07 Java/Android