我目前正在为我的项目添加标记功能,而我无法让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;正好。为什么会发生这种情况,我该如何解决?
答案 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)
this
不是元素,但它本身就是Ajax对象。
您可以使用$.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`