jQuery $(this)不会在我的元素中插入文本

时间:2013-05-10 03:38:16

标签: javascript jquery html

我目前正在为我的项目添加标记功能,而我无法让jQuery的$(this)选择器工作。

这样做的目的是在用户点击它时将div中的文字从flag更改为flagged,并且ajax查询成功运行。我的HTML / PHP是:

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

我处理div的JavaScript是:

$('.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替换文字,但是如果我用this选择器替换.flag选择器,它将用标记类替换所有内容页。

我已经检查过了,$(this)选择器正在获取&#39; post_to_flag&#39;正好。为什么会发生这种情况,我该如何解决?

2 个答案:

答案 0 :(得分: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对象,最好用一个开头$来表示该变量,以便为将来的读者或你自己提供清晰的信息。

答案 1 :(得分:1)

ajax回调中的

this不是元素,但它本身就是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`