Javascript 为什么只有第一次点击会增加投票计数器,而其他人不会?

Javascript 为什么只有第一次点击会增加投票计数器,而其他人不会?,javascript,php,mysql,ajax,Javascript,Php,Mysql,Ajax,代码的php部分: //the JS part echo "<script> function increasevotes(e,location,user,date,vote) { e.preventDefault(); var xmlhttp = new XMLHttpRequest(); xmlhttp.onreadystatechange = function() { if (this.readyState == 4

代码的php部分:

 //the JS part
 echo "<script>
  function increasevotes(e,location,user,date,vote)
  {
    e.preventDefault();
    var xmlhttp = new XMLHttpRequest();
    xmlhttp.onreadystatechange = function() {
            if (this.readyState == 4 && this.status == 200) {
            e.target.parentNode.previousSibling.textContent=this.responseText;
            }
        };
    xmlhttp.open(\"GET\", \"vote.php?location=\" + location + \"&user=\"+ user +\"&date=\"+date+\"&vote=\"+vote, true);
    xmlhttp.send();
  }
  </script>"
//the HTML part
echo "<span class=\"right nolikes\">{$rows['vote']}</span>
<a href=\"\" onclick=\"increasevotes(event,'{$rows['title']}','{$rows['username']}','{$rows['date']}','{$rows['vote']}')\">
<img src=\"img/like.png\" class=\"right\" width=\"30\" height=\"30\"/>
</a>"
//JS部分
回声“
功能增加投票(e、位置、用户、日期、投票)
{
e、 预防默认值();
var xmlhttp=new XMLHttpRequest();
xmlhttp.onreadystatechange=函数(){
if(this.readyState==4&&this.status==200){
e、 target.parentNode.previousSibling.textContent=this.responseText;
}
};
xmlhttp.open(\“GET\”,\“vote.php?location=\“+location+\”&user=\“+user+\”&date=\“+date+\”&vote=\”+vote,true);
xmlhttp.send();
}
"
//HTML部分
echo“{$rows['vote']}
"
AJAX调用中使用的php。(vote.php)


原因是在JS回调中,您只更新了

<span class="right nolikes">{$rows['vote']}</span>
但您还需要更新onclick部分的投票数量:

<a href="" onclick="increasevotes(event,'{$rows['title']}','{$rows['username']}','{$rows['date']}','{$rows['vote']}')"> 
here it still uses old vote number 
然后,要更新该值,您可以快速执行,也可以等到回拨,然后将其更改为:

var oldVote = parseInt(e.target.parentNode.previousSibling.textContent); 
e.target.parentNode.previousSibling.textContent= oldVote++;

还有更多的方法可以解决这个问题,但我认为这可能会对您有所帮助。

原因在于您在JS回调中只更新了

<span class="right nolikes">{$rows['vote']}</span>
但您还需要更新onclick部分的投票数量:

<a href="" onclick="increasevotes(event,'{$rows['title']}','{$rows['username']}','{$rows['date']}','{$rows['vote']}')"> 
here it still uses old vote number 
然后,要更新该值,您可以快速执行,也可以等到回拨,然后将其更改为:

var oldVote = parseInt(e.target.parentNode.previousSibling.textContent); 
e.target.parentNode.previousSibling.textContent= oldVote++;

还有更多的方法可以解决这个问题,但我认为这可能会对您有所帮助。

您确定第一次单击html页面时也会更新投票吗?是的。显示相似的图像,并显示1。在数据库中,它也变为1。第二次单击不会改变任何地方的投票(
location='%3BDROP%20TABLE%20journals%3B--
)顺便说一句,用PHP重复大量JavaScript代码和HTML代码也被认为是不好的做法,我不确定您的情况,但总有办法阻止这样做。谢谢您的建议。将实施。您确定第一次单击时也会更新html页面上的投票吗?是。显示相似的图像,并显示1。在数据库中,它也变为1。第二次单击不会改变任何地方的投票(
location='%3BDROP%20TABLE%20journals%3B--
)顺便说一句,用PHP重复大量JavaScript代码和HTML代码也被认为是不好的做法,我不确定您的情况,但总有办法阻止这样做。谢谢您的建议。我以前也犯过这样的错误:在一个输入字段中输入选票计数。。并在每次单击时增加。。。使用该输入值作为投票值。非常感谢!它起作用了。但是我没有得到这部分“但是你还需要更新onclick部分的投票数:”我在数据库中单击第一个按钮时,无论如何都在增加投票数。所以onclick部分中的$rows['vote']应该已经更改了,对吗?它会更新数据库,这是正确的,但是当您不刷新页面时,生成JS和HTML代码的PHP代码不会重新执行。在这种情况下,您传递给onclick函数的当前投票量不会得到更新,只要您不刷新页面,它将始终传递旧值。。有道理吗?:)你也可以通过在浏览器的网络窗口中观察你的请求内容来仔细检查它。我过去也犯过这样的错误:在一个输入字段中输入选票计数。。并在每次单击时增加。。。使用该输入值作为投票值。非常感谢!它起作用了。但是我没有得到这部分“但是你还需要更新onclick部分的投票数:”我在数据库中单击第一个按钮时,无论如何都在增加投票数。所以onclick部分中的$rows['vote']应该已经更改了,对吗?它会更新数据库,这是正确的,但是当您不刷新页面时,生成JS和HTML代码的PHP代码不会重新执行。在这种情况下,您传递给onclick函数的当前投票量不会得到更新,只要您不刷新页面,它将始终传递旧值。。有道理吗?:)您还可以通过在浏览器的网络窗口中观察请求内容对其进行双重检查。