下面是做的鼠标右击,不再执行默认事件,而是出来自定义的。
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);