【js】event(事件對象)詳解

1.事件對象css

    Event 對象表明事件的狀態,好比事件在其中發生的元素、鍵盤按鍵的狀態、鼠標的位置、鼠標按鈕的狀態。
    • 何時會產生Event 對象呢? 
      • 例如: 當用戶單擊某個元素的時候,咱們給這個元素註冊的事件就會觸發,該事件的本質就是一個函數,而該函數的形參接收一個event對象.
    • 事件一般與函數結合使用,函數不會在事件發生前被執行!

使用場景即:html

var oDIv = document.getElementById('box');

oDiv.onclick = function(event){
    .........
}

 

2.事件流瀏覽器

2.1事件流發展史ruby

見:http://www.cnblogs.com/rubylouvre/archive/2010/04/27/1721988.htmldom

2.2冒泡(由下到上)函數

意思就是說,假如用戶單擊了一個元素,該元素擁有一個click事件,那麼一樣的事件也將會被它的祖先觸發,這個事件從該元素開始一直冒泡到DOM樹的最上層,這一過程稱爲事件冒泡

 

 

 

2.3捕獲(由上到下)spa

事件捕獲和事件冒泡是相反的,也就是說,當用戶觸發了一個事件的時候,這個事件是從DOM樹的最上層開始觸發一直到捕獲到事件源.

 

2.4事件流的寫法以及實現方式3d

    • 標準實現方式使用關鍵詞addEventListener,假如你想要給某一個元素添加事件,如今就能夠這樣寫element.addEventListener(eventType, fn, false) 
      • dom對象.addEventListener(事件類型, 回調函數, 事件機制)這裏的事件類型表示你要使用哪一種事件類型好比click, 回調函數裏面寫着觸發此事件你要作什麼事情, 事件機制分爲冒泡和捕獲,若是爲false表示事件冒泡,爲true表示事件捕獲
    • IE寫法: 
    • dom對象.attachEvent(eventType, fn)第一個參數表示事件類型,第二個是回調.這種寫法兼容IE, IE沒有實現事件捕獲,

3.關於event對象指針

  • 在觸發的事件的函數裏面咱們會接收到一個event對象,經過該對象咱們須要的一些參數,好比說咱們須要知道此事件做用到誰身上了,就能夠經過event的屬性target來獲取到(IE暫且不談),或者想阻止瀏覽器的默認行爲能夠經過方法preventDefault()來進行阻止.如下是event對象的一些屬性和方法
屬性 描述
altKey 返回當事件被觸發時,」ALT」 是否被按下。
button 返回當事件被觸發時,哪一個鼠標按鈕被點擊。
clientX 返回當事件被觸發時,鼠標指針的水平座標。
clientY 返回當事件被觸發時,鼠標指針的垂直座標。
ctrlKey 返回當事件被觸發時,」CTRL」 鍵是否被按下。
metaKey 返回當事件被觸發時,」meta」 鍵是否被按下。
relatedTarget 返回與事件的目標節點相關的節點。
screenX 返回當某個事件被觸發時,鼠標指針的水平座標。
screenY 返回當某個事件被觸發時,鼠標指針的垂直座標。
shiftKey 返回當事件被觸發時,」SHIFT」 鍵是否被按下。
  • IE 屬性(除了上面的鼠標/事件屬性,IE 瀏覽器還支持下面的屬性)
屬性 描述
cancelBubble 若是事件句柄想阻止事件傳播到包容對象,必須把該屬性設爲 true。
fromElement 對於 mouseover 和 mouseout 事件,fromElement 引用移出鼠標的元素。
keyCode 對於 keypress 事件,該屬性聲明瞭被敲擊的鍵生成的 Unicode 字符碼。對於 keydown 和 keyup
offsetX,offsetY 發生事件的地點在事件源元素的座標系統中的 x 座標和 y 座標。
returnValue 若是設置了該屬性,它的值比事件句柄的返回值優先級高。把這個屬性設置爲
srcElement 對於生成事件的 Window 對象、Document 對象或 Element 對象的引用。
toElement 對於 mouseover 和 mouseout 事件,該屬性引用移入鼠標的元素。
x,y 事件發生的位置的 x 座標和 y 座標,它們相對於用CSS動態定位的最內層包容元素。
  • 標準 Event 屬性 下面列出了 2 級 DOM 事件標準定義的屬性
