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);

 

posted @ 2013-07-21 22:48  楚玉  阅读(310)  评论(0编辑  收藏  举报