Запретить автопрокрутку при условии
Привет мир.
Имеем чат, сообщения выводятся внизу и автоматически прокручиваются, однако это неудобно кода читаешь переписку выше, вроде как нашел два фрагмента кода которые это делают:
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, время: 21:06. |