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+

  

时间: 2024-08-26 19:45:11

HTML5-常见的事件- contextmenu 事件的相关文章

HTML5事件——contextmenu 隐藏鼠标右键菜单

在window中单击右键或在Mac中Ctrl+单击时会触发contextmenu事件,通过取消其默认动作可以提供自定义事件. 首先先写一个自己的菜单: <style> ul, li { margin: 0; padding: 0; } #myMenu{ list-style: none; width: 150px; border: 1px solid #ccc; border-bottom: none; position: absolute; display: none; } #myMenu

移动端前端常见的触摸相关事件touch、tab、swipe等整理

前端的很多事件在PC端和浏览器端可公用,但有些事件却只在移动端产生,如触摸相关的事件 本文整理了移动端常见的一些事件,包括原生支持的click.touch.tab.swipe事件,也有定义型的gesture手势事件(目前只是一个概念,使用的时候需封装模拟) 使用到的是移动端的Chrome浏览器,本文只对该浏览器进行调试,其他浏览器暂未考虑到 一.事件定义及分类 1. click事件 单击事件,类似于PC端的click,但在移动端中,连续click的触发有200ms ~ 300ms的延迟 2. t

html5之服务器推送事件

用于服务器实时向客户端推送消息,这个是单向推送server to client 服务器端 header头 要想服务器端推送:在服务器端的报头要定义: header('Content-Type:text/event-stream'),服务器发送的响应内容应该使用这种`text/event-stream`的MIME;这样客户端才能理解你这是发送的不是普通的数据, eventsource对象才能识别 事件流 服务器端发送事件流(内容); 每执行一次php文件就产生一个事件流: 事件流是由多个消息组成:

HTML5常见的面试题,基础知识点

                                                                                HTML5常见的面试题 一.HTML 常见题目 01.Doctype作用?严格模式与混杂模式如何区分?它们有何意义? 02.HTML5 为什么只需要写 <!DOCTYPE HTML>? 03.行内元素有哪些?块级元素有哪些? 空(void)元素有那些? 04.页面导入样式时,使用link和@import有什么区别? 05.介绍一下你对浏

三言两语之js事件、事件流以及target、currentTarget、this那些事

厉害了我的哥——你是如此简单我却将你给遗忘   放假前再看某文档,里边提到两个我既熟悉又陌生的概念target.currentTarget,说他熟悉我曾经看到过这两个事件对象的异同处,说他陌生吧?很不巧.正要运用了,吾才发现吾压根就没记住...其实要讲清楚target.currentTarget,我们就不得不说一下事件流这个概念,而要言明事件流,我们也要晓得一下神马是事件以及一些周边生态概念,这三个概念是必须放在一块说,我们才能对能对这部分的知识有很好的理解滴,网上信息太零散,于是乎就有了这篇算

JavaScript学习笔记(四)——js事件之事件绑定、兼容问题

事件捕获:事件从根节点开始,逐级到子节点,若节点绑定了事件动作,则执行动作,继续往下走. 事件冒泡:事件由子节点向跟节点派送,若节点绑定了事件动作,则执行动作,然后继续往上走. 一.怎么绑定事件和移除事件? 由于IE浏览器不支持事件捕获,只支持事件冒泡.因此,其他遵循标准的浏览器都使用W3C定义的函数绑定和移除,IE浏览器则自有一套执行规则.下面分别总结一下W3C和IE的绑定机制: 1.W3C下的事件绑定 添加事件 — addEventListener() 移除事件 — removeEventL

浏览器事件以及事件代理

以前对事件的了解停留在事件冒泡的概念. 一提到就想到了事件不断的向上冒泡的过程 其实常见的事件模型分为事件冒泡,事件捕获 事件冒泡 在我们使用的所有浏览器中,都支持事件冒泡,即事件由子元素向祖先元素传播. 事件捕获 在firefox,chrome,safari这类标准浏览器中还支付事件捕获(IE Opera不支持) 捕获阶段是一个和冒泡阶段完全相反的过程,即事件由祖先元素向子元素传播,和一个石子儿从水面向水底下沉一样,要说明的是在 IE,opera浏览器中,是不存在这个阶段的. 具体实现异同点:

Android异步框架RxJava 1.x系列(二) - 事件及事件序列转换原理

前言 在介绍 RxJava 1.x 线程调度器之前,首先引入一个重要的概念 - 事件序列转换.RxJava 提供了对事件序列进行转换的支持,这是它的核心功能之一. 正文 1. 事件序列转换定义 所谓转换,就是将事件序列中的对象或整个序列进行加工处理,转换成不同的事件或事件序列,有点类似 Java 1.8 中的流处理. 2. 事件序列转换API 首先看一个 map() 的例子: Observable.just("images/logo.png") // 输入类型 String .map(

JavaScript-4.5 事件大全,事件监听---ShinePans

绑定事件 <input type="bubtton" onclick="javascript:alert('I am clicked');"> 处理事件 <script language="JavaScript" for="对象" event="事件"> ... (事件处理代码) ... </script> 鼠标事件举例 <script language="