我有一个投票系统,它将点击的项目的ID发送到PHP脚本,PHP更新数据库并通过JSON编码的数组回送新的投票计数。
这是jQuery:
$(".vote_up").click(function(){
var id = this.id;
var vote = $(this).attr("class");
var data = "id=" + id + "&vote=" + vote;
$.ajax
({
type: "POST",
url: "vote.php",
data: data,
cache: false,
success: function(data)
{
for(var x in data) {
$(".votes_up").find(id).html(data[x].vote_up);
$(".votes_down").find(id).html(data[x].vote_down);
}
}
});
});
因此,当我首先构建项目时,我将数据库中的记录ID设置为项目ID。所以我要做的是引用被点击的确切项目,并将其HTML设置为从PHP返回的数据。我已经检查了Firebug并且我得到了正确的数据,但投票数没有变化。有什么想法吗?
这是PHP的参考:
$query = "SELECT vote_up, vote_down FROM posts WHERE id = '".$id."'";
$result1 = mysql_query($query);
$output = Array();
while ($row = mysql_fetch_array($result1)){
$output[] = Array(
"vote_up" => $row['vote_up'],
"vote_down" => $row['vote_down'],
);
}
echo json_encode($output);
答案 0 :(得分:12)
如果您只想让this
回调中的success:
引用被点击的元素,只需为AJAX请求设置context:
属性即可。
$.ajax({
context: this, // set the context of the callbacks
type: "POST",
url: "vote.php",
data: data,
cache: false,
success: function(data) {
// now "this" refers to the element that was clicked
}
您可以通过执行更通用的操作来测试它,例如:
$(this).html("yep, it works");
...然后如果可行,请考虑在循环中对同一元素执行.html()
没有意义,因为每次.html()
都会覆盖整个内容。
如果您要从循环中追加数据,请使用.append()
:
for(var x in data) {
$(this).append(data[x].vote_up);
$(this).append(data[x].vote_down);
}
答案 1 :(得分:1)
岂不:
$(".votes_up").find(id).html(...);
真的只需要:
$('#' + id).html(..);
答案 2 :(得分:0)
如果在click()方法回调中定义变量,您将能够在ajax成功回调中引用它。类似的东西应该是你:
$(".vote_up").click(function(){
// Assign the clicked element to a scoped variable...
var target = $(this);
var id = this.id;
var vote = $(this).attr("class");
var data = "id=" + id + "&vote=" + vote;
$.ajax
({
type: "POST",
url: "vote.php",
data: data,
cache: false,
success: function(data)
{
for(var x in data) {
// Then refer to it within your callback
target.html(data[x].vote_up);
target.html(data[x].vote_down);
}
}
});
});