JavaScript基礎-----事件冒泡和阻止

1.事件冒泡:

   假設一個html結構中兩個標籤存在父子層級關係,父盒子和子盒子都綁定同一個事件的方法;當點擊子盒子時會執行兩次方法,也就是將父盒子的事件方法也執行了,也就是由裏向外依次執行,這就是所謂的事件冒泡(從裏向外進行傳播);摘自原作者的例子:

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>事件冒泡</title>
<style>
    .one{
        width:400px;
        height:100px;
        border:1px solid #333;
    }
    .two{
        height:35px;
        line-height:35px;
        padding-left:15px;
        border:1px solid red;
    }
    .three{
        padding:10px;
        background-color: green;
        border:1px solid #999;
        cursor:pointer;
    }
</style>
<script src = "http://code.jquery.com/jquery-1.11.2.min.js"></script>
<script>
    $(function(){
        $(".one").click(function(event) {
            alert($(this).text());
        });
        $(".two").click(function(event) {
            alert($(this).text());
        });
        $(".three").click(function(event) {
            alert($(this).text());
        });
    });
</script>
</head>
<body>
    <div class="one">
        我是one(div)
        <p class="two">
            我是two(p)
            <span class="three">我是three(span)</span>
        </p>
    </div>
</body>
</html>

    當在span,p,div元素上個綁定一個click事件時,點擊span元素時,會依次向上觸發這三個事件,當然這不是想要的結果,所以就要進行阻止事件冒泡;

2.事件捕獲:

    事件捕獲和事件冒泡正好相反,它會從外向裏依次執行

3.事件冒泡和事件捕獲的切換:

    使用addEventListener(事件監聽)方法

element.addEventListener(event, function, useCapture)

    它有三個參數,(事件類型,處理函數,boolean值(可選));

    第三個參數默認值爲false,表示在事件冒泡階段調用事件處理函數;如果參數爲true,則表示在事件捕獲階段調用處理函數;

4.阻止事件冒泡:

    (1)DOM中提供stopPropagation()方法,但IE不支持,使用event對象在事件函數調用;

    (2)IE中提供的是cancelBubble屬性,默認爲false,當設置爲true時,就是阻止事件冒泡,也是用event對象在事件函數中調用;

  (3)jQuery中提供了stopPropagation()方法來停止事件冒泡,當需要時,只需用event對象來調用就行,即event.stopPropagtion();

//封裝阻止事件冒泡函數
function stopPropagation(event){
    var event = window.event || event;
    if(document.all){              //document.all:判斷瀏覽器是否爲IE
        event.cancelBubble = true   //IE瀏覽器
     }else{
        event.stoopPropagation();      //其他瀏覽器  
     }
}        

5.默認行爲:

    即瀏覽器的一些默認行爲,例如:點擊超鏈接跳轉,點擊右鍵會彈出菜單,滑動滾輪控制滾動條等等;

6.阻止默認行爲:

    (1)DOM中提供preventDefault()方法來取消事件默認行爲,但是隻有當cancelable屬性設置爲true的事件,纔可以使用preventDefault()來取消事件默認行爲,使用event對象在函數中調用;

    (2)IE中提供的是returnValue屬性,默認爲true,當它設置爲false時,就是取消事件默認行爲,也是用event對象在事件函數中調用;

  (3)jQuery中提供了preventDefault()犯法來阻止元素的默認行爲,只需要用event對象來調用就好,即event.preventDefault();

    (4)對於 a 鏈接,可以使用JavaScript僞協議來阻止默認行爲,也就是:<a href="JavaScript:void(0)"></a>

    (5)還有一種簡寫寫法,就是同時阻止事件冒泡和事件默認行爲;就是直接返回一個false(return:false)

//封裝阻止事件默認行爲函數
function preventDefaultActiion(event){
    var event = window.event || event;
    if(document.all){
        event.returnValue = false;       //IE;瀏覽器
    }else{
        event.preventDefault();         //其他瀏覽器
    }
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章