Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Цитировать сообщение свайпом (https://javascript.ru/forum/misc/85430-citirovat-soobshhenie-svajjpom.html)

Ubivectel 19.08.2023 11:14

Цитировать сообщение свайпом
 
Привет мир!

Местный профессор написал вот такой скрипт, который прекрасно работает, вот он:

document.addEventListener("click", ({ target }) => {
    if (target = target.closest('.qutes')) {
        target = target.closest('.KIDE_msg_top')
        let clon = target.cloneNode(true); // Делаем копию узла с потомками
        clon.querySelectorAll(".KIDE_quote").forEach(el => el.remove()); // Удаляем из копии все span.KIDE_msg
        let text = clon.textContent.trim(); // Берем текст из клона
        if (text.length > 60) text = text.slice(0, 60) + '...'
        kide.insertSmile(`[QUOTE]${text}[/QUOTE]\n`); // ставляем текст в инпут
    }
});


Код цитирует сообщения в чате. Очень захотелось научить телефон делать это свайпом, нашел такой код:

let start = null;
swipeElement.addEventListener("touchstart", function (event) {
    if (event.touches.length === 1) {
        start = event.touches.item(0).clientX;
    } else {
        start = null;
    }
});

swipeElement.addEventListener("touchend", function (event) {
    let offset = 100;
    if (start) {
        let end = event.changedTouches.item(0).clientX;
        if (end < start - offset) {
            console.log('Swipe right');
        }
    }
});


Но совместить их явно не для моих пока способностей, я долго пытался справиться самостоятельно, честно)))) :help:

рони 19.08.2023 20:19

touch swap event
 
Ubivectel,
пробуй...
let touch_y, touch_x;
        document.addEventListener("touchstart", (event) => {
            let target = event.target;
            if (target = target.closest('.qutes')) {
                touch_y = event.changedTouches[event.changedTouches.length - 1].clientY;
                touch_x = event.changedTouches[event.changedTouches.length - 1].clientX;
            }
        })
        document.addEventListener("touchend", (event) => {
            let target = event.target;
            if (target = target.closest('.qutes')) {
                let swap = (Math.abs(touch_y - event.changedTouches[event.changedTouches.length - 1].clientY) > 3 || Math.abs(touch_x - event.changedTouches[event.changedTouches.length - 1].clientX) > 3)
                if (swap) {
                    target = target.closest('.KIDE_msg_top')
                    let clon = target.cloneNode(true); // Делаем копию узла с потомками
                    clon.querySelectorAll(".KIDE_quote").forEach(el => el.remove()); // Удаляем из копии все span.KIDE_msg
                    let text = clon.textContent.trim(); // Берем текст из клона
                    if (text.length > 60) text = text.slice(0, 60) + '...'
                    kide.insertSmile(`[QUOTE]${text}[/QUOTE]\n`); // ставляем текст в инпут
                }
            }
        })

Ubivectel 19.08.2023 20:53

Привет рони.

Чето пока не алё, опять поди туплю. Файл:

https://noviy-kovcheg.ru/components/.../kidecustom.js

в самом конце

рони 19.08.2023 21:16

Ubivectel,
поставь скрипт отдельно там же, но действительно в конце , но не внутри чего-то. удалять тоже ничего не нужно.

Ubivectel 19.08.2023 21:21

Так?

рони 19.08.2023 21:30

Ubivectel,
да.

Ubivectel 19.08.2023 21:31

Полагаю все же внутри этого надо?

jQuery(function () {

});

Ubivectel 19.08.2023 21:31

Цитата:

Сообщение от рони (Сообщение 553053)
Ubivectel,
да.

Сделал, но таки не идет

рони 19.08.2023 21:35

Цитата:

Сообщение от Ubivectel
Сделал, но таки не идет

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

Ubivectel 19.08.2023 21:42

