zoukankan      html  css  js  c++  java
  • js 右击


    下面是做的鼠标右击,不再执行默认事件,而是出来自定义的。

     1     <div class="wrap" id="wrap">
     2         <ul class="menu" id="menu">
     3             <li><a href="javascript:;">这是第一行</a></li>
     4             <li><a href="javascript:;">这是第一行</a></li>
     5             <li class="dialog"><a href="javascript:;">这是第一行</a></li>
     6             <li><a href="http://www.cnblogs.com/chuyu" target="_blank">这是一个链接</a></li>
     7             <li><a href="javascript:;">这是第一行</a></li>
     8             <li><a href="javascript:;">这是第一行</a></li>
     9             <li><a href="javascript:;">这是第一行</a></li>
    10         </ul>
    11     </div>
      1 var _wrap = document.getElementById("wrap"),
      2             _menu = document.getElementById("menu"),
      3             speed = 0,
      4             t,
      5             _wrapHeight;
      6 
      7         
      8         _wrap.style.display = "none";
      9 
     10         //绑定事件
     11         var addEvent = function(ele,type,handler){
     12             if(ele.addEventListener){
     13                 ele.addEventListener(type,handler,false);
     14             }else if(ele.attachEvent){
     15                 ele.attachEvent("on" + type,handler);
     16             }else{
     17                 ele["on"+type] = handler;
     18             }
     19         };
     20 
     21         //取消默认事件
     22         var cancelDefault = function(event){
     23             if(event.preventDefault){
     24                 event.preventDefault();
     25             }else{
     26                 event.returnValue = false;
     27             }
     28         };
     29 
     30         //阻止冒泡事件
     31         var stopBubble = function(event) {
     32             if(event.stopPropagation){
     33                 event.stopPropagation();
     34             }else{
     35                 event.cancelBubble = true;
     36             }
     37         }
     38 
     39         //获取鼠标右击时候的位置
     40         var getPos= function(event){
     41             if(event.pageX || event.pageY){
     42                 return {
     43                     x : event.pageX,
     44                     y : event.pageY
     45                 }
     46             }
     47             return{
     48                 x : event.clientX + document.body.scrollLeft,
     49                 y : event.clientY + document.body.scrollTop
     50             }
     51         };
     52 
     53         //根据className 获取元素
     54         var getByClass = function(classname){
     55             var liNodes = [];
     56             if(document.getElementsByClassName){
     57                 return document.getElementsByClassName(classname);
     58             }else{
     59                 var nodes = document.getElementsByTagName("*");//取得所有的节点
     60                     
     61                 for(var i=0,_len=nodes.length;i<_len;i++){
     62                     if(hasClass(nodes[i],classname)){
     63                         liNodes.push(nodes[i]);
     64                     }
     65                 }
     66                 
     67             }
     68             return liNodes;
     69         };
     70         var hasClass = function(node,classname){
     71             var names = node.className.split(/s+/);//得到classname
     72             for(var i = 0; i < names.length; i++) {
     73                 if(names[i] === classname) {
     74                     return true;
     75                 }
     76             }
     77             return false;
     78         };
     79 
     80 
     81         function doWrap(ev){
     82             var oEvent=window.event||ev;
     83             _wrap.style.display="block";
     84             t = setInterval(doMove,50);
     85         }
     86         function doMove(){
     87             if(_wrap.offsetHeight>=204){
     88                 speed *= -0.7;
     89                 _wrap.style.height = 204 + "px";
     90             }
     91             _wrapHeight = speed + _wrap.offsetHeight;
     92             
     93             speed += 10;
     94             _wrap.style.height = _wrapHeight + "px";
     95         }
     96 
     97         addEvent(_menu,"mouseover",function(event){
     98             var event = event || window.event;
     99             var _target = event.target || event.srcElement;
    100             _target.style.background = "#00c0ff";
    101         });
    102         addEvent(_menu,"mouseout",function(event){
    103             var event = event || window.event;
    104             var _target = event.target || event.srcElement;
    105             _target.style.background = "none";
    106         });
    107 
    108         //右击阻止默认菜单,显示我的菜单
    109         document.oncontextmenu = function(event){
    110             event = event || window.event;
    111             cancelDefault(event);
    112             _wrap.style.height = "0";
    113 
    114             var _left = getPos(event).x,
    115                 _top = getPos(event).y;
    116             _wrap.style.display = "block";
    117             _wrap.style.left = _left + "px";
    118             _wrap.style.top = _top + "px";
    119 
    120             clearInterval(t);
    121             doWrap();
    122         }; 
    123 
    124         //点击body的时候消失
    125         document.onclick = function(e){
    126             _wrap.style.height = "0px";
    127             _wrap.style.display = "none";
    128             speed = 0;
    129             clearInterval(t);
    130         };
    131 
    132         //点击div 时 不消失,执行应当执行的
    133         addEvent(_wrap,"click",function(event){
    134             event = event || window.event;
    135             stopBubble(event);
    136         });
    137 
    138         var oLi = getByClass("dialog")[0];
    139         oLi.onclick = function(event){
    140             _wrap.style.display = "none";
    141             alert("我通过ClassName弹出了一个层!");
    142         };

    1.绑定事件:addEvent

    2.取消默认事件:cancelDefault

      之前IE6 里面调试,用抓包工具,出现一个 passerror ,是因为 <a href="javascript:;"></a> a 标签的伪事件,在IE6下
    面的bug, 写上 event.preventDefault() 就好了。

    3.阻止冒泡:stopPropagation 。这里注意父元素应当跟子元素绑定的是同一事件类型, 我原先 一个是onclick ,一个写的
    onmousedown 这样是不可行的

    4.得到元素相对于页面的位置。getPos。(pageX,pageY 是现代浏览器相对于页面document 的距离,而IE中 chlientX ,clientY
    是元素相对于窗口的距离)

    5.根据class 获取元素:getByClass (IE9后面才有document.getElementsByClassName)

    6.这里改变背景色,使用事件委托技术处理。

    7.缓冲效果,用setInterval() 函数,注意clearInterval().

    8.document.oncontextmenu,W3S 上面说是上下文改变,其实很多情况下就可以理解为鼠标右击。

    另记录下:

    1 //getAttribute在IE6,7下面路径是绝对地址,在现代浏览器中是相对路径
    2         var a = [1,2,3,4];
    3         a.unshift(67);
    4         var aLink = document.getElementById("attri");
    5         console.log(aLink.getAttribute("href",2));

    aLink.getAttribute("href",2) 加上一个参数2 之后,就变成相对地址了。

    1 //在IE9,10里面能够执行,说明IE9/10都支持addEventListener 和 DOMContentLoaded
    2         if(document.addEventListener){
    3               document.addEventListener("DOMContentLoaded",function() {
    4                 //alert('DOMContentLoaded is execute')
    5             }, false);
    6         }

    首先声明了a = 4,但是接着执行函数outerFun() 之后覆盖了全局变量 a 的值变成:0.

    function outerFun(){
                //没有var 
                a =0;
                console.log(a); 
            }
            var a = 4;
            outerFun();   
            console.log(a);
    疯癫不成狂,有酒勿可尝;世间良辰美,终成水墨白。
  • 相关阅读:
    《算法竞赛进阶指南》0x12 队列 POJ2259 Team Queue
    《算法竞赛进阶指南》0x11栈 单调栈求矩形面积 POJ2559
    《算法竞赛进阶指南》0x11 栈 求解中缀表达式
    19.职责链模式(Chain of Responsibility Pattern)
    16.观察者模式(Observer Pattern)
    17.解释器模式(Interpreter Pattern)
    15. 迭代器模式(Iterator Pattern)
    14.命令模式(Command Pattern)
    12.代理模式(Proxy Pattern)
    13.模板方法(Template Method)
  • 原文地址:https://www.cnblogs.com/chuyu/p/3204439.html
Copyright © 2011-2022 走看看