#jquery #scroll
#jquery #прокрутка
Вопрос:
У меня есть div, который постоянно передает потоковые данные и обладает функциональностью, позволяющей ему автоматически прокручиваться вниз, постоянно отображая последнюю информацию в поле зрения пользователя.
Однако проблема с моей текущей реализацией заключается в том, что этому элементу все равно, хочет ли пользователь прокручивать вверх и видеть строки, которые были напечатаны ранее. Как только появляются новые данные POSTed
, div возвращает скроллер обратно в низ. Учитывая, что обновления происходят очень часто (~ 500 мс), это может сильно раздражать пользователя, который хочет просмотреть весь журнал на досуге.
В идеале, вот что я хочу сделать с этим div
- Когда пользователь щелкает внутри самого div или полосы прокрутки (
overflow:auto
), автопрокрутка немедленно отключается. - Как только пользователь щелкает снаружи, автопрокрутка снова включается.
- При первой загрузке страницы для div по умолчанию установлено значение «Не сфокусировано» (т. Е. автопрокрутка происходит, если пользователь нигде не нажимает)
Код:
<script type="text/javascript">
$(function () {
$("#testMonitor").everyTime(500, function () {
$("#testMonitor").attr({ scrollTop: $("#testMonitor").attr("scrollHeight") - $('#testMonitor').height() });
});
});
</script>
<script type="text/javascript">
$("div#testMonitor").attr("tabindex", -1).focusin(function () {
$("#testMonitor").attr({ scrollTop: $("testMonitor").height() });
});
</script>
Первый фрагмент — это моя автоматическая прокрутка, которая работает так, как ожидалось. Предполагается, что вторая часть установит scrollTop на «нормальную» высоту при onFocus.
Как я могу изменить свою функцию focusin, чтобы она вела себя так, как требуется?
Ответ №1:
Проще, чем вы могли подумать.
1) Создайте флаг
var autoScrollEnabled = true;
2) Измените автоматическую прокрутку, чтобы она запускалась только при значении autoScrollEnabled
$(function () {
$("#testMonitor").everyTime(500, function () {
if (autoScrollEnabled == true) {
$("#testMonitor").attr({ scrollTop: $("#testMonitor").attr("scrollHeight") - $('#testMonitor').height() });
}
});
});
3) Добавьте код для переключения автоматической прокрутки везде, где это уместно
toggleAutoScroll();
function toggleAutoScroll() {
autoScrollEnabled = !autoScrollEnabled; //! reverses the value, true becomes false, false becomes true
if (autoScrollEnabled == true) { //scroll down immediately if a.s. is reenabled
$("#testMonitor").attr({ scrollTop: $("#testMonitor").attr("scrollHeight") - $('#testMonitor').height() });
}
}
Комментарии:
1. Спасибо, ваше решение сработало. Извините, что потребовалось некоторое время, чтобы разобраться в этом, потребовалось немного времени, чтобы логика щелкнула в моей голове, а затем мне пришлось выяснить, как сделать фокус / размытие div и т.д.