#javascript #html #jquery
Вопрос:
$(document).ready(function() {
$(".button1").click(function() {
$("html, body").animate({
scrollTop : $("#screen1").offset().top
}, 800);
});
})
$(document).ready(function() {
$(".button2").click(function() {
$("html, body").animate({
scrollTop : $("#screen2").offset().top
}, 800);
});
})
...and so on
Я написал приведенный выше код на javascript. При нажатии кнопки она прокручивается в положение #на экране. Тем не менее, у меня есть несколько кнопок».»и «#экран», которые в основном выполняют одну и ту же функцию. Я не хочу повторять один и тот же код, поэтому я попытался сделать это в заявлении, но не смог сделать это правильно. Каким образом я могу избежать повторения кодов в этой ситуации?
Комментарии:
1. Попробуйте использовать функцию
each()
.
Ответ №1:
Теперь я не могу видеть ваш HTML-код, но мое предложение состояло бы в том, чтобы добавить прослушиватель событий в родительский элемент для всех кнопок, а затем добавить информацию о кнопке на самой кнопке. Здесь я использую атрибут data-screen
для хранения информации о «экране».
Обновить
Я немного доработал jquery. Используя on()
вместо click()
этого, чтобы я мог удалить исходное if
утверждение. Когда прослушиватель событий находится на родительском элементе, можно динамически добавлять дополнительные кнопки, и они будут работать должным образом.
$(document).ready(function() {
$("#buttons").on("click", "button", function(e) {
var screenid = $(e.target).attr('data-screen');
$("html, body").animate({
scrollTop: $(`#screen${screenid}`).offset().top;
}, 800);
});
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div id="buttons">
<button data-screen="1">Button 1</button>
<button data-screen="2">Button 2</button>
<button data-screen="3">Button 3</button>
</div>
<div>
<div id="screen1"></div>
<div id="screen2"></div>
<div id="screen3"></div>
</div>
Комментарии:
1. Мне нравится это решение. Я бы предложил использовать
$("#buttons button")
(вместо оператора if) в качестве слушателя иconst screenid = $(this).attr('data-screen')
получить идентификатор2. @A_A спасибо за советы. Я не увлекаюсь jquery. Не это месиво лучше.
3. Вы можете использовать
.data('screen')
вместо.attr('data-screen')
: api.jquery.com/data P.S. И$(this)
вместо$(e.target)
этого .
Ответ №2:
Предполагая , что все кнопки и экраны соответствуют соглашению .button${number}
об именах, и #screen${number}
вы можете сделать это:
const numberOfSections = 5;
$(document).ready(function() {
for (let i = 1; i <= numberOfSections ; i ) {
$(`.button${i}`).click(function() {
$("html, body").animate({
scrollTop : $(`#screen${i}`).offset().top
}, 800);
});
}
});