為jQuery添加自訂事件機制

來源:互聯網
上載者:User
關鍵字: jquery 外掛程式 自訂事件機制

    之前一直做flex,現在來做js,覺得js的事件機制不是很好用,參考flex的事件機製為jQuery開發一個外掛程式,即自訂事件。 利用這個外掛程式,jQuery對象能夠派發自訂的事件,而父級的對象能夠對此事件進行監聽,對事件的處理依次分為捕獲,目標,冒泡三個階段。

    捕獲:從根結點出發,到派發事件的目標對象,如果註冊了監聽,即會執行監聽函數。預設時,不開啟捕獲

    目標:發出事件的目標對象,如果註冊了監聽,即會執行監聽函數

    冒泡:捕獲的反過程,即從目標對象出發,依次調用父級對象的監聽函數。預設時,開啟冒泡

 

給個例子:

Html代碼
  1. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">  
  2. <html>  
  3.     <head>  
  4.         <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />  
  5.         <title>text jquery.jevent.js</title>  
  6.         <script type="text/javascript" src="jquery-1.2.6.js"></script>  
  7.         <script type="text/javascript" src="jquery.jevent.js"></script>  
  8.         <script type="text/javascript" >  
  9.             var str1 = "Click1";   
  10.             var str2 = "Click2";   
  11.             $(document).ready(function(){   
  12.                           $("#div1").  addJEventListener(str1,  function(data,str){alert("div1"+"@"+data.msg+"@"+str);},true);   
  13.                           $("#div11").addJEventListener(str1,   function(data,str){alert("div11"+"@"+data.msg+"@"+str);},true);   
  14.                           $("#div2").  addJEventListener(str2,           function(data,str){alert("div2"+"@"+data.msg+"@"+str);},true);   
  15.                           $("#div21").addJEventListener(str2,           function(data,str){alert("div21"+"@"+data.msg+"@"+str);});   
  16.                           $("#button1").addJEventListener(str1,       function(data,str){alert("button1"+"@"+data.msg+"@"+str);});   
  17.                           $("#button2").addJEventListener(str2,       function(data,str){alert("button2"+"@"+data.msg+"@"+str);},true);   
  18.                           $("#button1").click(function(){   
  19.                              $(this).dispatchJEvent(str1,{msg:"msg from button1"});   
  20.                           });   
  21.                          $("#button2").click(function(){   
  22.                                 $(this).dispatchJEvent(str2,{msg:"msg from button2"});   
  23.                          });                   
  24.                    });   
  25.         </script>  
  26.     </head>  
  27.     <body>  
  28.            
  29.       <div id="div1">  
  30.        <div id="div11">  
  31.         <img id="img1" src="pic3.jpg" width="140" height="140"/>  
  32.         <input type="button" id="button1" value="click Me 1!"/>  
  33.        </div>  
  34.       </div>  
  35.          
  36.        <div id="div2">  
  37.        <div id="div21">  
  38.         <img id="img2" src="pic5.jpg" width="140" height="140"/>  
  39.         <input type="button" id="button2" value="click Me 2!"/>  
  40.        </div>  
  41.       </div>  
  42.          
  43.     </body>  
  44. </html>  

 

這個例子中,各級結點都通過addJEventListener()分別註冊了對"Click1"或"Click2"事件的監聽,而點擊button1時,會通過dispatchJEvent()派發事件,例子可以從附件中下載 。如點擊button1時,依次alert的結果為:

 

div1@msg from button1@capture         //div1在捕獲click1事件

div11@msg from button1@caputre       //div11在捕獲click1事件

button1@msg from button1@target     //目標對象button1執行監聽函數

div11@msg from button1@bubble        //div11在冒泡過程中執行監聽函數

div1@msg from button1@bubble          //div1的冒泡過程中執行監聽函數

 

可見先嚴格地執行了上面提到的處理事件的步驟。

 

細節部分:

1、當事件被派發時,只有目標對象的父級對象能夠得到處理事件的機會,如將上面的div2同樣也註冊對"Click1"的監聽,便不會被調用,因為div2並不是button1的父級對象。

2、對象在註冊對某一事件的監聽時,可以選擇是否找開捕獲或冒泡,如果開啟捕獲,則在事件處理的捕獲時即會執行監聽函數,預設時捕獲不開啟,冒泡開啟。

3、同一對象可以對某一事件多次註冊監聽,當然也可以刪除對事件的監聽

 

對外掛程式提拱的擴充介紹如下:

1、dispatchJEvent: function(name,data,capture,bubble)

    jQuery對象通過此函數來派發事件,

    name是事件的標識,為一個字串,

    data為事件所攜帶的資訊,該資訊會做為參數傳遞給監聽函數,如上例 中button1的data為{msg:"msg from button1"},

    capture指示對該事件的處理是否開啟捕獲過程,預設為true,

    bubble指示對該事件的處理是否開啟冒泡過程,預設為true.

2、addJEventListener:function(name,func,capture,bubble);

   jQuery對象可以通過此函數來註冊對事件的監聽,

   name仍是事件的標識,表示註冊的是對哪個事件的監聽,

   capture表示該監聽是否參與事件處理的捕獲過程,預設為false

   bubble表示是否參與事件處理的冒泡過程,預設為true,

   func為所註冊的監聽函數,func定義的格式為 function(data,state) {},data即為事件派發時的參數,state代表此時處理過程位於哪個階段,是"capture","target"不是"bubble".

3、removeJEventListener:function(name,func);刪除對已經註冊的監聽

4、hasJEventListener:function(name);判斷是否已經註冊了對某一事件的監聽

 

有了這個外掛程式,應該可以提高jQuery的開發速度了。發上來與大家分享,期待大家的寶貴意見!

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.