Аааа, а я думаю, что оно иногда вдруг срабатывает )))))))))))))
Не, хотелось бы свайп по блоку, но уже сообразил как это поменять, заработало, для полного марафета визуализировать бы как-то, думаю самое правильное будет при свайпе добавлять на пол секунды класс, скажем swiped. наверное это и сам асилю, но сегодня так изломал голову... )

Ubivectel 19.08.2023 21:43

Блоку .KIDE_msg_top имею ввиду

рони 19.08.2023 21:44

Цитата:

Сообщение от Ubivectel
хотелось бы свайп по блоку,

let touch_yy, touch_xx;
document.addEventListener("touchstart", (event) => {
    let target = event.target;
    if (target = target.closest('.KIDE_quote')) {
        touch_yy = event.changedTouches[event.changedTouches.length - 1].clientY;
        touch_xx = event.changedTouches[event.changedTouches.length - 1].clientX;
    }
})
document.addEventListener("touchend", (event) => {
    let target = event.target;
    if (target = target.closest('.KIDE_quote')) {
        let swap = (Math.abs(touch_yy - event.changedTouches[event.changedTouches.length - 1].clientY) > 30 || Math.abs(touch_xx - event.changedTouches[event.changedTouches.length - 1].clientX) > 30)
        if (swap) {
            target = target.closest('.KIDE_msg_top')
            let clon = target.cloneNode(true); // Делаем копию узла с потомками
            clon.querySelectorAll(".KIDE_quote").forEach(el => el.remove()); // Удаляем из копии все span.KIDE_msg
            let text = clon.textContent.trim(); // Берем текст из клона
            if (text.length > 60) text = text.slice(0, 60) + '...'
            kide.insertSmile(`[QUOTE]${text}[/QUOTE]\n`); // ставляем текст в инпут
        }
    }
})

Ubivectel 19.08.2023 21:47

Цитата:

Сообщение от рони (Сообщение 553059)
let touch_yy, touch_xx;
document.addEventListener("touchstart", (event) => {
    let target = event.target;
    if (target = target.closest('.KIDE_quote')) {
        touch_yy = event.changedTouches[event.changedTouches.length - 1].clientY;
        touch_xx = event.changedTouches[event.changedTouches.length - 1].clientX;
    }
})
document.addEventListener("touchend", (event) => {
    let target = event.target;
    if (target = target.closest('.KIDE_quote')) {
        let swap = (Math.abs(touch_yy - event.changedTouches[event.changedTouches.length - 1].clientY) > 30 || Math.abs(touch_xx - event.changedTouches[event.changedTouches.length - 1].clientX) > 30)
        if (swap) {
            target = target.closest('.KIDE_msg_top')
            let clon = target.cloneNode(true); // Делаем копию узла с потомками
            clon.querySelectorAll(".KIDE_quote").forEach(el => el.remove()); // Удаляем из копии все span.KIDE_msg
            let text = clon.textContent.trim(); // Берем текст из клона
            if (text.length > 60) text = text.slice(0, 60) + '...'
            kide.insertSmile(`\n`); // ставляем текст в инпут
        }
    }
})

Да, именно так и сделал, мало помалу вс е же учусь, многое уже сам делаю )

рони 19.08.2023 21:47

Ubivectel,
ок!:victory:

Ubivectel 19.08.2023 21:52

Что-то бы такое еще добавить:

if (end < start - offset) {
            console.log('Swipe right');
            swipeElement.classList.add('swiped');
            setTimeout(function () {
                swipeElement.classList.remove('swiped');
            }, 300);
        }


Что бы было не только функционально, но и красиво

рони 19.08.2023 22:13

