jQuery为什么$(this)在setTimeout方法中不起作用?

时间:2010-10-12 09:12:14

标签: jquery

我有这个jQuery代码:

$('#loadingDiv2')
.css('visibility','hidden')  // hide it initially
.ajaxStart(function() {
    $(this).css('visibility','visible');
    $("#bbdata").empty();
})
.ajaxStop(function() {
    $(this).css('visibility','hidden');// works here 
setTimeout(function(){
    $(this).css('visibility','hidden');// doesn't work here
    }, 100);
});

为什么$(this)在setTimeout方法中不起作用?

3 个答案:

答案 0 :(得分:3)

它不起作用,因为this在那一点上是一个不同的上下文(window),你有几个optons,存储对你想要处理的内容的引用,如下所示:

.ajaxStop(function() {
  var $this = $(this);
  setTimeout(function(){
    $this.css('visibility','hidden');
  }, 100);
});

或者使用$.proxy()来设置匿名函数中的上下文,如下所示:

.ajaxStop(function() {
  setTimeout($.proxy(function(){
    $(this).css('visibility','hidden');
  }, this), 100);
});

在第一个解决方案中,我们存储了对我们想要处理的内容的引用,在第二个解决方案中我们实际上设置了this当该函数运行时...否则它将是{{1} }。

答案 1 :(得分:0)

this中的setTimout存在问题,the docs已明确说明。
但这并不重要,你可以随时使用var that = this;技巧。

答案 2 :(得分:0)

setTimeout在全局上下文中运行,其中this指向窗口对象。

尝试存储对此的引用:

.ajaxStop(function() {
    var me = this;
    setTimeout(function(){
        $(me).css('visibility','hidden');
    }, 100);
});