我有以下小部件
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
?
答案 0 :(得分: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
会引用td
中的openDialog
查看http://www.pkshiu.com/loft/archive/2009/01/understanding-this-this-and-event-in-a-jquery-callback-function和http://api.jquery.com/category/events/
答案 1 :(得分:0)
'因为它只是吗?任何函数的this
都是在调用时建立的,事件处理程序的契约是this
设置为具有事件的DOM元素,而不是事件处理程序所在的对象可以找到。
请考虑以下事项:
b = "DOG".toLowerCase
console.log(b());
你可能会认为这会打印出“狗”,但没有。 toLowerCase
打印出this
指向的字符串的小写版本。当像这样调用函数时,this
设置为undefined
,所以你得到
TypeError: can't convert undefined to object
(至少有一个Firefox - afaik,每个浏览器都会以某种方式失败。)
你的困惑可能是this
似乎模糊地像一个词汇绑定的变量。它不是,它更接近普通函数参数或arguments
列表本身。