[07]EXTJS4.0的事件機制Event

 1.事件的3種綁定方式

    HTML/DHTML
    DOM
    EXTJS
2.Ext.util.Observable 事件的基類
    它爲所有支持事件機制的extjs組件提供事件的支持
    如果我們自己創建新的組件需要有事件的支持那麼我們就繼承它
    事件的分類
       標準事件[鍵盤按鈕按下,鼠標的單擊雙擊,滑過滑動]
       業務事件[當面板收起的時候觸發,當組件被銷燬的時候觸發,當每一個對象的屬性值不爲空的時候觸發]
     一個自定義事件的例子
           沒有用到事件處理的場景
               母親問孩子餓不餓--->
                               <----孩子
                                    餓了-->給一瓶牛奶
                                    不餓-->不給
           用了事件的場景
               母親給孩子一瓶牛奶-->
                                   孩子拿到牛奶感覺餓了就喝
                                   感覺不餓就不喝
           角色功能分析:
                  孩子:應該有自己能拿到牛奶判斷餓不餓的方法,當母親給他牛奶的時候調用這個方法。
                  那麼孩子就要有一個業務事件時刻監聽母親什麼時候給自己牛奶
                  母親:調用孩子拿牛奶的方法,並且傳入一瓶牛奶
3.addManagedListener 收管制的監聽
      它是由調用的組件管理的,當組件執行了銷燬命令的時候所有被組件管制的事件全部銷燬
4.relayEvents 事件的分發和傳播(控制實現事件在不同控件或對象的傳播)
   比如孩子喝完三鹿就去醫院,老爸就要帶着去醫院
5.事件對象Ext.EventObject
   不是一個單例,不能被直接new出來,它會存活在事件處理函數中
6.事件管理器Ext.EventManager
   它可以更方便地爲頁面元素綁定事件處理函數
   方法:addListener 爲元素增減事件
---------------------------------------------------------------------------------------
這個例子主要講第一種事件綁定方式
lesson7.html
  1. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> 
  2. <html> 
  3. <head> 
  4. <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 
  5. <title>事件</title> 
  6. <link rel="stylesheet" type="text/css" href="../extjs-4.1.0/resources/css/ext-all.css"/> 
  7. <script type="text/javascript" src="../extjs-4.1.0/bootstrap.js"></script> 
  8. <script type="text/javascript"> 
  9. function hello(){ 
  10.     console.log('hello world'); 
  11. </script> 
  12. </head> 
  13. <body> 
  14. <input type="button" id="btn1" value="第一種事件綁定方式" onClick="hello()"/> 
  15. </body> 
  16. </html> 

運行結果如下(點擊界面的按鈕之後):
 
hello world
---------------------------------------------------------------------------------------
這個例子主要講IE下的事件綁定方式
evemntBinding.js
  1. (function(){ 
  2.     Ext.onReady(function(){ 
  3.     document.getElementById("btn1").attachEvent("onclick",function(){ 
  4.        alert("第二種事件綁定方式"); 
  5.         }); 
  6.     }); 
  7. })(); 
lesson7_2.html

 

  1. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> 
  2. <html> 
  3. <head> 
  4. <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 
  5. <title>事件</title> 
  6. <link rel="stylesheet" type="text/css" href="../extjs-4.1.0/resources/css/ext-all.css"/> 
  7. <script type="text/javascript" src="../extjs-4.1.0/bootstrap.js"></script> 
  8. <script type="text/javascript" src="evemntBinding.js"></script> 
  9. </head> 
  10. <body> 
  11. <input type="button" id="btn1" name="btn1" value="第二種事件綁定方式"/> 
  12. </body> 
  13. </html> 
運行結果如下:
彈出:“第二種事件綁定方式“
------------------------------------------------------------------------------------
這個例子主要講FIREFORX,chrome下的事件綁定方式
evemntBinding2.js
 
  1. (function(){ 
  2.     Ext.onReady(function(){ 
  3.     document.getElementById("btn1").addEventListener("click",function(){ 
  4.        console.log("第二種事件綁定方式"); 
  5.         }); 
  6.     }); 
  7. })(); 
lesson7_3.html
 
  1. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> 
  2. <html> 
  3. <head> 
  4. <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 
  5. <title>事件</title> 
  6. <link rel="stylesheet" type="text/css" href="../extjs-4.1.0/resources/css/ext-all.css"/> 
  7. <script type="text/javascript" src="../extjs-4.1.0/bootstrap.js"></script> 
  8. <script type="text/javascript" src="evemntBinding2.js"></script> 
  9. </head> 
  10. <body> 
  11. <input type="button" id="btn1" name="btn1" value="第二種事件綁定方式"/> 
  12. </body> 
  13. </html> 
運行結果如下:
 
第二種事件綁定方式
-------------------------------------------------------------------------------------
這個例子主要講Ext.isIE
evemntBinding3.js
 

 

  1. (function(){ 
  2.     Ext.onReady(function(){ 
  3.         if(!Ext.isIE){ 
  4.         document.getElementById("btn1").addEventListener("click",function(){ 
  5.            console.log("第二種事件綁定方式"); 
  6.             }); 
  7.         }else
  8.         document.getElementById("btn1").attachEvent("onclick",function(){ 
  9.         alert("第二種事件綁定方式"); 
  10.             }); 
  11.         } 
  12.     }); 
  13. })(); 
