Вопрос специфический:
Если вы установите интервал для прокрутки, он будет продолжать работать до тех пор, пока вы не уберете мышь, когда вы сможете очистить этот интервал, используя идентификатор, который возвращает функция.
У вас есть if (hover = true) {
, который должен быть if (hover === true) {
, или, поскольку это логическое значение, просто используйте это if (hover) {
, хотя я не вижу причины для его использования здесь.
Примечание«this» здесь this.intervalId
- это элемент с #down1
, но он работает здесь, так как он есть в обоих обработчиках событий, возможно, было бы лучше использовать пространство имен, например var myApp ={intervalId:null,scrollElement:function(scrollTarget, scrollBy) {}};
, на которое ссылаются как myApp.intervalId
, и вызываемую функцию(а не глобальный, например var intervalId;
)
Необязательно:
Вы также можете создать функцию, как я иллюстрирую, и вызывать ее, передавая параметры, вы можете дажезатем сможете повторно использовать эту функцию.
Замечания:
- Я не фанат
<br />
, просто чтобы добавить пробел, поэтому я удалил его и добавил отступ ввместо родительского - Вместо
<p></p>
рассмотрим <div>
с полем или отступом для пробелов - Я заметил, что у вас есть куча нумерованных классов. Если вы нацелены на них по какой-то причине, хорошо, но вместо этого вы также можете определить индекс элемента, например, jQuery имеет индекс на основе 0, например
$('.likeavoid').index();
или если вы знаете значение индекса $('.likeavoid').eq(5);
для целевого - Я добавил пример хранения значения интервала в разметке элемента, если вы расширите его на все значения, то сможете использовать одни и те же события для нескольких групп элементов.
- Вы также можете сгладитьпрокрутка по ссылке: Плавная прокрутка при нажатии на ссылку привязки
function scrollElement(scrollTarget, scrollBy) {
scrollTarget.scrollTop(scrollTarget.scrollTop() + scrollBy);
}
$("#down1").on({
mouseenter: function(event) {
// these could also be stored on event.target like I did for the interval
let scrollAmount = 150; //amount could be stored
let scrollTarget = $('#avoidOptions'); //id could be stored
let timeInterval = $(event.target).data("scroll-interval");
this.intervalId = window.setInterval(scrollElement, timeInterval, scrollTarget, scrollAmount);
},
mouseleave: function(event) {
window.clearInterval(this.intervalId);
}
});
.scrollingOptions {
height: 30vh;
width: 100%;
overflow: auto;
z-index: 1000;
padding-bottom: 1em;
}
.scroller {
border: solid 1px #EEEEEE;
background-color: #eeffff;
margin-top: 1em;
}
.likeavoid {
border: dashed 1px #EEEEEE;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div class='scrollingOptions' id='avoidOptions'>
<p class='likeavoid avoid1'>1</p>
<p class='likeavoid avoid2'>2</p>
<p class='likeavoid avoid3'>3</p>
<p class='likeavoid avoid4'>4</p>
<p class='likeavoid avoid5'>5</p>
<p class='likeavoid avoid6'>6</p>
<p class='likeavoid avoid7'>7</p>
<p class='likeavoid avoid8'>8</p>
<p class='likeavoid avoid9'>9</p>
<p class='likeavoid avoid10'>10</p>
<p class='likeavoid avoid11'>11</p>
</div>
<div class='scroller white text-center' id='down1' data-scroll-interval="1000"> Scroll Down - Hover Here</div>
UNTESTED на мобильном устройстве: опция комментария реагирует на мобильное устройство согласно спецификации. ссылка https://developer.mozilla.org/en-US/docs/Web/API/Touch_events/Supporting_both_TouchEvent_and_MouseEvent
function scrollElement(scrollTarget, scrollBy) {
scrollTarget.scrollTop(scrollTarget.scrollTop() + scrollBy);
}
function enterHandler(event) {
// these could also be stored on event.target like I did for the interval
let scrollAmount = 150; //amount could be stored
let scrollTarget = $('#avoidOptions'); //id could be stored
let timeInterval = $(event.target).data("scroll-interval");
this.intervalId = window.setInterval(scrollElement, timeInterval, scrollTarget, scrollAmount);
event.preventDefault();
}
function leaveHandler(event) {
window.clearInterval(this.intervalId);
event.preventDefault();
}
$("#down1")
.on('touchstart', enterHandler).on('touchend', leaveHandler)
.on('mouseenter', enterHandler).on('mouseleave', leaveHandler);
.scrollingOptions {
height: 30vh;
width: 100%;
overflow: auto;
z-index: 1000;
padding-bottom: 1em;
}
.scroller {
border: solid 1px #EEEEEE;
background-color: #eeffff;
margin-top: 1em;
}
.likeavoid {
border: dashed 1px #EEEEEE;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div class='scrollingOptions' id='avoidOptions'>
<p class='likeavoid avoid1'>1</p>
<p class='likeavoid avoid2'>2</p>
<p class='likeavoid avoid3'>3</p>
<p class='likeavoid avoid4'>4</p>
<p class='likeavoid avoid5'>5</p>
<p class='likeavoid avoid6'>6</p>
<p class='likeavoid avoid7'>7</p>
<p class='likeavoid avoid8'>8</p>
<p class='likeavoid avoid9'>9</p>
<p class='likeavoid avoid10'>10</p>
<p class='likeavoid avoid11'>11</p>
</div>
<div class='scroller white text-center' id='down1' data-scroll-interval="1000"> Scroll Down - Hover Here</div>