你們好,在學習H5的過程當中,咱們接觸了許許多多不一樣的事件,它們各自都有本身獨到的用途,且在本身的領域發揮了重要的做用,下面就跟隨我一塊兒看看它們都作了些啥,Let's go!!!javascript
鼠標事件、鍵盤事件css
首先在這裏咱們要注意到獲取鼠標事件、鍵盤事件的時候,火狐瀏覽器是一個特殊的存在,其餘的瀏覽器能夠經過window.event拿到對象,但火狐瀏覽器在函數裏須要傳遞一個參數e/ev/event,其中嚴謹的是eventhtml
1.火狐兼容問題解決方案java
document.onmousedown = function (e) { var ev = e || window.event; console.log(ev); }
對象(鼠標、鍵盤)獲取到了以後,接下來就能夠執行一些鼠標和鍵盤能執行的事了,你們想一想在平常生活中購物、玩遊戲、微博留言啥的,鼠標和鍵盤是否是都是咱們達到目的的得利助手?瀏覽器
2. 鼠標事件函數
ev.clientX 可視區中,鼠標的X座標;學習
ev.clientY 可視區中,鼠標的Y座標; this
case-one: onmousemove(鼠標移動)spa
實現幾個div的鼠標移動跟隨 //css樣式:注意須要絕對定位 div{width: 100px;height: 100px;border: 1px solid #ccc;border-radius: 50%; position: absolute;top: 0;left: 0;background-color: red; } //body代碼:幾個相同的div(大小能夠自定,建議相同,後面的js定位在div中心,好看而已) <div></div> <div></div> <div></div> <div></div> <div></div> //js代碼: <script type="text/javascript"> var adiv=document.getElementsByTagName("div"); document.onmousemove=function(e){ var ev=e||window.event; var l=ev.clientX; var t=ev.clientY; for (var i = 0; i<adiv.length; i++) { function move(i){ setTimeout(function(){ adiv[i].style.left=(l-50)+"px"; adiv[i].style.top=(t-50)+"px"; },i*30) } move(i); } } </script>
case-two: onmousedown、onmouseup(按下,擡起)code
實現一個div的點擊拖拽 //css樣式: *{margin: 0;padding: 0;} //通配符 #box{width: 20px;height: 20px;background-color: red;position: absolute;} //body代碼: <div id="box"></div> //js代碼: var box=document.getElementById("box"); box.onmousedown=function(e){ var ev=e||window.event; var x=ev.clientX-box.offsetLeft; var y=ev.clientY-box.offsetTop; document.onmousemove=function(e){ var ev=e||window.event; box.style.left= ev.clientX-x+"px"; box.style.top= ev.clientY-y+"px"; } document.onmouseup=function(){ document.onmousemove=null; } }
case-three: ondblclick(鼠標左鍵雙擊)
case-four: oncontextmenu(鼠標右擊)
document.oncontextmenu = function (){ alert('a'); return false; //阻止默認事件即右鍵的菜單事件 }
case-five: onmousewheel、DOMMouseScroll (滾輪事件)
function wheel(target,upfn,downfn){ //獲取的兼容性寫法 var Firefox=window.navigator.userAgent.indexOf("Firefox"); //是==-1,沒有 if (Firefox==-1) { target.onmousewheel=fn; }else{ target.addEventListener("DOMMouseScroll",fn,false); } function fn(e){ var ev=e||window.event; if (ev.detail) { // 火狐 if (ev.detail>0) { // alert("向上"); upfn(); }else{ // alert("向下"); downfn(); } }else{ //谷歌 if (ev.wheelDelta>0) { // alert("向下"); downfn(); }else{ // alert("向上"); upfn(); } } } }
// 滾輪事件封裝函數 function wheel(obj,upFn,downFn) { if(arguments.length < 3){ alert('Sorry,你輸入的參數不夠'); } obj.onmousewheel = fn; obj.addEventListener && obj.addEventListener('DOMMouseScroll',fn,false); function fn(ev){ var ev = ev || window.event; var bool = true; if(ev.wheelDelta){ bool = ev.wheelDelta > 0 ? true : false; }else if(ev.detail){ bool = ev.detail < 0 ? true : false; } bool && upFn(); (!bool) && downFn(); //prevent(ev); } }
3. 鍵盤事件
case: onkeydown(按下鍵盤)、onkeyup(擡起鍵盤)
實現一個div鍵盤控制上下左右運動(此處不考慮碰壁檢測) //css樣式和body代碼如上case-two相同 //js代碼: <script type="text/javascript"> var box=document.getElementById("box"); document.onkeydown=function(e){ var ev=e||window.event; if (ev.keyCode==37) { box.style.left=box.offsetLeft-10+"px"; }else if (ev.keyCode==39) { box.style.left=box.offsetLeft+10+"px"; }else if (ev.keyCode==38) { box.style.top=box.offsetTop-10+"px"; }else if (ev.keyCode==40) { box.style.top=box.offsetTop+10+"px"; } } </script>
特殊的按鍵:ctrlKey,shiftKey,altKey
4.表單事件、阻止默認事件
// 點擊submit按鈕(在form裏提交至百度),彈出提示框 var form1 = document.querySelector("#form1"); form1.onsubmit = function (ev){ alert('a'); //ev.preventDefault 不兼容ie6-ie8 //return false 阻止默認事件(此處就不會跳轉至百度窗口了) }
5. 輸入框焦點事件
使用onfocus實現輸入框的placeholder效果 var txt=document.getElementById(「txt1"); txt.onfocus=function(){ this.value=""; } txt.onblur=function(){ this.value="用戶名"; }
6. 事件冒泡
事件冒泡:是指子標籤發生事件後,一直傳遞到父級,一直追溯到document,如點擊一個在div標籤裏的button標籤,那麼div、body、document的點擊事件會依次觸發
window.onload=function(){ var box=document.getElementById("box"); var btn=document.getElementsByTagName("input")[0]; //點擊後,btn事件觸發 btn.onclick=function(e){ box.style.display="block"; alert("a"); } //btn的父級,也會隨後被觸發 document.onclick=function(){ box.style.display="none"; alert("b") } }
取消事件冒泡的作法:
window.onload=function(){ var box=document.getElementById("box"); var btn=document.getElementsByTagName("input")[0]; //點擊後,btn事件觸發 btn.onclick=function(e){ var ev=e||window.event; box.style.display="block"; alert("a"); ev.cancelBubble=true; //取消事件冒泡 // event.stopPropagation(); 也是取消事件冒泡 // return false 也能夠取消冒泡,還能夠阻止默認事件 } //因爲取消事件冒泡,btn的父級,不會隨後被觸發 document.onclick=function(){ box.style.display="none"; alert("b") } }
7. 事件綁定
除以上所講的綁定方法外,還有一個方法即addEventListener給標籤綁定事件,優勢:能夠綁定多個不一樣的事件。缺點:兼容性問題,
解決兼容性問題:attachEven 兼容ie8及如下,本次以點擊事件舉例 var Btn = document.getElementById("Btn"); if (Btn.addEventListener) { Btn.addEventListener("click", myFunction,false); //false指的是不事件捕捉,通常用false } else if (Btn.attachEvent) { Btn.attachEvent("onclick", myFunction); // 包含on } function myFunction() { alert("Hello World!"); }
case-add:
結合下面的 case-remove var func = function(){}; //例子 addEvent(window,"load",func) function addEvent(elem, type, fn){ if(elem.attachEvent){ elem.attachEvent('on'+type,fn); return; } if(elem.addEventListener){ elem.addEventListener(type,fn,false); } }
注意點:兩者區別是執行的優先級不同
容許向同個元素添加多個事件,也能夠向同個元素添加不一樣類型的事件,且不會覆蓋已存在的事件: ele.attachEvent("onclick",method1); ele.attachEvent("onclick",method2); ele.attachEvent("onclick",method3); 執行的順序:method3->method2->method1 ele.addEventListener("mousedown",method1,false); ele.addEventListener("click",method2,false); ele.addEventListener("mouseup",method3,false); 執行的順序:method1->method2->method3
8. 冒泡和捕獲
事件傳遞有兩種方式:冒泡與捕獲。
事件傳遞定義了元素事件觸發的順序。 若是你將 <p> 元素插入到 <div> 元素中,用戶點擊 <p> 元素, 哪一個元素的 "click" 事件先被觸發呢?
在 冒泡 (false)中,內部元素的事件會先被觸發,而後再觸發外部元素,即: <p> 元素的點擊事件先觸發,而後會觸發 <div> 元素的點擊事件。
在 捕獲(true) 中,外部元素的事件會先被觸發,而後纔會觸發內部元素的事件,即: <div> 元素的點擊事件先觸發 ,而後再觸發 <p> 元素的點擊事件
9. 事件移除
case-remove:
非ie瀏覽器 target.removeEventListener(type,listener,useCapture); ie瀏覽器 target.detachEvent(on+type, listener); //下面代碼要結合上述的case-add var func = function(){}; removeEvent(window,"load",func) function removeEvent(elem, type, fn) { if(elem.detachEvent){ elem.detachEvent('on' + type, fn); return; } if(elem.removeEventListener){ elem.removeEventListener(type, fn, false); } }