2013-05-10 39 views
2

我目前爲我的項目添加了標記功能,並且我無法讓jQuery的$(this)選擇器工作。

這樣做的目標是在用戶單擊它時,將div中的文本從flag更改爲flagged,並且ajax查詢成功運行。我的HTML/PHP是:

<div class="flag" post_to_flag='".$post_to_flag."'>Flag</div> 

而且我的javascript,隨着div交易是:

$('.flag').live('click', function() { 
    $.post('../php/core.inc.php', { 
     action: 'flag', 
     post_to_flag: $(this).attr('post_to_flag') 
    }, function (flag_return) { 
     if (flag_return == 'query_success') { 
      $(this).text('flagged'); 
     } else { 
      alert(flag_return); 
     } 
    }); 
}); 

我不能flagged替換文本,但如果我用.flag更換this選擇選擇器,它將用頁面上的標誌類替換所有的東西。

我檢查過了,$(this)選擇器正在獲取'post_to_flag'的屬性。爲什麼會發生這種情況,我該如何解決?

回答

8

您應該添加上下文變量:

$('.flag').live('click', function() { 
    var $context = $(this); 
    $.post('../php/core.inc.php', { 
     action: 'flag', 
     post_to_flag: $context.attr('post_to_flag') 
    }, function (flag_return) { 
     if (flag_return == 'query_success') { 
      $context.text('flagged'); 
     } else { 
      alert(flag_return); 
     } 
    }); 
}); 

你是你jQuery選擇調用中調用多種功能。當你進入$.post()函數時,你的範圍改變了。 this現在指的是與您在one()內部時不同的範圍。

@ Moak的建議,如果你爲jQuery對象設置了一個變量,最好用一個開始的$來表示這個變量,以便爲將來的讀者或你自己澄清。

+2

我也建議使用前綴'$'例如變量'$ context'或'$ this'來表示該值是一個jQuery對象 – Moak 2013-05-10 03:49:12

+0

@Moak,是的!你絕對可以這樣做,這將有助於澄清它是一個jQuery對象。我會改變它。 – SomeShinyObject 2013-05-10 03:49:57

1

this裏面的ajax回調不是元素,但它是Ajax對象本身。

您可以使用$.proxy來傳遞上下文。

Ref $.proxy

$('.flag').live('click', function() { 
$.post('../php/core.inc.php', 
     {action: 'flag', post_to_flag: $(this).attr('post_to_flag')},  
    $.proxy(function(flag_return) { 
     if(flag_return == 'query_success'){ 
     $(this).text('flagged'); //Now this here will represent .flag 
     }else{ 
     alert(flag_return); 
     } 
    },this)); //Now here you are passing in the context of `.flag` 
+0

爲什麼一個隨機downvote.Care解釋。 – PSL 2013-05-10 16:50:24