Помогите мерцание блока диалогов

118
30 июля 2021, 01:00

Есть система диалогов пользователей (картинка 1) и в ней список диалогов переобновляется каждую сек Ajaxом. Дело в том что при наведении на блок и при переобновлении диалогов анимация наводки начинаем мерцать каждую секунду. Это весьма логично. Но как это можно исправить, наводка диалогам очень нужна. Код ajax (рисунок 2,3). Необходимо убрать данное мерцание. Возможно есть способ не посылать каждую секунду диалоги а проверять наличие чего-то нового, а потом уже запроч на сами диалоги если есть изменения.

jQuery / js code

var protect = 'dialogServer';
    setInterval(function() {
        $.ajax({
            url: '../forms/ajax/dialogues.php',
            type: 'POST',
            cache: true,
            data: ({protect: protect}),
            dataType: 'json',
            success: function successMsg(dia){
                $("#dialogues").empty();
                for (d = 0;d < dia.dialog.length;d++) {
                    $("#dialogues").append(
                    '<div id="dia" class="'+d+'">' +
                        '<a href="/profile?username='+ dia.user[d].username +'">' +
                            '<div id="user-image">' +
                                '<img src="images/users/'+ dia.user[d].photo_url +'" height="53" alt="">' +
                            '</div>' +
                        '</a>' +
                        '<a class="dialog-messages" alt="?id='+ dia.user[d].id +'&dia='+ dia.dialog[d].id+'" id="name'+d+'">' +
                            '<div id="main-buttond-dia">' +
                                '<div>' +
                                    '<p class="name-user-mess">'+ dia.user[d].name + ' ' + dia.user[d].surname + '</p><p class="time-mess">'+ dia.countFasleMess[d].countMess + '</p>' +
                                '</div>' +
                                '<div class="mini-mess">'+
                                    '<p>'+ dia.miniText[d].msg + '</p>'+
                                '</div>'+
                            '</div>'+
                        '</a>'+
                    '</div>');
                }
                if (dia.dialog.length > 0) {
                    $('.nomess').text(dia.dialog.length + num2str(dia.dialog.length, [' диалог', ' диалога', ' диалогов']));
                } else {
                    $('.nomess').text('Диалогов нет');
                }
                $(".dialog-messages").on('click', function () {
                    name = $(this).attr('id');
                    newname = $("#" + name).attr('alt');
                    window.history.pushState('1', 'Mew page', newname);
                    setTimeout(function () {
                        var block = document.getElementById("msges");
                        block.scrollTop = block.scrollHeight;
                    }, 1000);
                });
            }
        });
    }, 1000);

php код

<?php 
if (!empty($_POST['protect'] == 'dialogServer')) {
    session_start();
    if (!empty($_SESSION['auth'])) {
        require '../../protection/db-connect.php';
        $userInfo = $dbSelect->prepare('SELECT `id` FROM `users` WHERE `username` = :username');
        $userInfo->execute([':username' => $_SESSION['auth']['username']]);
        $userInfo->setFetchMode(PDO::FETCH_OBJ);
        $userInfoData = $userInfo->fetch();
        $selectDialogs = $dbSelect->prepare('SELECT * FROM `dialogue` WHERE `id_sender` = :id_sender AND `activity` = "true" OR `id_recipient` = :id_recipient AND `activity` = "true"');
        $selectDialogs->execute([':id_sender' => $userInfoData->id, ':id_recipient' => $userInfoData->id]);
        $selectDialogs->setFetchMode(PDO::FETCH_ASSOC);
        $selectDialogsData = $selectDialogs->fetchAll();
        $messDia = $dbSelect->prepare('SELECT * FROM `msg` WHERE `id_dialog` = :id_dialog ORDER BY `id` DESC');
        $checkCount = $dbSelect->prepare('SELECT COUNT(`id`) AS `countMess` FROM `msg` WHERE `id_dialog` = :id_dialog AND `status` = "false" AND `id_sender` != :id_sender');
        $userInfoNoMy = $dbSelect->prepare('SELECT `name`,`surname`,`photo_url`,`username`,`id` FROM `users` WHERE `id` = :id');
        for ($i = 0; $i < count($selectDialogsData);$i++) {
            if ($selectDialogsData[$i]['id_sender'] === $userInfoData->id) {
                $myId = $userInfoData->id;
                $nomyId = $selectDialogsData[$i]['id_recipient'];
            } else {
                $myId = $userInfoData->id;
                $nomyId = $selectDialogsData[$i]['id_sender'];
            }
            $userInfoNoMy->execute([':id' => $nomyId]);
            $userInfoNoMy->setFetchMode(PDO::FETCH_ASSOC);
            $userInfoNoMyData[$i] = $userInfoNoMy->fetch();
            $messDia->execute([':id_dialog' => $selectDialogsData[$i]['id']]);
            $messDia->setFetchMode(PDO::FETCH_ASSOC);
            $messDiaData[$i] = $messDia->fetch();
            $checkCount->execute([':id_dialog' => $selectDialogsData[$i]['id'], ':id_sender' => $userInfoData->id]);
            $checkCount->setFetchMode(PDO::FETCH_ASSOC);
            $checkCountData[$i] = $checkCount->fetch();
        }
        echo json_encode(array(
            "dialog" => $selectDialogsData,
            "user" => $userInfoNoMyData,
            "miniText" => $messDiaData,
            "countFasleMess" => $checkCountData
        ));
    } else {
        header('Location: ../../login');
    }
} else {
    header('Location: ../../');
}

html код

<div id="dialog">
    <div id="buttons-mess">
        <a href="/profile">Вернуться</a>
        <p class="mess-text-nav">Сообщения</p>
    </div>
    <form action="">
        <input type="search" name="" id="searchNewMess" placeholder="Написать новое сообщени">
    </form>
    <div id="resultsSearch"></div>
    <div id="dialogues"></div>
    <p class="nomess"></p>
</div>
READ ALSO
Вывод данных из mysql с помощью php

Вывод данных из mysql с помощью php

Есть база данных db_cars Запрос к базе данных должен выводить марку и модель автомобиля, свойства которого укажет пользовательЕсли запрос забить...

120
Пытаюсь реализовать каталог n-вложенности на PHP

Пытаюсь реализовать каталог n-вложенности на PHP

В БД Postgresql есть таблица каталог

121
Удаленный доступ к объектам в Android

Удаленный доступ к объектам в Android

Есть 2 приложенияОба приложения имеют определение интерфейса ICollback

132