javascript事件詳解和事件冒泡, 捕獲介紹, 事件委托經(jīng)典例子

事件

如何綁定事件

  • ele.onxxx = function(event) { }
    • 兼容性好, 但是一個元素的同一個事件上只能綁定一個處理程序
    • 基本等同于寫在HTML行間
  • obj.addEventListener(type, function( ){ }, flase);
    • IE9以下不兼容, 可以為一個事件綁定多個處理程序
  • obj.attachEvent('on' + type, fn);
    • IE獨有, 一個事件同樣可以綁定多個處理程序

事件處理程序的運行環(huán)境

  • ele.onxxx = function(event) { }
    • 程序this指向是dom元素本身
  • obj.addEventListener(type, fn, false);
    • 程序this指向是dom元素本身
  • obj.attachEvent('on' + type, fn);
    • 程序this指向window
  • 封裝兼容性的addEvent(elem, type, handle);方法
function addEvent(elem, type, handle) {
    if(elem.addEventListener) {
        elem.addEventListener(type, handle, false);
    }else if(elem.attachEvent) {
         elem['temp'] = function() {
            handle.call(elem);
        }
        elem.attachEvent('on' + type, elem['temp']);
    }else{
        elem['on' + type] = handle;
    }
}

解決事件處理程序

  • ele,.onclick = flase/ ' '/ null;
  • ele.removeEventListener(type, fn, false);
  • ele.detachEvent('on' + type, fn);
  • 注: 若綁定匿名函數(shù), 則無法解除
  • 封裝的兼容方法
function removeEvent(elem, type, handle) {
    if(elem.removeEventListener) {
        elem.removeEventListener(type, handle, false);
    }else if(elem.detachEvent) {
        elem.detachEvent('on' + type, handle);
    }else{
        elem['on' + type] = null;
    }
}

事件處理模型--事件冒泡 \ 捕獲

事件冒泡

  • 結構上(非視覺上)嵌套的元素, 會存在事件冒泡的功能, 即同一個事件, 自子元素冒泡向父元素(自底向上)

**Tips: addEventListener中的第三個參數(shù)false/true, 當為true是事件變?yōu)椴东@機制 , flase時為冒泡機制 **

事件捕獲

  • 結構上(非視覺上)嵌套關系的元素, 會存在事件捕獲的功能, 即同一個事件, 自父元素捕獲至子元素(事件源元素). (自頂向下)
  • IE沒有捕獲事件

EG:

例子

  • 當為捕獲機制時: 當點擊黃色方塊時(結構嵌套, 黃色為里面的div, 紅色為父級), 先出發(fā)的是紅色點擊事件, 之后是綠色, 黃色;
  • 當為冒泡機制時, 先觸發(fā)黃色事件, 然后依次向父級冒泡, 為綠色, 紅色.

即使兩個都有, 觸發(fā)順序, 先捕獲, 后冒泡

focus(鼠標聚焦), blur(鼠標失去焦點), change, submit, reset, select等事件不冒泡


取消冒泡和阻止默認事件

取消冒泡:

  • W3C標準event.stopPropagation( );但不支持ie9以下版本
    eg:
var div = document.getElementsBYTagName('div')[0];
div.onClick = function() {
    console.log('a');
    e.stopPropagation();
}
  • IE獨有event.cancelBubble = true;
  • 封裝取消冒泡的函數(shù)

阻止默認事件:

  • 默認事件---表單提交, a標簽跳轉(zhuǎn), 右鍵菜單等.
  • return flase; 以對象屬性的方式注冊的事件才生效
  • event.preventDefault( ); W3C標準, IE9以下不兼容
  • event.returnValue = false; 兼容IE
  • 封裝阻止默認事件的函數(shù)cancelHandler(event);

事件對象

  • event || window.event 用于IE
    eg:
div.onclick  = function(e) {
    var event = e || window.event;
}
  • 事件源對象
    • event.target 火狐只有這個
    • event.srcElement IE只有這個
      eg1:在HTML中有100個li, 要求點擊任意li, 打印出li中的內(nèi)容


      這里寫圖片描述

注意:又稱事件委托!!!!!!!!!

eg2:

var wrapper = document.getElementsByClassName('wrapper')[0];
var content = document.getElementsByClassName('content')[0];
wrapper.onClick = function(e) {
    var event = e || window.event;
    var target = event.target || event.srcElement//獲取事件源對象, 就是找到吹泡泡的人
}

  • 以上chrome都有
最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容