HTML5-常見的事件- contextmenu 事件


 

  主要控制應該何時顯示上下文菜單,以便開發人員取消默認的上下文菜單而提供自定義的菜單

  <1>  由於該事件是冒泡的,因此可以為document 指定一個事件處理程序,用以處理頁面中發生的所有此類事件。

      

    EventUtil.addHandler(document,"contextmenu",function(event){
        console.log("收到"); //收到
    })
    EventUtil.addHandler(document.body,"contextmenu",function(event){
        console.log("冒泡?");//冒泡?
    });

 

  <2>  在兼容DOM的瀏覽器中,使用event.preventDefault();在IE中,將event.returnValue的值設置為false。  IE、chrome、Frifox、Opera、Safari

     

   EventUtil.addHandler(document,"contextmenu",function(event){
        console.log("收到");
    })
    EventUtil.addHandler(document.body,"contextmenu",function(event){
        event.preventDefault()?event.preventDefault():event.returnValue=false;
    });

 

  <3>  因為contextmenu 事件屬於鼠標事件,所以其事件對象中包含於光標位置有關的所有屬性。

    

   EventUtil.addHandler(document.body,"contextmenu",function(event){
        var event = EventUtil.getEvent(event);
        event.preventDefault()?event.preventDefault():event.returnValue=false;
        console.log("   x 坐標:"+event.clientX+" y坐標:"+event.clientY); // 200 300
        console.log(EventUtil.getTarget(event));//body \ li \  ul
    });

 

  <4>  一般常用 contextmenu來顯示菜單,onclick 事件處理程序來隱藏該菜單。

<style>
        .hidden{
            visibility: hidden;
            position: absolute;
        }
</style>

<body style="height:1500px;">
    <ul id="menu">
        <li>123</li>
        <li>234</li>
        <li>567</li>
    </ul>
</body>

 

EventUtil.addHandler(window,"load",function(event){
        var ul = document.getElementById("menu");
        ul.className = "hidden";
        EventUtil.addHandler(document,"contextmenu",function(event){
            event = EventUtil.getEvent(event);
            EventUtil.preventDefault(event);
            var menu = document.getElementById("menu");
            menu.top = event.clientY;
       menu.left = event.clientX;
menu.style.visibility = "visible"; }); EventUtil.addHandler(document,"click",function(){ document.getElementById("menu").style.visibility ="hidden"; }); });

主要是對document對象添加了一個contextmenu事件,以及給文檔對象添加click事件進行隱藏; 這里並不是沒有問題的?

當文檔出現滾動條時候,菜單位置似乎和想象中有偏差?   其實不管在那種情況下,只要能夠獲取鼠標的坐標,而坐標信息可以通過事件對象進行取得?

從前面講到的 幾個位置屬性:  clientX 、clientY、 pageX、pageY   前兩者相對的視口的位置, 后兩者相對文檔的位置 scorllTop 、scrollLeft  滾動條距離頂部 、 左邊的距離

由於瀏覽器的差異,在IE8以及下面的版本對pageX、pageY不能正確獲取?先給大家上個圖吧 

針對EventUtil進行了擴展

       getScrollTop:function() {
            if (document.compatMode == "CSS1Compat") {
                return document.documentElement.scrollTop;
            } else {
                return document.body.scrollTop;
            }
        },
        getScrollLeft:function(){
            if(document.compatMode=="CSS1Compat"){
                return document.documentElement.scrollLeft;
            }else{
                return document.body.scrollLeft;
            }
        }

主要配合clientX 以及 clientY菜單位置的正確顯示。

EventUtil.addHandler(window,"load",function(event){
        var ul = document.getElementById("menu");
        ul.className = "hidden";
        EventUtil.addHandler(document,"contextmenu",function(event){
            event = EventUtil.getEvent(event);
            EventUtil.preventDefault(event);
            var menu = document.getElementById("menu");
            var top =  EventUtil.getScrollTop();
            var left = EventUtil.getScrollLeft();
            menu.style.left = event.clientX + left;
            menu.style.top = event.clientY + top;
            menu.style.visibility = "visible";
        });
        EventUtil.addHandler(document,"click",function(){
            document.getElementById("menu").style.visibility ="hidden";
        });
    });

 那還有另外種方式推薦  

EventUtil.addHandler(window,"load",function(event){
        var ul = document.getElementById("menu");
        ul.className = "hidden";
        EventUtil.addHandler(document,"contextmenu",function(event){
            event = EventUtil.getEvent(event);
            EventUtil.preventDefault(event);
            var menu = document.getElementById("menu");
            var top =  EventUtil.getScrollTop();
            var left = EventUtil.getScrollLeft();
            menu.style.left = event.pageX?event.pageX:event.clientX + left;
            menu.style.top = event.pageY?event.pageY:event.clientY + top;
            menu.style.visibility = "visible";
        });
        EventUtil.addHandler(document,"click",function(){
            document.getElementById("menu").style.visibility ="hidden";
        });
    });

支持contextmenu 事件的瀏覽器有IE、Firefox、Safari、Chrome、Opera 11+

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM