CSS+JavaScript创建右键菜单

其实在网页上实现右键菜单的风格化已经是一个老话题了,正常情况下,网页上的右键菜单是默认IE右键选项,包括了一些常用的功能。

  但有时候我们会遇到这样的问题,我们希望禁止访问者使用右键菜单或者希望屏蔽右键菜单的某些功能,比如,为了保护网页内容我们不希望访问者通过右键菜单来查看网页源代码,也不希望其通过右键来对网页内容进行选取、复制等,很多网页设计者在考虑这个问题的时候都是简单地对右键进行屏蔽,与其这样我们还不如用脚本来实现一个风格右键菜单,并在这个右键菜单中装上我们自己的内容。下面我们来尝试一下这个设想。

  我们首先要考虑的问题是通过鼠标右键单击事件来调用一个函数,这个函数用来显示新的右键菜单的内容。我们知道鼠标的右键单击事件是通过 document.oncontextmenu来调用的,如果我们自行定义document.oncontextmenu=某个函数,这样就可以实现新右键菜单的调用了,关键问题是如何通过这个函数来控制菜单的显示,同时,还要通过窗体的单击事件document.body.onclick(一般指左键单击)来隐藏菜单,这样一个过程就完成了鼠标右键菜单的弹出和隐藏。

<%@ page language="java" pageEncoding="GBK" %><?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

<!DOCTYPE HTML PUBLIC "-//w3c//dtd html 4.0 transitional//en">

<html>

<head>

<title>cssjavascript创建页面右键菜单</title>

<style type="text/css">

body {

font-family: "宋体";

font-size: 12px;

}

.skin0 {

padding-top: 4px;

text-align: left;

width: 100px;

border: 2px solid black;

background-color: menu;

font-family: "宋体";

line-height: 20px;

cursor: default;

visibility: hidden;

}

.skin1 {

padding-top: 4px;

cursor: default;

font: menutext;

text-align: left;

font-family: "宋体";

font-size: 10pt;

width: 100px;

background-color: menu;

border: 1 solid buttonface;

visibility: hidden;

border: 2 outset buttonhighlight;

}

</style>

<script language='javascript'>

function load1(){

if (document.all && window.print) {

document.oncontextmenu = showmenuie5;

document.onclick = hidemenuie5;

}

}

function showmenuie5() {

//获取当前鼠标右键按下后的位置,据此定义菜单显示的位置

var rightedge = document.body.clientWidth-event.clientX;

var bottomedge = document.body.clientHeight-event.clientY;

//如果从鼠标位置到窗口右边的空间小于菜单的宽度,就定位菜单的左坐标(Left)为当//前鼠标位置向左一个菜单宽度

if (rightedge <ie5menu.offsetWidth)

ie5menu.style.left = document.body.scrollLeft + event.clientX - ie5menu.offsetWidth;

else //否则,就定位菜单的左坐标为当前鼠标位置

ie5menu.style.left = document.body.scrollLeft + event.clientX;

//*如果从鼠标位置到窗口下边的空间小于菜单的高度,就定位菜单的上坐标(Top)为当前鼠标位置向上一个菜单高度

if (bottomedge <ie5menu.offsetHeight)

ie5menu.style.top = document.body.scrollTop + event.clientY - ie5menu.offsetHeight;

else

ie5menu.style.top = document.body.scrollTop + event.clientY;

//设置菜单可见

ie5menu.style.visibility = "visible";

return false;

}

function hidemenuie5() {

ie5menu.style.visibility = "hidden";

}

//jumptoie5()函数实现鼠标点击右键菜单中的层时发生的事情,也就是执行选项

function jumptoie5() {

if (event.srcElement.getAttribute("target") != null)

window.open(event.srcElement.url, event.srcElement.getAttribute("target"));

else

window.location = event.srcElement.url;

}

load1()

</script>

</head>

<body>

右键菜单创建测试,请点击右键测试一下效果吧!o(∩_∩)o...哈哈

<div id="ie5menu" class="skin0">

<div onclick="alert('后退请注意安全')">后退</div>

<div onclick="alert('祝你前程似锦,大胆往前走吧!')">前进</div>

<hr>

<div url="http://user.qzone.qq.com/648721840" target="_blank" onclick="jumptoie5()">偶偶的喜怒哀乐人生百味</div>

<div url="http://stta04.blog.163.com"

target="_blank" onclick="jumptoie5()">偶偶的BK</div>

<div url=http://stta0405.blog.163.com

target="_blank" onclick="jumptoie5()">偶偶的music</div>

<div url="http://blog.csdn.net/foamflower" target="_blank" onclick="jumptoie5()">偶偶的CSDN</div>

<hr>

<div url="http://suseyiyuan.ycool.com/<wbr>" </wbr>target="_blank" onclick="jumptoie5()">偶偶的偶像1</div>

<div url="http://qiu-7u.music.hexun.com/" target="_blank" onclick="jumptoie5()">偶偶的偶像2</div>

<hr>

<div url="http://blog.csdn.net/foamflower" target="_blank" onclick="jumptoie5()">关于本站</div>

<div url="mailto:[email protected]" onclick="jumptoie5()">联系我</div>

</div>  

</body>

</html>

代码解释:

1 在页面载入时,先执行load1()方法

首先检验是不是IE浏览器,如果当前浏览器是Internet Explorerdocument.all就返回真。则下面的定义就应该有效。也就是说当检查到客户端使用的浏览器是IE的时候那么当用户产生右键事件时就调用函数 showmenuie5,当用户产生左键事件时就调用函数hidemenuie5

2、接着我们要考虑如何通过函数showmenuie5和函数hidemenuie5来实现菜单的显示和隐藏。

当然,这里的菜单并不是真正意义的右键菜单,而是我们自己做的一个div,在这个div中装上我们想要装的东西。通过鼠标事件调用函数来控制它的显隐,这就达到了使用鼠标右键一样的效果了。

这一块的最外层是一个idie5menudiv,我们定义了它的样式为skin0,你也可以根据自定义其他样式,然后替换skin0

3、点击菜单选项后的操作

jumptoie5()函数实现鼠标点击右键菜单中的层时发生的事情,也就是执行选项