lesson7_3.html
 
  1. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> 
  2. <html> 
  3. <head> 
  4. <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 
  5. <title>事件</title> 
  6. <link rel="stylesheet" type="text/css" href="../extjs-4.1.0/resources/css/ext-all.css"/> 
  7. <script type="text/javascript" src="../extjs-4.1.0/bootstrap.js"></script> 
  8. <script type="text/javascript" src="evemntBinding3.js"></script> 
  9. </head> 
  10. <body> 
  11. <input type="button" id="btn1" name="btn1" value="第二種事件綁定方式"/> 
  12. </body> 
  13. </html> 
運行結果如下:
 
第二種事件綁定方式
---------------------------------------------------------------------------------------這個例子主要講第三中綁定事件的方式
evemntBinding4.js
  1. (function(){ 
  2.     Ext.onReady(function(){ 
  3.     Ext.get('btn1').on("click",function(){ 
  4.       alert("第三種事件綁定方式"); 
  5.         }); 
  6.     }); 
  7. })(); 
lesson7_4.html
  1. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> 
  2. <html> 
  3. <head> 
  4. <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 
  5. <title>事件</title> 
  6. <link rel="stylesheet" type="text/css" href="../extjs-4.1.0/resources/css/ext-all.css"/> 
  7. <script type="text/javascript" src="../extjs-4.1.0/bootstrap.js"></script> 
  8. <script type="text/javascript" src="evemntBinding4.js"></script> 
  9. </head> 
  10. <body> 
  11. <input type="button" id="btn1" name="btn1" value="第三種事件綁定方式"/> 
  12. </body> 
  13. </html> 
運行結果:
彈出如下內容:
第三種事件綁定方式
-----------------------------------------------------------------------------------
這個例子主要講Ext.util.Observable和其中的addListener和fireEvent
customEvent.js
  1. (function(){ 
  2.     Ext.onReady(function(){ 
  3.     Ext.define("children",{ 
  4.         extend:'Ext.util.Observable'
  5.             constructor:function(){ 
  6.          this.callParent(arguments);//課程中沒有這句話,如果沒有的話是會報錯誤
  7.          this.state = "hungry",//目前所屬的狀態 hungry full 
  8.              this.setMilk = function(milk){ 
  9.             this.fireEvent('hungry',milk); 
  10.               }, 
  11.              this.addListener("hungry",function(milk){ 
  12.             if(this.state == 'hungry'){ 
  13.                this.drink(milk); 
  14.             }else
  15.                console.log("我不餓"); 
  16.            } 
  17.             }), 
  18.                 this.drink = function(milk){ 
  19.            console.log("我喝掉了一瓶牛奶: " + milk); 
  20.                 } 
  21.             } 
  22.         }); 
  23.         var children = Ext.create("children",{}); 
  24.        //母親調用孩子的接受牛奶的方法 
  25.      children.setMilk('三鹿牛奶'); 
  26.     }); 
  27.     /** 
  28.      * 爲對象添加一個事件addEvents-->事件的監聽方式註冊這個事件addListener-->觸發這個事件的動作fireEvent 
  29.      */ 
  30. })(); 
