php - 在 AJAX 中使用一次后重新绑定(bind)点击事件

标签 php javascript jquery mysql ajax

我在处理 AJAX 调用上的点击事件时遇到问题。我嵌套了 AJAX 调用,因为单击事件发生在第一次 AJAX 调用之前不存在的 div 上。基本上,我从数据库加载用户评论,然后评论上有一个向上和向下投票按钮。这是第二个 ajax 调用。你可以在这里看到 JS:

//FIRST LOAD THE COMMENTS WITH THE FIRST AJAX CALL
$('.comments_submit').each(function(){
    var comments_text = $(this).parent().find('textarea').val();
    var video_id = $(this).closest('div.home_video').find('.video').attr('id');

    var myData = 'body=' + comments_text + '&video_id=' + video_id + '&type=load';
    var that = this;

    $.ajax({
                type: 'POST', // HTTP method POST or GET
                url: 'comments_ajax.php', //Where to make Ajax calls
                dataType:'text', // Data type, HTML, json etc.
                data:myData, //post variables
                success:function(response){

                //UPON SUCCESSFULLY LOADING THE COMMENTS / BIND CLICK EVENT TO VOTE UP AND VOTE DOWN
                    $(that).closest('div.home_video').find('.comments_list').html(response);

                    $('.vote_link.down').each(function(){
                        $(this).click(function(){
                            var comment_id = $(this).closest('.comment_box').attr('id');

                            //MAKE AJAX CALL TO SUBMIT COMMENTS

                            var myData = 'comment_id=' + comment_id + '&type=vote_down';
                            var that = this;

                            $.ajax({
                                type: 'POST', // HTTP method POST or GET
                                url: 'comments_ajax.php', //Where to make Ajax calls
                                dataType:'text', // Data type, HTML, json etc.
                                data:myData, //post variables
                                success:function(response){

                                //REFORMAT UPON SUCCESSFUL AJAX CALL
                                $(that).text(response);

                                },
                                error:function (xhr, ajaxOptions, thrownError){
                                    alert('didnt work'); //throw any errors
                                }
                            });
                        });
                    });


                    $('.vote_link.up').each(function(){
                        $(this).click(function(){
                            var comment_id = $(this).closest('.comment_box').attr('id');

                            //MAKE AJAX CALL TO SUBMIT COMMENTS

                            var myData = 'comment_id=' + comment_id + '&type=vote_up';
                            var that = this;

                            $.ajax({
                                type: 'POST', // HTTP method POST or GET
                                url: 'comments_ajax.php', //Where to make Ajax calls
                                dataType:'text', // Data type, HTML, json etc.
                                data:myData, //post variables
                                success:function(response){

                                //REFORMAT UPON SUCCESSFUL AJAX CALL
                                $(that).text(response);

                                },
                                error:function (xhr, ajaxOptions, thrownError){
                                    alert('didnt work'); //throw any errors
                                }
                            });
                        });
                    });



                },
                error:function (xhr, ajaxOptions, thrownError){
                    alert('didnt work'); //throw any errors
                }
        });
});

评论加载的服务器端代码是:

if($_POST['type']=="load"){
$sql_select = "SELECT * FROM comments WHERE video_id = '$video_id' ORDER BY timestamp DESC LIMIT 7";
$result_select = $mysqli->query($sql_select);

while($row = mysqli_fetch_array($result_select)){
    echo "<div class='comment_box' id='".$row['id']."'>".$row['body']."
        <div class='votes'>
            <a class='vote_link up'>UP (".$row['vote_up'].")</a>
            <a class='vote_link down'>DOWN (".$row['vote_down'].")</a>
        </div>
    </div>";
}

}

以及投票赞成的服务器端代码(与投票反对代码几乎相同):

if($_POST['type']=="vote_up"){
$comment_id = $_POST['comment_id'];

$sql_select = "SELECT * FROM comments WHERE id = '$comment_id'";
$result_select = $mysqli->query($sql_select);
$row = mysqli_fetch_array($result_select);
$votes = $row['vote_up'] + 1;

$sql_update = "UPDATE comments SET vote_up = '$votes' WHERE id = '$comment_id'";
$result_update = $mysqli->query($sql_update);

$sql_select = "SELECT * FROM comments WHERE id = '$comment_id'";
$result_select = $mysqli->query($sql_select);
$row_vote = mysqli_fetch_array($result_select);

echo "
UP (".$row_vote['vote_up'].")
";

}

有几件事。当我单击该按钮时,由于某种原因,它会在“向上”或“向下”字段中添加多个赞成票。但它也会解除点击事件的绑定(bind)。

我以前从未嵌套过 AJAX 调用,所以也许有更好的方法在第一个函数发生后绑定(bind) AJAX 函数?感谢您的帮助!

最佳答案

你应该能够做到:

$('.vote_link.down').click(function(){
    var comment_id = $(this).closest('.comment_box').attr('id');
    // etc.
});

$('.vote_link.up').click(function(){
    var comment_id = $(this).closest('.comment_box').attr('id');
    // etc.
});

这应该会简化您的代码并可能解决您的一些问题。

关于php - 在 AJAX 中使用一次后重新绑定(bind)点击事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18346069/

相关文章:

php - 使网页在网络托管域上运行所需的帮助

javascript - 我可以使用html5音频api创建歌曲吗

javascript - 在 tr 标签内创建一个表?

jquery - 使用 .each() 将输入复制到多个 div

javascript - 页面加载时隐藏 div 并在几秒钟后显示相同的内容

php - 自动化构建和 STDIN

php - 如何进行条件查询选择

jQuery 在标签内切换 img

javascript - 使用 PHP 和 JavaScript 动态搜索 SQL 表并在 HTML 上显示

php - 简单的PHP错误: syntax error, unfinished class declaration