Ubivectel,
как вариант...
let touch_yy, touch_xx;
document.addEventListener("touchstart", (event) => {
    let target = event.target;
    if (target = target.closest('.KIDE_quote')) {
        touch_yy = event.changedTouches[event.changedTouches.length - 1].clientY;
        touch_xx = event.changedTouches[event.changedTouches.length - 1].clientX;
    }
})
document.addEventListener("touchend", (event) => {
    let target = event.target;

    if (target = target.closest('.KIDE_quote')) {
        let swap = (Math.abs(touch_yy - event.changedTouches[event.changedTouches.length - 1].clientY) > 30 || Math.abs(touch_xx - event.changedTouches[event.changedTouches.length - 1].clientX) > 30)
        if (swap) {
            target = target.closest('.KIDE_msg_top');
            target.classList.add('swiped');
            setTimeout(function () {
                target.classList.remove('swiped');
            }, 300);
            let clon = target.cloneNode(true); // Делаем копию узла с потомками
            clon.querySelectorAll(".KIDE_quote").forEach(el => el.remove()); // Удаляем из копии все span.KIDE_msg
            let text = clon.textContent.trim(); // Берем текст из клона
            if (text.length > 60) text = text.slice(0, 60) + '...'
            kide.insertSmile(`[QUOTE]${text}[/QUOTE]\n`); // ставляем текст в инпут
        }
    }
})

Ubivectel 19.08.2023 22:18

Добавил, что-то пошло не так

рони 19.08.2023 22:19

Ubivectel,
css добавил?
.KIDE_msg_top.swiped{ ...}

Ubivectel 19.08.2023 22:25

Ну вот сейчас добавил css, но класс и в инспекторе не появляется, и цитаты не вставляются :(

рони 19.08.2023 22:32

Ubivectel,
}, 300);
время увеличить попробуй

рони 19.08.2023 22:35

Ubivectel,
работает.

рони 19.08.2023 22:37

Ubivectel,
.KIDE_msg_top.swiped .KIDE_quote{ color : red}

Ubivectel 19.08.2023 22:42

Поигрался со временем, когда выставил 2000 мс сработало пару раз через раз. не понимаю, сейчас опять не реагирует

рони 19.08.2023 22:42

работало уже при 600 всё

рони 19.08.2023 22:44

Ubivectel,
30 замени на 3 - let swap = (Math.abs(touch_yy - event.changedTouches[event.changedTouches.length - 1].clientY) > 30 || Math.abs(touch_xx - event.changedTouches[event.changedTouches.length - 1].clientX) > 30)

Ubivectel 19.08.2023 22:45

Да, при 600 тоже несколько раз срабатывало, но сейчас опять нет

Ubivectel 19.08.2023 22:49

Цитата:

Сообщение от рони (Сообщение 553072)
Ubivectel,
30 замени на 3 - let swap = (Math.abs(touch_yy - event.changedTouches[event.changedTouches.length - 1].clientY) > 30 || Math.abs(touch_xx - event.changedTouches[event.changedTouches.length - 1].clientX) > 30)

Сделал, не хочет (

Ubivectel 19.08.2023 22:55

Закономерность заметил, цитируются только сообщения содержащие цитаты

рони 19.08.2023 22:55

if (target = target.closest('.KIDE_quote'))

верни .KIDE_msg_top

рони 19.08.2023 22:58

Ubivectel,
в двух местах

Ubivectel 19.08.2023 23:00

Да, заработало, для полного счастья остается понять, как поменять направление свайпа, и его длину/продолжительность, а там уже останется настроить и дописать css

Ubivectel 19.08.2023 23:04

.clientX) > 3) и .clientY) > 3 продолжительность как я понял?

рони 19.08.2023 23:05

Цитата:

Сообщение от Ubivectel
как поменять направление свайпа,

код перед тобой
let swap = (Math.abs(touch_yy - event.changedTouches[event.changedTouches.length - 1].clientY) > 30 || Math.abs(touch_xx - event.changedTouches[event.changedTouches.length - 1].clientX) > 30)

типа ...

let swap = touch_xx - event.changedTouches[event.changedTouches.length - 1].clientX < -20;

рони 19.08.2023 23:10

рони,
Math.abs - направление неважно

Ubivectel 19.08.2023 23:11

Уразумел, спасибо рони, мне кажется ты все же знаешь какой-то никому неизвестный JS )))) Пошел ковырять настройки :thanks:


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