js下DOM 事件的一些方法

事件的綁定和解綁

//綁定事件
document.onclick=function () {
        alert(1);
    }
//解除事件
document.onclick=null;

這是最常用的為對象綁定事件的方法。但是只能給一個對象綁定一個相同時間,想綁定第二個會覆蓋。在Js中提供了一些方法讓我們可以給一個對象進行多次綁定。

/**obj. addEventListener("click",fun(){},false)
*    添加事件
*    不兼容IE678;
*           事件名稱不帶on
*           第二個是事件函數(shù)
*           事件捕獲。默認false
*obj.removeEventListener("click",fn2);
*    事件解綁
*/
document.addEventListener("click",fn1);
document.addEventListener("click",fn2);
document.removeEventListener("click",fn2);
// 解綁前,彈出1,彈出2;
//解綁后,彈出1。
function fn1() {
    alert(1)
}
function fn2() {
    alert(2)
}
/*obj.attachEvent("onclick",fun{})   
*     兼容IE678
*     只接收倆參數(shù)
*        第一個是事件名稱,是帶on的事件名字
*        第二個是事件函數(shù)。
*
*obj.detachEvent("onclick",fn)
*     事件解綁
*      fn可以使匿名函數(shù),但需和綁定的匿名函數(shù)完全一致,包括空格
*
**/
document.attachEvent("onclick",function () {
        alert(1)
});
document.attachEvent("onclick",fn);
document.detachEvent("onclick",fn);
//解綁前,彈出2,彈出1
//解綁后,彈出1
function fn() {
    alert(2)
}

我們可以發(fā)現(xiàn)attachEvent方法和addEventListener的執(zhí)行順序是相反的。
下面提供一種兼容寫法,僅供參考

//添加事件
function addEvent(obj,eName,eFn) {
    if(obj.attachEvent){ //判斷支不支持attacgevent方法,如果支持就是ie678
        obj.attachEvent("on"+eName,eFn) //兼容IE678
    }else{
        obj.addEventListener(eName,eFn)//兼容標準瀏覽器
    }
}
//移除事件
function removeEvent(obj,eName,eFn) {
    if(obj.attachEvent){ //判斷支不支持attacgevent方法,如果支持就是ie678
        obj.detachEvent("on"+eName,eFn) //兼容IE678
    }else{
        obj.removeEventListener(eName,eFn)//兼容標準瀏覽器
    }
}

但是這并不能解決執(zhí)行順序不同的問題,不過在使用中影響不大。

事件捕獲

在上面我們提到addEventListener方法的第三個參數(shù)為事件捕獲,默認為false?,F(xiàn)在我們來了解一下事件捕獲。

<div id="box1">1
    <div id="box2">2
        <div>
            <div id="box3">3</div>
        </div>
    </div>
</div>
<script>

    /*
    *   事件捕獲
    *       事件在傳遞的時候會有一個觸發(fā)的順序
    *       false:從里到外,true:從外到內(nèi)
    *       同時屬性為true的事件會先于false執(zhí)行
    *       只有在標準瀏覽器下才有這個概念
    *
    * */

    box1.addEventListener("click",fn1,false)
    box2.addEventListener("click",fn2,false)
    box3.addEventListener("click",fn3,false)

    function fn1() {
        console.log(1)
    }
    function fn2() {
        console.log(2)
    }
    function fn3() {
        console.log(3)
    }
//點擊box3
// 3 2 1
// 若都設(shè)置為true 1 2 3 
</script>

事件冒泡

我們在講事件捕獲的時候可以發(fā)現(xiàn)一件很有趣事情就是,我只是點擊了最里面的盒子,但是包裹該盒子的大盒子的事件也被觸發(fā)了,這就是事件冒泡了。
那這是為什么呢?仔細想想不難發(fā)現(xiàn),雖然我們點擊的是一個小盒子。但是因為小盒子在大盒子內(nèi),點擊小盒子的同時,我們也點擊了大盒子。所以會觸發(fā)大盒子的事件。
但是很多時候我們并不希望如此,所以我們有必要來清除事件冒泡。

<div id="box1">1
    <div id="box2">2
        <div>
            <div id="box3">3</div>
        </div>
    </div>
</div>
<script>

   /*
    *   事件冒泡
    *       事件會從自己身上往上傳遞
    *
    *   阻止冒泡
    *       e.cancelBubble = true;
    *       事件源
    *
    * */

    box1.onclick=function (e) {
        e=e||window.event;
        e.cancelBubble = true;
        console.log(1)
    }
    box2.onclick=function (e) {
        e=e||window.event;
        e.cancelBubble = true;
        console.log(1)
    }
    box3.onclick=function (e) {
        e=e||window.event;
        e.cancelBubble = true;
        console.log(3)
    }
    //點擊box3    3
    //點擊box2    2
    //點擊box1    1
</script>

清除默認事件

js中帶有一些默認事件。例如我們對文本進行操作時,默認存在選中事件。在必要的時候我們可以去掉我們不想要的默認事件。

   /*
    *      e.preventDefault()
    *           清除默認事件
    *           不兼容IE678
    *      e.returnValue=false; 
    *           只支持IE678
    *       return false
    *           也可以清除默認事件
    *    obj.事件=function (e) {
    *        e = e||window.event;
    *        e.returnValue = false;
    *        //e.preventDefault();
    *        //return false;
    *    }
    *    //根據(jù)實際情況選擇
    * */
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

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

  • 1. 事件冒泡與事件捕獲 事件冒泡和事件捕獲分別由微軟和網(wǎng)景公司提出,這兩個概念都是為了解決頁面中事件流(事件發(fā)生...
    cbw100閱讀 2,804評論 0 8
  • 以下文章為轉(zhuǎn)載,對理解JavaScript中的事件處理機制很有幫助,淺顯易懂,特分享于此。 什么是事件? 事件(E...
    jxyjxy閱讀 3,166評論 1 10
  • 事件綁定的方式 給 DOM 元素綁定事件分為兩大類:在 html 中直接綁定 和 在 JavaScript 中綁定...
    Bruce_zhuan閱讀 1,129評論 0 6
  • 什么是事件: 我們可以簡單的把事件理解為瀏覽器的感知系統(tǒng)。比如說:他可以感覺到用戶是否點擊(click)了頁面、鼠...
    張松1366閱讀 6,998評論 1 6
  • 如果有人莫名其妙的罵你是豬,估計你會很不開心。因為豬這個字一般用來形容腦子像豬一樣笨,或者體型像豬一樣胖,反正不是...
    好聽的暖陽閱讀 339評論 0 0

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