屬性和方法 描述
bubbles 返回布爾值,指示事件是不是起泡事件類型。
cancelable 返回布爾值,指示事件是否可擁可取消的默認動做。
currentTarget 返回其事件監聽器觸發該事件的元素。
eventPhase 返回事件傳播的當前階段。
target 返回觸發此事件的元素(事件的目標節點)。
timeStamp 返回事件生成的日期和時間。
type 返回當前 Event 對象表示的事件的名稱。
initEvent() 初始化新建立的 Event 對象的屬性。
preventDefault() 通知瀏覽器不要執行與事件關聯的默認動做。
stopPropagation() 再也不派發事件。

4.Event對象的一些兼容寫法code

得到event對象兼容性寫法 event || (event = window.event); 得到target兼容型寫法 event.target||event.srcElement 阻止瀏覽器默認行爲兼容性寫法 event.preventDefault ? event.preventDefault() : (event.returnValue = false); 阻止冒泡寫法 event.stopPropagation ? event.stopPropagation() : (event.cancelBubble = true);

事件綁定和取消事件綁定方法的形式

//事件綁定
function on(dom, eventType, fn) { if(dom.addEventListener) { dom.addEventListener(eventType, fn); } else { if(dom.attachEvent) { dom.attachEvent('on' + eventType, fn); } } //取消事件綁定 function un(dom, eventType, fn) { if(dom.removeEventListener) { dom.removeEventListener(eventType, fn, false); } else { if(dom.detachEvent) { dom.detachEvent("on" + eventType, fn) } } }

 5.事件冒泡和事件捕獲demo

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title>bubble event</title>
    <style type="text/css">
        body{margin:0;}
        #one{
               width:500px;
               height:500px;
            background:rgb(255,0,0);
               border: 1px solid transparent;
        }
        #two{
            width:400px;
            height:400px;
            margin: 0 auto;
            margin-top: 50px;
            background:rgb(255,50,50);
            border: 1px solid transparent;
        }
        #three{
            width:300px;
               height:300px;
            margin: 0 auto;
            margin-top: 50px;
               background:rgb(255,100,100);
            border: 1px solid transparent;
        }
        #four{
            width:200px;
               height:200px;
               margin: 0 auto;
            margin-top: 50px;
            background:rgb(255,150,150);
        }
    </style>
</head>
<body>
    <div id='one'>
      <div id='two'>
        <div id='three'>
         <div id='four'>
          </div>
        </div>
      </div>
    </div>

    <script>
        var one = document.getElementById('one');
        var two = document.getElementById('two');
        var three = document.getElementById('three');
        var four = document.getElementById('four');

       var useCapture = false; //false爲冒泡獲取【目標元素先觸發】    true爲捕獲獲取【父級元素先觸發】
        one.addEventListener('click', function(event) {
            event || (event = window.event);
            console.log(event);
           console.log('one');
        }, useCapture);
        two.addEventListener('click', function() {
            console.log('two');
        }, useCapture);
        three.addEventListener('click', function() {
            console.log('three');
        }, useCapture);
        four.addEventListener('click', function() {
            console.log('four');
        }, useCapture);     

        /*
        false
            冒泡
            點擊four div
            輸出結果:four three two one        

        true
        捕獲
            點擊four div
            輸出結果: one two three four
       */
   </script>
</body>
</html>

 

 

參考資料:http://www.javashuo.com/article/p-tjszoppb-ck.html

 

 

做者:smile.轉角

QQ:493177502

相關文章
相關標籤/搜索