Запретить автопрокрутку при условии
Привет мир.
Имеем чат, сообщения выводятся внизу и автоматически прокручиваются, однако это неудобно кода читаешь переписку выше, вроде как нашел два фрагмента кода которые это делают: if (this.order == "bottom") { this.insertAfter(nodo, insertO.lastChild); } else insertO.insertBefore(nodo, insertO.firstChild); if (!yo && this.sound == 1) this.play_msg_sound(); this.ajustar_scroll(); kide.ajustar_scroll = function() { if (kide.scrolling) return; if (kide.order == "bottom") kide.attr( "KIDE_msgs", "scrollTop", kide.attr("KIDE_msgs", "scrollHeight") ); else kide.attr("KIDE_msgs", "scrollTop", 0); }; Но как дописать условие толку как всегда не хватает :help: |
Ах да, не написал чего хочу ))) Запретить прокрутку если сдержимое дива не равно bottom: 0;
|
Перед добавлением нового сообщения посмотрите на scrollTop контентной области, если она прокручена не максимально, не скрольте страницу.
|
Я логику-то как раз понимаю, моя беда синтаесис (
|
Ubivectel,
пробуй ... let scroll = true; if (this.order == "bottom") { scroll = this.attr("KIDE_msgs", "scrollTop") > (this.attr("KIDE_msgs", "scrollHeight") - this.attr("KIDE_msgs", "clientHeight")); this.insertAfter(nodo, insertO.lastChild); } else insertO.insertBefore(nodo, insertO.firstChild); if (!yo && this.sound == 1) this.play_msg_sound(); if(scroll) this.ajustar_scroll(); |
Хммм, не сработало, вот оно: https://noviy-kovcheg.ru/smoking
|
Ubivectel,
kide.js в строке 202 и прочих пусто |
Не в тот шаблон внес изменения, торможу, сейчас звменил там где надо, но не срабатывает (
|
Ubivectel,
верни как было всё. |
Сделал
|
Ubivectel,
замени целиком kide.ajustar_scroll = function() { if (kide.scrolling) return; let scroll = kide.attr("KIDE_msgs", "scrollTop") - (kide.attr("KIDE_msgs", "scrollHeight") - kide.attr("KIDE_msgs", "clientHeight")); if(scroll < -100) return; if (kide.order == "bottom") kide.attr( "KIDE_msgs", "scrollTop", kide.attr("KIDE_msgs", "scrollHeight") ); else kide.attr("KIDE_msgs", "scrollTop", 0); }; |
Сделал вроде
|
Ubivectel,
что-то не так, верни всё всё как было, потом скопируй #11 и замени |
Вроде бы все четко сейчас сделал, не прокручивает, но и новые сообщения не отображаются
|
Цитата:
|
Ubivectel,
или где -то стёр пару элементов let audio = document.getElementById('song'); ?? let ulcontent = document.querySelector('.ulcontent'); ?? |
Вот дефолт:
kide.insertNewContent = function( uid, name, text, url, ti, color, rango, id, sesion, yo, hora, img ) { if (text.replace(/ /g, "") != "") { let c = color.length > 0 ? 'style="color:#' + color + '" class="KIDE_msg"' : 'class="KIDE_dc_' + this.rangos[rango] + ' KIDE_msg"'; let div = this.$("KIDE_msgs"); let nodo = document.createElement("div"); let insertO = this.$("KIDE_output"); let s_hora; let bquote = document.querySelector("#insertmsg"); nodo.setAttribute("id", "KIDE_id_" + id); nodo.setAttribute("class", "KIDE_msg_top"); if (this.show_hour) s_hora = '<span title="' + ti + '" class="KIDE_msg_hour">' + hora + "</span> "; else s_hora = ""; let tmp = ""; if (img && kide.show_avatar) { let style = kide.avatar_maxheight ? 'style="max-height:' + kide.avatar_maxheight + '" ' : ""; tmp = "<img " + style + 'src="' + img + '" class="KIDE_icono" alt="" /> '; } nodo.innerHTML = s_hora + tmp + '<span style="cursor: pointer" class="KIDE_' + this.rangos[rango] + '" onclick="kide.insertSmile(\'' + //mod name + ", ')\" oncontextmenu=\"event.preventDefault();document.querySelector(\'.overlayo\').style.display = \'block\';kide.mensaje('" + name + "', " + uid + ", " + id + ", '" + url + "', '" + ti + "', '" + sesion + "', " + rango + ", '" + img + "')\">" + name + "</span>: <span " + c + ">" + this.filter_smilies(text) + "</span>" + "<i class='fa fa-reply qutes' title='Цитировать' aria-hidden='true'></i>" + "<i class='fa fa-clipboard K_copy' title='Копировать' aria-hidden='true'></i>" + //mod "<span class='editors'><i class='fa fa-pencil' title='Редактировать' aria-hidden='true'></i></span>"; //mod if (this.order == "bottom") { this.insertAfter(nodo, insertO.lastChild); } else insertO.insertBefore(nodo, insertO.firstChild); if (!yo && this.sound == 1) this.play_msg_sound(); this.ajustar_scroll(); } }; Вот модификация: kide.insertNewContent = function ( uid, name, text, url, ti, color, rango, id, sesion, yo, hora, img ) { if (text.replace(/ /g, "") != "") { let c = color.length > 0 ? 'style="color:#' + color + '" class="KIDE_msg"' : 'class="KIDE_dc_' + this.rangos[rango] + ' KIDE_msg"'; let div = this.$("KIDE_msgs"); let nodo = document.createElement("div"); let insertO = this.$("KIDE_output"); let s_hora; let bquote = document.querySelector("#insertmsg"); nodo.setAttribute("id", "KIDE_id_" + id); nodo.setAttribute("class", "KIDE_msg_top"); if (this.show_hour) s_hora = '<span title="' + ti + '" class="KIDE_msg_hour">' + hora + "</span> "; else s_hora = ""; let tmp = ""; if (img && kide.show_avatar) { let style = kide.avatar_maxheight ? 'style="max-height:' + kide.avatar_maxheight + '" ' : ""; tmp = "<img " + style + 'src="' + img + '" class="KIDE_icono" alt="" /> '; } nodo.innerHTML = s_hora + tmp + '<span style="cursor: pointer" class="KIDE_' + this.rangos[rango] + '" onclick="kide.insertSmile(\'' + //mod name + ", ')\" oncontextmenu=\"event.preventDefault();document.querySelector(\'.overlayo\').style.display = \'block\';kide.mensaje('" + name + "', " + uid + ", " + id + ", '" + url + "', '" + ti + "', '" + sesion + "', " + rango + ", '" + img + "')\">" + name + "</span>: <span " + c + ">" + this.filter_smilies(text) + "</span>" + "<i class='fa fa-reply qutes' title='Цитировать' aria-hidden='true'></i>" + "<i class='fa fa-clipboard K_copy' title='Копировать' aria-hidden='true'></i>" + //mod "<span class='editors'><i class='fa fa-pencil' title='Редактировать' aria-hidden='true'></i></span>"; //mod /* if (this.order == "bottom") { this.insertAfter(nodo, insertO.lastChild); } else insertO.insertBefore(nodo, insertO.firstChild); if (!yo && this.sound == 1) this.play_msg_sound(); this.ajustar_scroll(); */ kide.ajustar_scroll = function () { if (kide.scrolling) return; let scroll = kide.attr("KIDE_msgs", "scrollTop") - (kide.attr("KIDE_msgs", "scrollHeight") - kide.attr("KIDE_msgs", "clientHeight")); if (scroll < -100) return; if (kide.order == "bottom") kide.attr( "KIDE_msgs", "scrollTop", kide.attr("KIDE_msgs", "scrollHeight") ); else kide.attr("KIDE_msgs", "scrollTop", 0); }; } }; Не вижу в чем ошибаюсь ( |
Ubivectel,
бред какой то -- восстанови обе функции(kide.insertNewContent и kide.ajustar_scroll ) как они были, потом если всё заработает , kide.ajustar_scroll попробуй заменить. |
Цитата:
|
Алилуйя, только дошло, что менял не ту функцию )))))))) Спасибо рони, вроде все как надо! :thanks:
|
Ubivectel,
ок! if(scroll < -100) -100 можно подстроить, если нужно, от -50 до -300 |
Я правильно понимаю, что это диапазон прокрутки с которого начнет работать условие? Т.е. если прокручено меньше -50 / -300 то автопрокрутка будет срабатывать?
|
Ubivectel,
да |
Привет мир!
Взбрела в голову мысль добавить счетчик сообщений, если скролл не = 0, сделал так: kide.ajustar_scroll = function () { if (kide.scrolling) return; let scroll = kide.attr("KIDE_msgs", "scrollTop") - (kide.attr("KIDE_msgs", "scrollHeight") - kide.attr("KIDE_msgs", "clientHeight")); if (scroll < -300) { document.getElementById('kide-counter').textContent = newMessageCount; return; } if (kide.order == "bottom") kide.attr("KIDE_msgs", "scrollTop", kide.attr("KIDE_msgs", "scrollHeight")); else kide.attr("KIDE_msgs", "scrollTop", 0); }; Работает и считает все хорошо, хоть убей не могу заставить код делать document.getElementById('kide-counter').textContent = ''; Когда пользователь возвращает прокрутку блока id="KIDE_msgs" вниз ( :help: |
Ubivectel,
как вариант если находясь внизу, отправить сообщение, то счётчик обнулится. kide.ajustar_scroll = function() { if (kide.scrolling) return; let scroll = kide.attr("KIDE_msgs", "scrollTop") - (kide.attr("KIDE_msgs", "scrollHeight") - kide.attr("KIDE_msgs", "clientHeight")); if (scroll < -300) { document.getElementById('kide-counter').textContent = newMessageCount; return; } if (kide.order == "bottom") { kide.attr("KIDE_msgs", "scrollTop", kide.attr("KIDE_msgs", "scrollHeight")); newMessageCount = 0; document.getElementById('kide-counter').textContent = ''; } else kide.attr("KIDE_msgs", "scrollTop", 0); }; |
Что бы он обнулялся после отправки нового сообщения было довольно легко, я пытался именно добиться что бы он обнулялся сразу при прокрутке блока вниз. Чем и сломал моск не только себе, но и GPT ) Ну не верю, что нет решения для js-всемогущего )
|
Цитата:
document.querySelector("#KIDE_msgs").addEventListener("scroll", function() { let scroll = kide.attr("KIDE_msgs", "scrollTop") - (kide.attr("KIDE_msgs", "scrollHeight") - kide.attr("KIDE_msgs", "clientHeight")); if (kide.scrolling) return; if (scroll > -3) { document.getElementById("kide-counter").textContent = ""; return; } }) |
Неа, какую-то подобную конструкцию уже писал, но нет. Посмотреть тут: https://noviy-kovcheg.ru/chatФайл JS вот: https://noviy-kovcheg.ru/components/...top/js/kide.js
|
Консоль ругается на это:
document.querySelector("#KIDE_msgs").addEventListener("scroll", function() |
Цитата:
document.addEventListener("DOMContentLoaded", function() {...}); |
Алилуйя, спасибо :dance:
Вот что получилось в итоге: kide.ajustar_scroll = function () { if (kide.scrolling) return; let scroll = kide.attr("KIDE_msgs", "scrollTop") - (kide.attr("KIDE_msgs", "scrollHeight") - kide.attr("KIDE_msgs", "clientHeight")); if (scroll < -300) { document.getElementById('kide-counter').textContent = newMessageCount; document.getElementById("kide-counter").style.display = "block"; return; } if (kide.order == "bottom") kide.attr("KIDE_msgs", "scrollTop", kide.attr("KIDE_msgs", "scrollHeight")); else kide.attr("KIDE_msgs", "scrollTop", 0); }; document.addEventListener("DOMContentLoaded", function () { document.querySelector("#KIDE_msgs").addEventListener("scroll", function () { let scroll = kide.attr("KIDE_msgs", "scrollTop") - (kide.attr("KIDE_msgs", "scrollHeight") - kide.attr("KIDE_msgs", "clientHeight")); if (kide.scrolling) return; if (scroll > -3) { newMessageCount = 0; document.getElementById("kide-counter").textContent = ""; document.getElementById("kide-counter").style.display = "none"; return; } }) }); Но странно, при попытке вынести "kide-counter" в переменную: let kideCounter = document.getElementById('kide-counter'); kide.ajustar_scroll = function () { if (kide.scrolling) return; let scroll = kide.attr("KIDE_msgs", "scrollTop") - (kide.attr("KIDE_msgs", "scrollHeight") - kide.attr("KIDE_msgs", "clientHeight")); if (scroll < -300) { kideCounter.textContent = newMessageCount; kideCounter.style.display = "block"; return; } if (kide.order == "bottom") kide.attr("KIDE_msgs", "scrollTop", kide.attr("KIDE_msgs", "scrollHeight")); else kide.attr("KIDE_msgs", "scrollTop", 0); }; document.addEventListener("DOMContentLoaded", function () { document.querySelector("#KIDE_msgs").addEventListener("scroll", function () { let scroll = kide.attr("KIDE_msgs", "scrollTop") - (kide.attr("KIDE_msgs", "scrollHeight") - kide.attr("KIDE_msgs", "clientHeight")); if (kide.scrolling) return; if (scroll > -3) { newMessageCount = 0; kideCounter.textContent = ""; kideCounter.style.display = "none"; return; } }) }); В принципе без разницы, но очень интересно почему ) |
Часовой пояс GMT +3, время: 11:15. |