2014-05-07 25 views
0

我試圖引用$(this),但jquery找不到它。簡單的代碼:

$(".testBox").click(function(){ 
    $(this).addClass("backRed"); 
    $.get("/data/TESTer/?tickle=yes", function(data) { 
     $(this).addClass("backGreen"); 
     alert("Data Loaded: " + data); 
    }); 
}); 

在這種情況下,.testBox將獲得一流的backRed,但不會獲取類backGreen,可能是因爲$(this)現在引用從$.get東西。如何參考$.get參數中點擊的$(this)

+0

這就是爲什麼[CoffeeScript中的(http://coffeescript.org/#fat-arrow)脂肪箭頭('=>')是如此的得心應手。他們也很好地描述了發生的事情。 – InternalFX

+1

^^^十個獨角獸剛剛死亡,咖啡標記從來沒有得心應手,它只是增加了多層的奇怪,使JavaScript看起來更怪異。 – adeneo

回答

2

最簡單的方法是創建一個封閉這樣的:

$(".testBox").click(function(){ 
    var me = $(this); 
    me.addClass("backRed"); 
    $.get("/data/TESTer/?tickle=yes", function(data) { 
     me.addClass("backGreen"); 
     alert("Data Loaded: " + data); 
    }); 
}); 

這樣做是:

  • 創建一個存儲$(this)局部範圍的變量。
  • 使用該變量在內部功能

什麼情況是,它會創建一個閉合,其具有到外父的基​​準的功能,並且可以從該父使用變量。

1
$(".testBox").click(function(){ 
     var $this = $(this); 
     $this.addClass("backRed"); 
     $.get("/data/TESTer/?tickle=yes", function(data) { 
      $this.addClass("backGreen"); 
      alert("Data Loaded: " + data); 
     }); 
    }); 
2

最簡單的方法可能是做到這一點:

$(".testBox").click(function(){ 
    var self = $(this); 
    self.addClass("backRed"); 
    $.get("/data/TESTer/?tickle=yes", function(data) { 
     self.addClass("backGreen"); 
     alert("Data Loaded: " + data); 
    }); 
}); 
+0

像魅力一樣工作!不會讓我「接受」它7分鐘...... – user3614032

+0

酷,但接受@安德烈的答案,因爲他正在努力解釋_why_它是如何工作的。 –

1

緩存選擇成$this

$(".testBox").click(function(){ 

    var $this = $(this); 
    $this.addClass("backRed"); 
    $.get("/data/TESTer/?tickle=yes", function(data) { 
     $this.addClass("backGreen"); 
     alert("Data Loaded: " + data); 
    }); 
}); 
1

$.ajax()方法(從中$.get()導出)具有context論點,即特別是指控制成功處理程序中的值this

所以,你可以使用該選項:

$(".testBox").click(function(){ 
    $(this).addClass("backRed"); 
    $.ajax({ 
     url: "/data/TESTer/?tickle=yes", 
     context: this, 
     success: function(data) { 
      $(this).addClass("backGreen"); 
      alert("Data Loaded: " + data); 
     } 
    }); 
});