2011-11-02 101 views
0

繼我之前提出的問題之後,我決定去編寫一系列模仿移動事件(tap,taphold等)的jQuery插件。jQuery Event Plugin issues

我有這個概念的工作,但我有問題執行處理函數。以下是我正在定義插件方法:

(function($) { 
    var touch_capable = isTouchCapable(); 

    var settings = { 
     swipe_h_threshold : 30, 
     swipe_v_threshold : 50, 
     taphold_threshold : 750, 
     startevent  : (touch_capable) ? 'touchstart' : 'mousedown', 
     endevent   : (touch_capable) ? 'touchend' : 'mouseup' 
    }; 

    // tap Event: 
    $.fn.tap = function(handler) { 
     return this.each(function() { 

      var $this = $(this); 
      var started = false;    

      $this.bind(settings.startevent, function() { 
       started = true; 
      }); 

      $this.bind(settings.endevent, function() {    
       if(started) 
       { 
        handler(); 
       } 
      }); 
     }); 
    }; 
}) (jQuery); 

然後我可以綁定這些「事件」使用$('#a_div').tap();。我的問題是這樣的:

如果我將函數傳遞給tap()方法,該方法對元素起作用,則會出現錯誤。例如:

$('#my_div').tap(function() { alert($(this).get()) });

實際上在提醒[object DOMWindow]。任何人都可以指出我正確執行處理函數的方向嗎?它能以某種方式與事件傳播有關嗎?

回答

1

您可以使用Function.prototype.callFunction.prototype.apply方法來設置函數的執行上下文;

$this.bind(settings.endevent, function() {    
    if(started) 
    { 
     handler.call(this); 
    } 
}); 

這使您可以將接口bind minic提供給提供的處理程序;

$this.bind(settings.endevent, function() {    
    if(started) 
    { 
     handler.apply(this, arguments); 
    } 
}); 

現在,處理器將接收事件對象,因爲它是第一個參數,this將被設置的情況下開火的元素。

+0

哇,從來不知道那個原型!謝謝@Matt! – BenM

+0

很高興幫助@BenM :) – Matt