在Ajax调用之后,降低Bootstrap通知标记中的值只能运行一次

时间:2017-03-21 06:56:31

标签: php jquery ajax twitter-bootstrap

我有一个Bootstrap徽章,显示消息数量。

badge

当用户单击该图标时,会出现一个模式,显示来自数据库的消息。他们可以选择删除消息(它实际上没有删除,它只是将整数设置为1,因此它不会显示)。删除一次后,消息div被删除,数据库将字段设置为' 1',通知标记减少1.

not deleted yet

删除1条消息后:

deleted

删除没有页面刷新的第二条消息后:

problem!!!

这是一个问题。但是,一旦我刷新,它就会隐藏徽章,因为它应该小于1。

correct

徽章文本是从PHP脚本生成的,该脚本在数据库中查询消息。对于它找到的每一行,我都会增加通知:

$query = "SELECT username, avatar, conversation_id, conversation_subject, time, msg_seen FROM `users` INNER JOIN `conversation` ON `users`.id = `conversation`.user_1
                          WHERE user_2 = ? AND user_2_deleted = ? ORDER BY time DESC";
            if (!$stmt = $connection->prepare($query)) {
                echo $stmt->error;
            } else {
                if (!$stmt->bind_param('ii', $recip_id, $user_2_deleted)) {
                    echo $stmt->error;
                } else {
                    $stmt->execute();
                    $stmt->bind_result($sender_name, $avatar, $msg_id, $subject, $timestamp, $msg_seen);
                    while ($stmt->fetch()) {                         
                        if ($msg_seen == 0) {
                            $notification_count++; // RIGHT HERE
                        }

这是相应的jquery / ajax,它删除消息div,发送ajax调用,并警告消息已被删除。除徽章文本值之外的所有内容每页刷新多次使用。我必须刷新页面才能看到0个通知。为什么?

//Find notification badge and display count
$(document).ready(function () {
    var badge = $(this).find(".badge");
    var count = <?php echo $notification_count; ?>;

    if (count > 0) {
        badge.text(count);
    } else {
        badge.hide();
    }
});
    $(document).on('click', '.delete-btn', function() {
        var id = $(this).data('id');
        var url = "../inc/delete_msg.php?msg_id="+id;
        $(this).closest('.msg-content').next('hr').remove();
        $(this).closest('.msg-content').remove();

        $.ajax({
            type: "GET",
            url: url,
            success: success,
            error: function () {
                alert('Failed to Delete');
            }
        });
    });
function success() {
    $(".badge").text(<?php echo $notification_count - 1;?>);
    $('.modal-title').after(
        '<div class="alert alert-success delete-success-alert text-center" role="alert" id="delete_success_alert">' +
        'Message Deleted</div>');
    $('#delete_success_alert').fadeTo(3000, 500).slideUp(500, function () {
        $('#delete_success_alert').slideUp(500);
    });
}

我该怎么做才能解决这个问题?数据库更新两次,div被删除两次。它只是这个徽章,我无法弄清楚。

1 个答案:

答案 0 :(得分:0)

问题很简单,看看这一行:

$(".badge").text(<?php echo $notification_count - 1;?>);

php代码什么时候执行?你希望它为每个ajax请求执行但你错了,它只会在浏览器请求包含你的javascript代码的文件/页面时在服务器上执行,所以你的代码将等同于:

$(".badge").text(2); // 2 if we have 2 messages

所以无论你做了多少ajax请求并且成功,你总是将徽章文本放到2,直到页面引用,php代码才会再次执行。

现在首先要解决问题,你有一个count变量来捕获服务器的初始消息数,我建议使用这样的变量:

count--;
$(".badge").text(count);

此代码是javascript代码,将在ajax成功执行,它应该可以工作。

从现在开始记得执行哪个代码时,php代码是服务器端代码,它在服务器上执行,浏览器不会得到任何php代码,javascript代码是客户端代码,浏览器会收到它并执行它,当你把PHP代码放在javascript代码中时,它就像“嘿浏览器执行此代码”,其中“此代码”是动态的,具体取决于php代码的输出。