2011-07-22 30 views
0

我有以下插件「這個」 在jquery的插件回調

var a = $('#test').timetable({ 
      cell_click: openDialog 
     }); 

由此cell_click

_create:function(){ 
    dayBodyCells.click(function(){ 
      if(!$(this).hasClass('cell-inactive')){ 
       var dic = self.getElementPos(this); 
       self._trigger('cell_click', null,dic);   
     } 
    }); 

openDialog產生的事件是回調函數。在dayBodyCells的回調函數中,我有this等於td元素,這是我的預期。我很好奇 - 爲什麼this裏面的功能openDialog而不是指的是#test

回答

1

在綁定的事件處理函數(回調函數)中,this引用了事件觸發的元素。所以:

$('#myid').click(function(){ 
    // this is the #myid element 
}) 

在你的代碼,dayBodyCells必須爲TD(如你預期),因此this是指它在click處理。但是,當您觸發cell_click事件時,您必須從#test元素(通過self._trigger)觸發它。

如果self._trigger('cell_click', null,dic)$(this).trigger('cell_click', null,dic)更換,this隨後將參考tdopenDialog

看一看http://www.pkshiu.com/loft/archive/2009/01/understanding-this-this-and-event-in-a-jquery-callback-functionhttp://api.jquery.com/category/events/

+0

你是對的。我確實是從自己觸發的,這是小部件本身。 – goh

0

「原因是少了點?任何函數的this都是在調用時建立的,而事件處理函數的約定是this被設置爲有事件的DOM元素,而不是可以找到事件處理程序的對象。

考慮以下幾點:

b = "DOG".toLowerCase 
console.log(b()); 

你可能會認爲這會打印出 「狗」,但沒有。 toLowerCase打印出this指向的字符串的小寫版本。當一個函數被調用那樣,this設置爲undefined等你拿

TypeError: can't convert undefined to object 

(至少有一個Firefox的 - 據我所知,所有的瀏覽器會以某種方式失敗)

你的困惑可能是this似乎模糊地像一個詞彙綁定變量。它不是,它更接近於普通的功能參數或列表本身。