右鍵菜單的JS類
Source:
http://www.limboy.com/2006/10/22/contentmenu/
右鍵菜單在web交互設(shè)計里并不是很常用的東西,因為普通用戶在瀏覽網(wǎng)頁時很少會想到能用右鍵來操作,就像他們很難習慣拖拽一樣,但在某些環(huán)境中,拖拽會成為很自然的操作——其實都跟桌面軟件的操作習慣有關(guān)。所以右鍵菜單在某些情況下也是很有用的,
抓蝦的feed列表里就可以使用右鍵菜單,如果網(wǎng)頁里
調(diào)用了google maps,而且占據(jù)了很大的客戶端面積,用右鍵菜單也會更方便。最近做的項目里就要用到這個,我寫了一個簡單的右鍵菜單,并且學習把它封裝成一個類。
以下是html形式的代碼:
- <div id="mousemenu" style="display: none; width: 200px;">
-
- <div class="mousemenumain">
- <ul id="allitems">
- <li><a href=""><span>菜單項目1</span></a></li>
- <li><a href=""><span>菜單項目2</span></a></li>
- <li><a href=""><span>菜單項目3</span></a></li>
- <li><a href=""><span>菜單項目4長度超出長度超出長度超出長度超出長度超出長度超出</span></a></li>
- <li><a href=""><span>菜單項目5</span></a></li>
- <li><a href=""><span>菜單項目6</span></a></li>
- <li><a href=""><span>菜單項目7</span></a></li>
- <li><a href=""><span>菜單項目8</span></a></li>
- </ul>
- </div>
- </div>
菜單的CSS:
- #mousemenu{
- position:absolute;
- background:url(leftbg.jpg) no-repeat;
-
- }
-
- .mousemenumain{
- width:100%;
- float:left;
-
- margin:0px 5px 0px 22px;
- background:url(tempbg.jpg);
-
- border:1px solid #999;
- border-left:none;
- }
-
- *:first-child+html .mousemenumain{margin:0px 5px 0px 11px;} * html .mousemenumain{margin:0px 5px 0px 11px;}
-
- .mousemenumain ul{
- padding:0px;
- margin:0px 0px 0px 0px;
-
- list-style:none;
- width:100%;
- }
-
- .mousemenumain ul li{
-
- width:100%;
- }
-
- .mousemenumain ul li a{
- display:block;
-
- text-decoration:none;
- color:#000000;
- margin:0px 0px 0px 0px;
-
- height:20px;
- line-height:20px;
- overflow-x:hidden;
-
- width:200px;
- }
-
- .mousemenumain ul li a:hover{
-
- background:#0000ee;
- border:0px solid #00ccff;
- text-decoration:none;
-
- color:#fff;
- cursor:pointer;
- }
-
- .mousemenumain ul li span{
-
- margin:0px 15px;
- display:block;
- }
控制菜單彈出位置的JS程序:
- document.oncontextmenu = ShowMenu;
-
- function ShowMenu(ev){
-
- var obj=document.getElementById('mousemenu');
- obj.style.display='none';
- ev = ev || window.event;
-
- var showplace=GetMousexy(ev);
- obj.style.top=showplace.y+"px";
-
- obj.style.left=showplace.x+"px";
-
- var menuplaceX=parseInt(obj.style.left)+parseInt(obj.style.width)+document.body.scrollLeft; //獲得菜單右邊緣的坐標
-
- var j=0;
- for(var i=0;i<document.getElementById('allitems').childNodes.length;i++){ //獲得菜單項的數(shù)量
-
- if(document.getElementById('allitems').childNodes.item(i).tagName=="LI"){j++;}
-
- }
-
- var menuplaceY=parseInt(obj.style.top)+20*j-document.body.scrollTop; //獲得菜單下邊緣的坐標
-
- if(menuplaceX>document.body.clientWidth){ //如果菜單右邊緣超出瀏覽器邊框,則讓菜單出現(xiàn)在鼠標左側(cè)
- obj.style.left=(showplace.x-parseInt(obj.style.width)-26)+"px";
-
- }
- if(menuplaceY>document.documentElement.clientHeight){ //如果菜單下邊緣超出瀏覽器邊框,則讓菜單出現(xiàn)在鼠標上側(cè)
-
- obj.style.top=(showplace.y-20*j)+"px";
-
- }
-
- obj.style.display='';
- return false; //阻止原來的右鍵菜單出現(xiàn)
-
- }
-
- function GetMousexy(ev){ //獲取鼠標坐標
- if(ev.pageX || ev.pageY){
-
- return {x:ev.pageX, y:ev.pageY}; //適用于FIREFOX
-
- } return {
- x:ev.clientX + document.body.scrollLeft - document.body.clientLeft, //適用于IE
-
- y:ev.clientY + document.body.scrollTop - document.body.clientTop
-
- }
- }
需要注意的就是不能讓菜單超出瀏覽器邊緣,產(chǎn)生滾動條。
最后的效果:點這里
但是這樣做的話,就必須把菜單的HTML代碼寫在網(wǎng)頁面文件里,不能隨時調(diào)用,如果一個頁面里會出現(xiàn)多個菜單的話,就要每個都寫一套HTML代碼。如果用JS來創(chuàng)建菜單,并且把CSS和程序都封裝到一個類里面,每次要用菜單的時候就只需要寫很少的代碼創(chuàng)建一個實例,雖然第一次比較麻煩,但以后就很方便了:
調(diào)用這個類的方法是……首先創(chuàng)建菜單的對象,在window.onload = function(){}或body onload=”"里加上:
- YYmenu = new RightMenu();
注意不能寫作var YYmenu = new RightMenu();那樣YYmenu就不是全局的了……
接下來,根據(jù)實際需要,設(shè)置菜單的具體項目,寫成一個數(shù)組:[”菜單項的名稱”,”打開方式”,”點擊的事件”],比如:
- var b=[ //設(shè)置菜單b的具體項目
- ["菜單b菜單b1","_blank","javascript:alert('hahahaha')"],
-
- ["菜單b菜單b2","","javascript:alert('xixixixi')"],
- ["菜單b菜單b3","","javascript:alert('xixixixi')"],
-
- ["菜單b菜單b4","","javascript:alert('xixixixi')"],
- ["菜單b菜單b5","","javascript:alert('xixixixi')"],
-
- ["菜單b菜單b6","","javascript:alert('xixixixi')"]
- ];
需要幾種樣式的菜單,就建立幾個數(shù)組。然后,給需要右鍵彈出菜單的頁面元素加上oncontextmenu事件和自定義屬性“hasmenu”(如果沒有覆蓋整個頁面的全局右鍵菜單,就不用加這個屬性), 比如:
- <div oncontextmenu="return YYmenu.ShowMenu(event,b)" hasmenu="1">這是需要右鍵彈出菜單的元素</div>
參數(shù)“b”就是包含菜單項目的那個數(shù)組。
如果想要在整個頁面任何地方點右鍵都可以彈出一個通用的菜單,需要像這些調(diào)用:
- if (window.ActiveXObject){
- document.oncontextmenu=function(yy) //適用于IE
-
- { //alert(event.srcElement.nodeName);
- if (event.srcElement.getAttribute("hasmenu")!="1"){
-
- return YYmenu.ShowMenu(yy,a);
- }
- }
- }else{
-
- document.oncontextmenu=function(event) //適用于FIREFOX
- {
- if (event.target.getAttribute("hasmenu")!="1"){
-
- return YYmenu.ShowMenu(event,a);
- }
- }
-
- }
這里我處理的不太好,IE和FIREFOX在獲取鼠標當前目標時,有一些差異還沒完全理解……
最后的效果:點這里
這個javascript類的源文件:點這里
菜單的外觀我就沒時間弄了,如果你想把菜單做成本文左上角那副圖里的效果,只要換一張背景圖片,并且給每個LI加上背景就行了……
本站僅提供存儲服務,所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請
點擊舉報。