JavaScript:事件綁定與監聽


事件綁定與監聽


       事件是JavaScript應用程序的核心,是所有內容的驅動。

  • 事件的綁定與解綁

       事件的實現在主流瀏覽器之間存在較大差異,但是瞭解事件的機制仍然非常重要,以W3C中的事件模型作爲研究對象。

      1.  事件監聽的綁定函數:

           函數簽名:addEventListener(eventType, callback, useCapture)

           參數說明:eventType:事件類型,例如:click、blur等

                             callback:事件被觸發時執行這個函數

                             useCapture:事件傳播機制:如果爲true時,事件處理程序以捕捉(capturing)模式觸發,反之,事件處理

                                                   以冒泡模式觸發,可以使用event對象中的stopPropagation()函數終止冒泡。

            通過調用event對象的preventDefault()函數來阻止默認行爲,同樣也可以通過在回調中返回false來實現同樣的效果。

      2.事件監聽的解綁函數:

            函數簽名:removeEventListener(eventType, callbackListenerl)

            參數說明:eventType:移除事件的類型,例如:click、blur等;如果監聽的函數是匿名函數,沒有任何引用指向它,在

                               不銷燬目標元素的前提下,這個監聽是無法被移除的。

事件庫

              處理衆多瀏覽器的差異性需要藉助第三方JavaScript類庫來支持,例如:jQuery、MooTools、YUI等。
          jQuery的API提供了bind()函數來跨瀏覽器綁定事件監聽,傳人事件名稱和回調函數,例如:
      jQuery('#elementId').bind(eventName, handler);還提供了快捷方式:jQuery('#elementId').click(callback);
      需要保證DOM元素存在並被已被加載。
            

切換上下文

             new function(){
                 this.appName = 'ucfpay';
                 document.body.addEventListener('click', function(event){
                    // 上下文發生改變,因此appName是undefined
                    alert(this.appName);
                 }, false);
              };
          要想保持原有的上下文,需要將回調函數包裝進一個匿名函數,然後定義一個引用指向它。
      使用代理函數來保持當前的上下文。jQuery中提供了proxy()函數,只需將指定的上下文傳人函數即可:
      $('signinForm').submit($.proxy(function(){/* ... */}), this);

委託事件

             從事件冒泡時開始就發生了事件委託,我們可以直接給父元素綁定事件監聽,用來檢測在其子元素內
      發生的事件,用來建設應用
      中的事件監聽的數量:
              // 在ul列表上座了事件委託
              list.addEventListener('click', function(e){
                if (e.currentTarget.tagName == 'li'){
                  /* ... */
                 return alse;
                }
              }, false);
              jQuery提供了delegate()函數,可以減少事件監聽的數量,改善代碼性能:
              $('ul li').click(function(){/* ... */});
              $('ul').delegate('li','click',function(){/* ... */}); // 事件委託,所有爲元素添加的子元素都具有事件監聽。


自定義事件

           jQuery中可以使用trigger()函數來觸發自定義事件。可以通過命名空間形式來管理事件名稱。
         // 綁定自定義事件
         $('.className').bind('refresh.widget', function(){});
              
         // 觸發自定義事件
         $('.className').trigger('refresh.widget');
         通過給trigger()傳人一個額外的參數來給事件處理程序傳人數據。數據會員附加參數的形式帶人回調:
         $('.class').bind('frob.widget', function(event, dataNumber){
              console.log(dataNumber);
         });
         $('.class').trigger('frob.widget', 5);
         和內置事件一樣,自定義事件同樣會沿着DOM樹做冒泡。


自定義事件和jQuery插件


DOM無關事件
















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