2

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

这样做的目的是在用户单击时更改divfromflag中的文本flagged,并且 ajax 查询成功运行。我的 HTML/PHP 是:

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

我处理的javascriptdiv是:

$('.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)选择器获得了 'post_to_flag' 的属性就好了。为什么会发生这种情况,我该如何解决?

4

2 回答 2

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()功能时,您的范围会发生变化。thisnow 指的是与您在里面时不同的范围one()

@Moak 的建议,如果您将变量设置为 jQuery 对象,则最好用开头来表示变量,$以便将来的读者或您自己清楚。

于 2013-05-10T03:39:51.100 回答
1

thisajax回调里面的不是元素,而是Ajax对象本身。

您可以使用$.proxy在上下文中传递。

参考 $.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`
于 2013-05-10T03:40:25.680 回答