運行結果如下:
 
我喝掉了一瓶牛奶: 三鹿牛奶
-----------------------------------------------------------------------------
這個例子主要講Ext.util.Observable.capture方法,即事件的捕獲,攔截掉孩子對這個事件的執行
customEvent2.js
  1. (function(){ 
  2.     Ext.onReady(function(){ 
  3.     Ext.define("children",{ 
  4.         extend:'Ext.util.Observable'
  5.             constructor:function(){ 
  6.          this.callParent(arguments);//課程中沒有這句話,如果沒有的話是會報錯誤: 
  7.          this.state = "hungry",//目前所屬的狀態 hungry full 
  8.                this.setMilk = function(milk){ 
  9.             this.fireEvent('hungry',milk); 
  10.                 }, 
  11.              this.addListener("hungry",function(milk){ 
  12.             if(this.state == 'hungry'){ 
  13.                this.drink(milk); 
  14.             }else
  15.                console.log("我不餓"); 
  16.            } 
  17.             }), 
  18.                 this.drink = function(milk){ 
  19.            console.log("我喝掉了一瓶牛奶: " + milk); 
  20.                 } 
  21.             } 
  22.         }); 
  23.         var children = Ext.create("children",{});//本對象是牛奶過敏的對象 
  24.         Ext.util.Observable.capture(children,function(eventName){ 
  25.         if(eventName == "hungry"){ 
  26.            console.log("這個孩子牛奶過敏不能喝牛奶..."); 
  27.                return false
  28.         }else
  29.            return true
  30.         } 
  31.     }); 
  32.       //母親調用孩子的接受牛奶的方法 
  33.     children.setMilk('三鹿牛奶'); 
  34.     }); 
  35. })(); 
運行結果如下:
 
這個孩子牛奶過敏不能喝牛奶...
-------------------------------------------------------------------------------------
這個例子主要講事件分發relayEvents
relayEvent.js
  1. (function(){ 
  2.     Ext.onReady(function(){ 
  3.      Ext.define("children",{ 
  4.         extend:'Ext.util.Observable'
  5.             constructor:function(){ 
  6.          this.callParent(arguments);//課程中沒有這句話,如果沒有的話是會報錯誤: 
  7.          this.state = "hungry",//目前所屬的狀態 hungry full 
  8.                this.setMilk = function(milk){ 
  9.             this.fireEvent('hungry',milk); 
  10.                 }, 
  11.              this.addListener("hungry",function(milk){ 
  12.             if(this.state == 'hungry'){ 
  13.                this.drink(milk); 
  14.             }else
  15.                console.log("我不餓"); 
  16.            } 
  17.              }), 
  18.              this.drink = function(milk){ 
  19.            console.log("我喝掉了一瓶牛奶: " + milk); 
  20.              } 
  21.          } 
  22.      }); 
  23.         var children = Ext.create("children",{}); 
  24.          
  25.         //父類沒有聲明過任何監聽事件 
  26.         Ext.define("father",{ 
  27.         extend:'Ext.util.Observable'
  28.            constructor:function(config){ 
  29.          this.listeners = config.listeners; 
  30.                 this.superclass.constructor.call(this,config); 
  31.            } 
  32.          }); 
  33.          var father = Ext.create("father",{}); 
  34.       father.relayEvents(children,['hungry']);//事件從孩子這端執行完就留到父親 
  35.          father.on("hungry",function(){ 
  36.         console.log("送喝了三鹿的孩子去醫院..");  
  37.          }); 
  38.          var father = Ext.create("father",{}); 
  39.        //母親調用孩子的接受牛奶的方法 
  40.      children.setMilk('三鹿牛奶'); 
  41.     }); 
  42. })(); 
