Javascript-форум (https://javascript.ru/forum/)
-   Events/DOM/Window (https://javascript.ru/forum/events/)
-   -   Вывод даты сообщения при скролле (https://javascript.ru/forum/events/84828-vyvod-daty-soobshheniya-pri-skrolle.html)

dvbshka 08.01.2023 14:59

Вывод даты сообщения при скролле
 
Доброго времени суток!

У меня такая проблема:
Есть чат, написан на php и js.
Есть скрипт-условие-событие, которое при наведении на время в сообщении делает типо hover эффект и показывает дату вверху окна чата.

Вот так:



Вот код:

$("body").on('mouseenter', '.main .chatbox > .contents > .chat_messages > ul > li > div >.right > .header > .tools > .timestamp', function(e) {
    $('.main .chatbox > .contents > .date').hide();
    if ($(this).parents('.message').find('.date').attr('message_sent_on') !== undefined) {
        var message_sent_on = $(this).parents('.message').find('.date').attr('message_sent_on');
        $('.main .chatbox > .contents > .date > span').text(message_sent_on);
        $('.main .chatbox > .contents > .date').show();
    }
});

$("body").on('mouseleave', '.main .chatbox > .contents > .chat_messages > ul > li > div >.right > .header > .tools > .timestamp', function(e) {
    $('.main .chatbox > .contents > .date').hide();
});


Собственно вопрос:

Как сделать так, чтобы не при наведении на время, а при скролле вверх или вниз показывалась дата сверху и исчезала при остановке скролла.

Заранее спасибо!

рони 08.01.2023 17:47

dvbshka,
информации недостаточно ...
let timer;
            $("body").on('scroll', function() {
                window.clearTimeout(timer);
                $('.main .chatbox > .contents > .date').show();
                timer = window.setTimeout(function() {
                    $('.main .chatbox > .contents > .date').hide();
                }, 100)
            })

dvbshka 08.01.2023 20:01

Вложений: 1
Да, это работает как мне нужно, но оно саму дату не выводит почему то(
Просто черное пятно при скролле появляется и все.
Думаю это связанно с тем, что к скроллу нужно как то привязать действие или какой то триггер, который как в моем примере будет выводить дату, только у меня при наведении мыши она показывается, а нужно чтобы при скролле цеплялась к сообщению и показывала его дату.
Типо чтобы работало как в телеграмм, скроллишь и сверху показывается дата.

В консоли браузера, у каждого сообщения все данные есть



Скидываю файлы, которые связанны с этим делом, может сможете помочь(

В chatbox.php 115 по 117 строки.
В middle.js 153 по 164 строки (это то что я скидывал изначально)
messages.js тоже как то связан с датами итд.

Вложение 4872

рони 09.01.2023 05:18

dvbshka,
пробуйте ...
let timer, show = false;
            $("body").on('scroll', function() {
                window.clearTimeout(timer);
                if (!show) {
                    $("[message_sent_on]").each(function(i, el) {
                        let message_sent_on = el.getAttribute("message_sent_on");
                        el.querySelector("span").textContent = message_sent_on;
                        $(el).show();
                    })
                    show = true;
                }
                timer = window.setTimeout(function() {
                    $("[message_sent_on]").hide();
                    show = false;
                }, 100)
            })

dvbshka 09.01.2023 12:12

рони,

Теперь происходит такая вещь.

Даты появились у каждого сообщения слева и не исчезают, при этом когда скроллишь, то все моргает, дата, сами сообщения,даже если остановить скролл.((

В консоли браузера стили меняются постоянно вот так:





Хотелось бы, чтобы дата выводилась при скролле один раз вверху страницы, а не у каждого сообщения.
Как в первом моем сообщении, но там это работает только при наведении на элемент.
Всю голову сломал, с js вообще не дружу:(


Может как то нужно привязаться к дате, которая сейчас по середине выводится (она показывается один раз, у первого сообщения за сутки) и с помощью этого показывать при скролле вверху эту дату?


рони 09.01.2023 12:16

dvbshka,
параметр 100, попробуйте увеличить от 300 до 800, может поможет.

dvbshka 09.01.2023 12:18

рони,
Пробовал, тоже самое, но с большим интервалом

рони 09.01.2023 12:22

dvbshka,
ваши описания важны, но мне они слабо помогают разобраться, что вы хотите сделать и как это можно сделать, пока без вариантов.

dvbshka 09.01.2023 14:20

рони,

Я понимаю, извините, просто сам не могу в голове собрать то, каким методом это сделать.

Хотел, чтобы работало вот так:

Чтобы сверху дата была закреплена при скролле и менялась в зависимости от даты сообщений как в этом видео из телеграмм.

https://cloud.nexofix.ru/index.php/s/YQgW4dGgLB3tQTd

Видео по ссылке, так как здесь нельзя добавлять mp4 файлы.

рони 09.01.2023 14:47

dvbshka,
мысли вслух: нужно сделать отдельный блок, в который будет выводится дата, ближайшего к верху окна сообщения.
и макет бы сделать ...

[html run]
... минимальный код страницы с вашей проблемой
[/html]

О том, как вставить в сообщение исполняемый javascript и html-код, а также о дополнительных возможностях форматирования - читайте http://javascript.ru/formatting.

dvbshka 09.01.2023 14:58

рони,
спасибо за совет, буду ковыряться, но чувствую шансов на успех, чуть больше чем 0 :)

рони 09.01.2023 15:26

дата сообщения при скролле
 
dvbshka,
про макет...

<!DOCTYPE html>
<html>
<head>
    <title>Untitled</title>
    <meta charset="utf-8">
    <style type="text/css">
        .message {
            height: 100px;
            width: 100%;
            border: 1px solid red;
        }
        .chat_messages {
            height: 300px;
            width: 400px;
        }
        .show_data {
            border: 5px solid #FFFF00;
            height: 40px;
            width: 100px;
            position: fixed;
            opacity: 0;
            transition: .6s;
        }
        .show_data.show {
            opacity: 1;
        }
    </style>
    <script>
        document.addEventListener("DOMContentLoaded", function() {
            let timer;
            let div = document.querySelector(".show_data");
            document.addEventListener("scroll", function() {
                window.clearTimeout(timer);
                let lis = document.querySelectorAll(".message");
                let li;
                for (li of lis) {
                    let {
                        top
                    } = li.getBoundingClientRect();
                    if (top > 0) {
                        let date = li.querySelector(".date");
                        let txt = date.getAttribute("message_sent_on");
                        div.textContent = txt;
                        div.classList.add("show");
                        break;
                    }
                }
                timer = window.setTimeout(function() {
                    div.classList.remove("show")
                }, 100)
            })
        })
    </script>
</head>
<body>
    <div class="chat_messages">
        <div class="show_data"></div>
        <ul>
            <li class="message"><span class="date" message_sent_on=1><span></span></span>
            </li>
            <li class="message"><span class="date" message_sent_on=2><span></span></span>
            </li>
            <li class="message"><span class="date" message_sent_on=3><span></span></span>
            </li>
            <li class="message"><span class="date" message_sent_on=4><span></span></span>
            </li>
            <li class="message"><span class="date" message_sent_on=5><span></span></span>
            </li>
            <li class="message"><span class="date" message_sent_on=6><span></span></span>
            </li>
            <li class="message"><span class="date" message_sent_on=7><span></span></span>
            </li>
            <li class="message"><span class="date" message_sent_on=8><span></span></span>
            </li>
            <li class="message"><span class="date" message_sent_on=9><span></span></span>
            </li>
            <li class="message"><span class="date" message_sent_on=10><span></span></span>
            </li>
        </ul>
    </div>
</body>
</html>

dvbshka 09.01.2023 16:29

рони,
Спасибо огромное!!! Понял с вашим шаблоном как это должно работать!
Буду пробовать, думаю это именно тот вариант, который мне нужен :thanks:


Часовой пояс GMT +3, время: 06:35.