Javascript 你怎么能像Stackoverflow中那样做一个向上向下的投票按钮?
问题Javascript 你怎么能像Stackoverflow中那样做一个向上向下的投票按钮?,javascript,python,html,ajax,Javascript,Python,Html,Ajax,问题 如何制作Ajax按钮(向上和向下箭头),使数字可以增加或减少 如何将用户的操作保存到变量NumberOfVotesOfQuestionID 我不确定是否应该对变量使用数据库。不过,我知道还有一个更简单的办法来节省选票 您如何解决这些问题? [编辑] 服务器端编程语言是Python。我认为这些问题的答案是对stackoverflow的渴望 我建议将选票存储在数据库中 您没有提到服务器端编程语言 请给我们更多的信息 可能有助于您入门您可以创建按钮,这些按钮可以是链接、图像或其他内容。现在,将J
服务器端编程语言是Python。我认为这些问题的答案是对stackoverflow的渴望 我建议将选票存储在数据库中 您没有提到服务器端编程语言 请给我们更多的信息
可能有助于您入门您可以创建按钮,这些按钮可以是链接、图像或其他内容。现在,将JavaScript函数挂接到每个按钮的单击事件上。单击后,函数将激发并
- 将请求发送到服务器代码,该代码或多或少显示+1或-1
- 服务器代码接管。这将根据您使用(或不使用)的框架和一系列其他内容而大不相同
- 代码连接到数据库并运行一个查询,查询分数+1或-1。这将如何发生取决于您的数据库设计,但它将类似于
updatepostset score=score+1,其中score\u id={{insert id here}代码>
- 根据数据库的说法,服务器返回成功代码或失败代码作为AJAX请求响应
- 响应以异步方式发送到AJAX
- 如果是成功代码,JS响应函数将更新分数;如果是失败代码,则显示错误
您可以将代码存储在变量中,但这很复杂,取决于您对代码运行时环境语义的了解程度。无论如何,它最终都需要被推送到持久性存储,因此100%使用数据库是一个好的初始解决方案。当优化性能的时机到来时,世界上有足够的软件来缓存数据库查询,让您感到头晕目眩,所以这没什么大不了的。这是一个使用jQuery/Django的肮脏/未经测试的理论实现 我们将假设上下投票是针对本网站上的问题/答案,但这显然可以根据您的实际使用情况进行调整 模板 Django视图
哎呀。当我开始回答这个问题时,我并不想写这么多,但我有点忘乎所以了。当页面第一次加载时,您仍然缺少获得所有投票的初始请求,但我将把它作为练习留给读者。无论如何,如果您实际上正在使用Django,并且对Stackoverflow投票的更经过测试/更真实的实现感兴趣,我建议您查看cnprog.com,这是一个用Python/Django编写的Stackoverflow的中文克隆。他们发布了他们的代码,这相当不错。有几点没有人提到:
- 更改数据库状态时,您不希望使用GET。否则,我可以在我的站点上放置一个带有
src=”的图像http://stackoverflow.com/question_555/vote/up/answer_3/“
- 你也需要
- 您必须记录每次投票的投票人,以避免人们对某个特定问题进行多次投票。无论是通过IP地址还是用户ID
<div id="answer_595" class="answer">
<img src="vote_up.png" class="vote up">
<div class="score">0</div>
<img src="vote_down.png" class="vote down">
Blah blah blah this is my answer.
</div>
<div id="answer_596" class="answer">
<img src="vote_up.png" class="vote up">
<div class="score">0</div>
<img src="vote_down.png" class="vote down">
Blah blah blah this is my other answer.
</div>
$(function() {
$('div.answer img.vote').click(function() {
var id = $(this).parents('div.answer').attr('id').split('_')[1];
var vote_type = $(this).hasClass('up') ? 'up' : 'down';
if($(this).hasClass('selected')) {
$.post('/vote/', {id: id, type: vote_type}, function(json) {
if(json.success == 'success') {
$('#answer_' + id)
.find('img.' + vote_type);
.attr('src', 'vote_' + vote_type + '_selected.png')
.addClass('selected');
$('div.score', '#answer_' + id).html(json.score);
}
});
} else {
$.post('/remove_vote/', {id: id, type: vote_type}, function(json) {
if(json.success == 'success') {
$('#answer_' + id)
.find('img.' + vote_type);
.attr('src', 'vote_' + vote_type + '.png')
.removeClass('selected');
$('div.score', '#answer_' + id).html(json.score);
}
});
}
});
});
def vote(request):
if request.method == 'POST':
try:
answer = Answer.objects.get(pk=request.POST['id'])
except Answer.DoesNotExist:
return HttpResponse("{'success': 'false'}")
try:
vote = Vote.objects.get(answer=answer, user=request.user)
except Vote.DoesNotExist:
pass
else:
return HttpResponse("{'success': 'false'}")
if request.POST['type'] == 'up':
answer.score = answer.score + 1
else:
answer.score = answer.score - 1
answer.save()
Vote.objects.create(answer=answer,
user=request.user,
type=request.POST['type'])
return HttpResponse("{'success':'true', 'score':" + answer.score + "}")
else:
raise Http404('What are you doing here?')
def remove_vote(request):
if request.method == 'POST':
try:
answer = Answer.objects.get(pk=request.POST['id'])
except Answer.DoesNotExist:
return HttpResponse("{'success': 'false'}")
try:
vote = Vote.objects.get(answer=answer, user=request.user)
except Vote.DoesNotExist:
return HttpResponse("{'success': 'false'}")
else:
vote.delete()
if request.POST['type'] == 'up':
answer.score = answer.score - 1
else:
answer.score = answer.score + 1
answer.save()
return HttpResponse("{'success':'true', 'score':" + answer.score + "}")
else:
raise Http404('What are you doing here?')