像...一样的东西。
$('.foo').live 'click', ->
setTimeout (()->$(this).parent().hide()), 5000
感谢您的帮助!
答案 0 :(得分:5)
James已正确诊断出问题:当您将某个功能传递给setTimeout
时,会在window
上下文中调用该功能(就像您将func
称为func()
一样) 。有两个很好的解决方案:
1)(最快)将细箭头->
更改为胖箭头=>
,将功能绑定到当前上下文,确保this
函数内的值与this
之外的值相同。然后你的代码将是
$('.foo').live 'click', ->
setTimeout (=> $(this).parent().hide()), 5000
2)(效率最高)只需捕获您传递给this
的函数之外的$(this)
或setTimeout
的值。这比绑定函数的开销少。然后你的代码将是
$('.foo').live 'click', ->
$this = $(this)
setTimeout (-> $this.parent().hide()), 5000
我发现自己经常在回调的顶部写$this = $(this)
。这是一个非常有用的习惯用语,可以在确保顺畅的表现的同时为您节省很多麻烦。
答案 1 :(得分:3)
这在setTimeout中将是window
或未定义。在这种情况下,你最好用一个匿名函数包装来关闭它,或者使用bind(this)来绑定函数的这个对象
setTimeout((function() { return function() { $(this).parent().hide(); } })(), 5000);
或
var func = function() { $(this).parent().hide(); };
setTimeout(func.bind(this), 5000);
(我不太了解coffeescript,所以希望这是正确的JS等价物)
作为旁注,jquery不具备延迟这样的动画的功能吗?
答案 2 :(得分:1)
CoffeeScript有'do'关键字,“立即调用传递的函数”。它应该有帮助。
$('.foo').live 'click', ->
foo = $(this)
do foo ->
setTimeout (()->foo.parent().hide()), 5000
答案 3 :(得分:-1)
$(this)
作用于功能。因此,$(this)
此处未指定$('.foo')
个对象。首先必须将该对象缓存在某个变量中,然后将该变量传递给setTimeout
函数。
类似的东西:
var foo = $('.foo');
setTimeout(foot.parent().hide(), 5000);