運行結果:
 

我喝掉了一瓶牛奶: 三鹿牛奶

 

送喝了三鹿的孩子去醫院..

 

------------------------------------------------------------------------------
這個例子主要講addManagedListener
manageListener.js
  1. (function(){ 
  2.     Ext.onReady(function(){ 
  3.     var tbar = Ext.create("Ext.toolbar.Toolbar",{ 
  4.         renderTo:Ext.getBody(), 
  5.             width:500, 
  6.             items:[ 
  7.          {xtype:'button',id:'create',text:'create'}, 
  8.          {xtype:'button',id:'delete',text:'delete'}, 
  9.          {xtype:'button',text:'銷燬刪除按鈕',handler:function(){ 
  10.             var c = Ext.getCmp("delete");//不是頁面上的元素的按鈕 
  11.                     if(c){ 
  12.                        c.destroy(); 
  13.                     } 
  14.          }} 
  15.             ] 
  16.     }); 
  17.         var deleteB = Ext.getCmp("delete"); 
  18.         //刪除了delete按鈕之後,create按鈕的事件也刪除了 
  19.         deleteB.addManagedListener(Ext.getCmp("create"),'click',function(){ 
  20.          console.log("添加操作"); 
  21.         }); 
  22.      }); 
  23. })(); 
-------------------------------------------------------------------------------------
這個例子主要講事件對象
EventObject.js
  1. Ext.onReady(function(){ 
  2.    var b = Ext.get("btn");//Ext.get獲取DOM中元素 
  3.    b.on("click",function(e){ 
  4.        console.log(e); 
  5.        console.log(e.getPageX()); 
  6.     }); 
  7. }); 
lesson7EventObject.html
  1. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> 
  2. <html> 
  3. <head> 
  4. <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 
  5. <title>事件</title> 
  6. <link rel="stylesheet" type="text/css" href="../extjs-4.1.0/resources/css/ext-all.css"/> 
  7. <script type="text/javascript" src="../extjs-4.1.0/bootstrap.js"></script> 
  8. <script type="text/javascript" src="EventObject.js"></script> 
  9. </head> 
  10. <body> 
  11. <input type="button" id="btn" value="按鈕"/> 
  12. </body> 
  13. </html> 
運行結果如下:
 

constructor {browserEvent: MouseEvent, type: "click", button: 0, shiftKey: false, ctrlKey: false…}

1

 
------------------------------------------------------------------------------
這個例子主要講Ext.EventManager.addListener
eventmanager.js
  1. Ext.onReady(function(){ 
  2.     Ext.EventManager.addListener("btn",'click',function(){ 
  3.     console.log("通過事件管理器進行事件的監聽註冊"); 
  4.     }); 
  5.      
  6. }); 
lesson7EventManager.html
  1. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> 
  2. <html> 
  3. <head> 
  4. <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 
  5. <title>事件</title> 
  6. <link rel="stylesheet" type="text/css" href="../extjs-4.1.0/resources/css/ext-all.css"/> 
  7. <script type="text/javascript" src="../extjs-4.1.0/bootstrap.js"></script> 
  8. <script type="text/javascript" src="eventmanager.js"></script> 
  9. </head> 
  10. <body> 
  11. <input type="button" id="btn" value="按鈕"/> 
  12. </body> 
  13. </html> 
運行結果:
 
通過事件管理器進行事件的監聽註冊
111111

 

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