Javascript事件觸發順序


html標簽是有子和父的,這個時候就出現了事件觸發順序的問題,比如:

<!DOCTYPE html>
<html>
<head>
<style>
.first{
border:solid #FF0000
}
.second{
border:solid #00FF00
}
.third{
border:solid #0000FF
}
</style>
<script src="http://libs.baidu.com/jquery/1.10.2/jquery.min.js">
</script>
<script>
$(document).ready(function(){
  $(".first").click(function(){
    alert(0);
  });
  $(".second").click(function(){
    alert(1);
  });
  $(".third").click(function(){
    alert(2);
  });
});
</script>
</head>
<body>

<div class="first">
testFirst
<div class="second">
testSecond
<div class="third">
testThird
</div>
</div>
</div>

</body>
</html>    

默認情況下,點third,三個事件都會觸發,觸發順序為3,2,1.這種方式叫做冒泡觸發。

一、使用javascript設置觸發方式

可以使用javascript:DOM.addEventListener()方法添加時設置

element.addEventListener(event, function, useCapture);第三個參數為boolean,false的時候冒泡觸發(默認值,從最下級的事件開始觸發),true的時候為捕獲觸發(從最上級元素的時間開始觸發)。

事件傳遞有兩種方式:冒泡與捕獲。

事件傳遞定義了元素事件觸發的順序。 如果你將 <p> 元素插入到 <div> 元素中,用戶點擊 <p> 元素, 哪個元素的 "click" 事件先被觸發呢?

在 冒泡 中,內部元素的事件會先被觸發,然后再觸發外部元素,即: <p> 元素的點擊事件先觸發,然后會觸發 <div> 元素的點擊事件。

在 捕獲 中,外部元素的事件會先被觸發,然后才會觸發內部元素的事件,即: <div> 元素的點擊事件先觸發 ,然后再觸發 <p> 元素的點擊事件。

 

二、使用jQuery設置事件觸發方式

1、調用$(selector).on(event,childSelector,data,function,map)綁定時間,可以設置childSelector,意思是只為子元素中的一部分綁定該事件,可以篩選出一部分來綁定,也可以達到效果。

2、$("#hr_three").click(function(event){ 
    return false; 
  }); 

  傳入參數event,return false,為阻止后續包括默認點擊事件和冒泡事件的所有事件,但不阻止綁定在該元素上的其他事件。

  這里注意一下,如果是直接onclick方法中return false,則不能阻止事件冒泡,只能阻止默認事件。

3、event.stopPropagation(); 

事件處理過程中,阻止了事件冒泡,但不會阻擊默認行為(如執行了超鏈接的跳轉),也不阻止綁定在該元素上的其他事件。

4、event.preventDefault();

事件處理過程中,不阻擊事件冒泡,不阻止綁定在該元素上的其他事件,但阻擊默認行為(它只執行所有彈框,卻沒有執行超鏈接跳轉)

5、event.stopImmediatePropagation()

阻止其他事件處理程序被調用,阻止該元素的次優先級程序及所有冒泡事件,但不阻止默認行為。

6、上面

事件目標:純javascript屬性event.target
    事件粗粒程序的變量event保存着事件對象。而event.target屬性保存着發生事件的目標元素。這個屬性DOM API中規定的,但是沒有被所有瀏覽器實現。jQuery對這個事件對象進行了必要的擴展,從而在任何瀏覽器中都能夠使用這個屬性。通過.target,可以確定DOM中首先接收到事件的元素(即被實際單擊的元素)。而且,我們知道this應用的是處理事件的DOM元素,所以可以編寫下列代碼:
    $(document).ready(function(){
    $(‘#switcher’).click(function(event){
    if(event.target == this){
        $(‘#switcher .button’).toggleClass(‘hidden‘);
}
});
});
此時的代碼確保了被單擊的元素是<div id=”switcher”>,而不是其它后代元素。

XML DOM target 事件屬性
定義和用法
target 事件屬性可返回事件的目標節點(觸發該事件的節點),如生成事件的元素、文檔或窗口。
語法
event.target

模仿事件操作

返回值:jQuery            trigger(type, [data])

在每一個匹配的元素上觸發某類事件。

這個函數也會導致瀏覽器同名的默認行為的執行(除了a標簽的跳轉事件)。比如,如果用trigger()觸發一個'submit',則同樣會導致瀏覽器提交表單。如果要阻止這種默認行為,應返回false。

參數

typeString,Event,Object

一個事件對象或者要觸發的事件類型

data (可選)Array

(可選)傳遞給事件處理函數的附加參數

示例

描述:

提交第一個表單,但不用submit()

jQuery 代碼:

$("form:first").trigger("submit")

描述:

給一個事件傳遞參數(click()同樣觸發默認事件)

jQuery 代碼:

$("p").click(function (event, a, b) {

  // 一個普通的點擊事件時,a和b是undefined類型

  // 如果用下面的語句觸發,那么a指向"foo",而b指向"bar"

}).trigger("click", ["foo", "bar"]);

描述:

下面的代碼可以顯示一個"Hello World"

jQuery 代碼:

$("p").bind("myEvent",function (event, message1, message2) {

  alert(message1 + ' ' + message2);

});

$("p").trigger("myEvent",["Hello","World!"]);

 

三、unbind,off(推薦)用於解除綁定事件,但是解除不了標簽中的onclick屬性事件和默認點擊事件,要取消,則要返回false。

且unbind與off是可以使用事件觸發傳入的event對象來取消時間綁定,用於觸發多少次就不再觸發(若想觸發一次不再觸發,則可使用one()來綁定事件)

$(document).ready(function(){
  var x=0;
  $("p").click(function(event){
    $("p").animate({fontSize:"+=5px"});
    x++;
    if (x>=2)
      {
      $(this).unbind(event);
      }
  });
});

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM