他們是描述事件觸發時序問題的術語,綁定事件方法(事件委託:addEventListener)的第三個參數,就是控制事件觸發順序的類型。true=事件捕獲,false=事件冒泡。默認false,即事件冒泡javascript
是自下而上的去觸發事件,addEventListener(,,false):第三個參數爲false。css
是從document到觸發事件的那個節點,即自上而下的去觸發事件。addEventListener(,,true):第三個參數爲true。html
<body> <button id="btn" onclick="btnClick()/*內嵌HTML方式*/">點擊事件</button> <script> /*DOM0 1.0 內嵌HTML方式*/ function btnClick() { alert("單擊事件"); } //內嵌方法不推薦使用,好的編程風格應當保持HTML和js代碼行爲分離 var btn = document.getElementById('btn'); /*DOM0 2.0 當作button對象的方法調用方式*/ btn.onclick = function () { alert("單擊事件"); }; //DOM2 3.0 標準事件模型 var callback = function () { alert("單擊事件發生"); }; btn.addEventListener('click',callback,false); </script> </body>
1. $('#btn').click(callback); 2. $('#btn').bind('click',callback);
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>鼠標事件</title> <style> #clickInfo{ position: absolute;min-width: 50px; min-height: 70px;display: none; background-color: #000FFF;color: white; box-shadow: 2px 2px 2px rgba(120,159,102,0.73); } </style> </head> <body> <div id="btn" onclick="btnOnclick()">事件</div> <div id="clickInfo">自定義郵件菜單</div> </body> <script src="../js/jquery-3.2.1.js"></script> <script> // 內嵌事件 function btnOnclick() { alert('內嵌點擊事件'); } //給對象進行事件監聽 var btn = document.getElementById('btn'); btn.addEventListener('click',function () { alert('addEventListener點擊事件'); }); //對象的onclick屬性 btn.onclick = function () { alert('onclick屬性點擊事件'); }; //jQuery的click事件函數 $('#btn').click(function () { alert('jq click事件'); }); //jQuery給對象綁定事件click $('#btn').bind('click',function () { alert('jq bind click事件'); }); //鼠標事件分類 var btn = document.getElementById('btn'); btn.onmousedown = function(e){ if(e.button == 2) alert('右鍵'); else if(e.button == 1) alert('中間'); else if(e.button == 0) alert('左鍵'); else alert('未知 = ' + e.button); }; //自定義郵件菜單 document.oncontextmenu=function(e){ //自定義右鍵菜單(div) var left = e.offsetX; var top = e.offsetY; if($('#clickInfo').css('display') == 'none') $('#clickInfo').css('display','block'); else $('#clickInfo').css('display','none'); $('#clickInfo').css('left',parseInt(left)+10+'px'); $('#clickInfo').css('top',parseInt(top)+10+'px'); return false; //去掉默認的郵件菜單 }; </script> </html>
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>滾動條事件</title> <style> #btn{ position: fixed; bottom: 130px; right: 30px; display: none; width: 70px; height: 70px; border: none; box-shadow: 1px 6px 1px #888888; background-color: green; color: white; outline: none; font-size: 1.5em; } li{ text-align: center; list-style: none; } #divShow{ position: fixed; left: 46%; top: 40%; width: 100px; height: 100px; background-color: rgba(0,0,0,0.33); text-align: center; line-height: 100px; display: none; color: white; border-radius: 100%; font-size: 1.4em; } </style> </head> <body> <button id="btn">回到頂部</button> <div id="divShow"></div> <script src="../js/jquery-3.2.1.js"></script> <script> //初始化頁面 var li = ''; for(var i=0;i<500;i++){ li += '<li>'+'第 '+i.toString()+' 行'+'</li>'; } document.write(li); //回到頂部事件 var btn = document.getElementById('btn'); btn.onclick = function () { window.scrollTo(0,0); }; //判斷向上或者向下 滾動 var a=0,b=0; $(document).scroll(function () { b = $(document).scrollTop(); document.title = b; // 滾動到 距離頂部 1500 位置 顯示 ‘回到頂部’ 按鈕; if(b >= 1500) { $('#btn').css('display','block'); }else { $('#btn').css('display','none'); } // 交互 $('#divShow').css('display','block'); if(a<b) $('#divShow').text('\n 向下滾動'); else $('#divShow').text('\n 向上滾動'); a = b; // 2000ms以後自動消失 setTimeout(function () { $('#divShow').css('display','none'); },2000); }); </script> </body> </html>
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>鍵盤事件</title> <style> body{ text-align: center; } #divShow{ position: fixed;top: 37%;left: 46%; height: 100px;width: 100px;background-color:chartreuse;text-align: center; line-height: 100px; font-size: 1.5em; border-radius: 100%;display: none; } </style> </head> <body> <div id="divShow"></div> <div style="margin: auto;margin-top: 25%;background-color: black;color: white;width: 20%;">您嘗試敲擊一下鍵盤</div> <script src="../js/jquery-3.2.1.js"></script> <script> $(document).keydown(function (e) { var kcode = e.keyCode; $('#divShow').css('background-color','chartreuse'); if(64 < kcode < 106 ){ var keyvalue = String.fromCharCode(e.keyCode); $('#divShow').text(keyvalue); } if(kcode == 13) { $('#divShow').text("回車登陸"); $('#divShow').css('background-color','yellow'); } $('#divShow').css('display','block'); setTimeout(function () { $('#divShow').css('display','none'); },3000); }); </script> </body> </html>
<script> var ev = new MouseEvent('myflip', { cancelable: true, bubble: true, view: window }); document.addEventListener('myflip', function (event) { console.log('右滑'); }, false); var offX_DOWN = 0; var offY_DOWN = 0; $(document).mousedown(function (e) { offX_DOWN = e.clientX; offY_DOWN = e.clientY; console.log('\n 前:'+'('+offX_DOWN+' , '+offY_DOWN+')'); }); $(document).mouseup(function (e) { var offX_UP = e.clientX; var offY_UP = e.clientY; console.log('\n 後:'+'('+offX_UP+' , '+offY_UP+')'); var a = parseInt(offX_UP) - parseInt(offX_DOWN); var b = parseInt(offY_UP) - parseInt(offY_DOWN); console.log('\n(a,b)= '+'('+a+' , '+b+')'); if(b >5){ //觸發 右滑 的自定義事件 document.dispatchEvent(ev); } }); </script>
關於自定義事件,原本還在糾結 一條原生事件從物理層鼠標到一個網頁的定義過程?有些鑽牛角尖!後來研究了一點安卓系統以後就知足了。java
舉個例子:咱們如今是在一個安卓手機打開谷歌瀏覽器訪問一個網頁,點擊了一個按鈕,由此引起一個點擊事件:jquery
1. 物理層-手機屏幕上的傳感器:感知了一個按壓狀態web
2. Android系統(觸摸)驅動:把這個按壓狀態定義成 一組二進制碼值,並把它轉譯成Android Linux內核的碼值(scancode)。編程
3. Android系統接收到scancode以後,又把它轉成Android系統能識別的keycode,而後在framework層針對這個keycode寫一個廣播分發出去,到這裏寫過Android apk的同窗就能理解了,他在寫APK的時候能夠不用Android SDK提供的事件類型,能夠直接經過特定的API 獲取到這個點擊事件的keycode或者對應的廣播消息,而後寫相關的響應函數。瀏覽器
4. 咱們Android手機上的谷歌瀏覽器也是一個APK。因此到這裏這個點擊事件就這樣傳到了瀏覽器。經過瀏覽器APK的再一次轉義或者裏邊的webkit直接在Android底層獲取到了點擊事件的信息碼值。而後它再一次轉譯成標準的的W3C事件「名稱」。這樣在最上層統一造成了W3C DOM標準以後,開發者便能統一使用了。函數
因此對於web開發者來講,就無需關心原生的事件如何產生了。只須要知道瀏覽器轉義後的最後一層,W3C 的DOM事件標準便可,它對應的就是瀏覽器能支持的「最原生」事件了!spa
自定義事件不是讓開發者去自定義「原生」事件,那是瀏覽器和webkit要作的事情(固然瀏覽器定義的事件也不是最「原生」事件,由於它也是接收來自系統層的事件,並轉換,自定義成本身的事件)。
因此自定義事件是讓開發者在W3C 標準「原生」事件的基礎上進行組合邏輯,封裝成更加簡單的事件。《JavaScript 高級程序設計》第三版書中P13也有描述:自定義事件不是由DOM原生觸發的。
在遵循 W3C 規範的瀏覽器中,event 對象經過事件處理函數的參數傳入。 語法: elementObject.OnXXX=function(e){ var eve=e; // 聲明一個變量來接收 event 對象 }