jQuery - 为什么$(this)在子范围内不起作用?

时间:2010-11-17 03:53:02

标签: javascript jquery ajax function callback

我无法弄清楚为什么这个脚本无法工作,除非我创建对$(this)的引用并将其分配给另一个变量,如$ _this = $(this);这是我得到的唯一解决方案,但是想知道是否有更好的解决方案 - 少一个新手。观察我希望能够在回调函数中的get响应之后在$ _this.prepend(“Choose”+ res)部分中使用它:

 $('#loadScript').one('click',function(e){
    $loading = $('<span> Loading Files... </span>');
    $(this).after($loading);
    $_this = $(this);

    $.get('eval.php',{loadScriptGetOptions:1}, function(res){
     setTimeout(function(){
      $loading.remove();
      $_this.prepend("<option>Choose</option>"+res);
     },1200)

    })

})

提前感谢。

2 个答案:

答案 0 :(得分:4)

您忘记在两个地方使用var

$loading = ...

$_this = ...

我喜欢self与那里丑陋的下划线。

 $('#loadScript').one('click',function(e){

    var $loading = $('<span> Loading Files... </span>');
    $(this).after($loading);

    var $self = $(this);

    $.get('eval.php',{loadScriptGetOptions:1}, function(res){
      setTimeout(function(){
         $loading.remove();
         $self.prepend("<option>Choose</option>"+res);
      }, 1200);

    });

});

答案 1 :(得分:1)

你的$ _this.prepend是在setTimeout函数中调用的,这与外部函数不同。你可以做类似的事情:

function myFunc() {
    // What is $(this) here? 
}

 $('#loadScript').one('click',function(e){
    $loading = $('<span> Loading Files... </span>');
    $(this).after($loading);
    $_this = $(this);

    $.get('eval.php',{loadScriptGetOptions:1}, function(res){
       setTimeout(myFunc, 1200);
    })
})

否则,我认为您的解决方案似乎没问题。

请注意,$_this是您在setTimeout中使用的函数使用的闭包变量,因此如果您需要引用已知元素,则可以 摆脱其他评论(即使用$('#loadScript')直接访问元素)。