Я создал простой пользовательский слайдер, в котором пользователь может щелкнуть элемент из сетки и отобразит содержимое выбранного элемента, а также позволит пользователям перемещаться по другому содержимому сетки элементы с левой и правой стрелками клавиатуры.обнаружение событий с помощью пользовательского jQuery слайдера и клавиш клавиатуры
HTML-структура выглядит следующим образом:
<div class="grid-container"> <!-- this is the grid container -->
<div class="grid-item" tabindex="1"> <!-- grid item -->
<div class="grid-item-preview"> <!-- preview container -->
<img class="grid-item-preview-image" src="http://placehold.it/360x240" />
</div>
<div class="grid-item-content"> <!-- content container, hidden at first and opens when the user clicks on the preview container -->
<div class="grid-item-content-left">
<img class="grid-item-original-image" src="http://placehold.it/640x480?text=Item1" />
</div>
<div class="grid-item-content-right">
<h3 class="grid-item-title">
This is a test item
</h3>
<p class="grid-item-text">
This is some filler text
</p>
</div>
</div>
</div>
</div>
Проблема заключается в том, что, с кодом у меня есть, JQuery только проходит один раз корыто HTML элементов и, если пользователь снова нажимает клавиши со стрелками, это просто не работает снова, если пользователь не закрывается и снова открывает новый элемент сетки.
Мои JS/JQuery код выглядит следующим образом:
$(document).ready(function() {
$('.grid-item')
.on('click', function() {
$(this).toggleClass('open-grid-item');
$(this).find('.grid-item-content').fadeToggle();
})
.on('keydown', function(event) {
if($(this).hasClass('open-grid-item')) {
switch(event.keyCode) {
case 37: $(this) //User press left arrow
.removeClass('open-grid-item') //Removes class
.find('.grid-item-content') //Find the content container
.fadeOut() //Fade out content container
.parent() //Traverses to parent div .grid-item
.prev('.grid-item') //Traverses to previous div .grid-item
.addClass('open-grid-item') //Add class open grid
.find('.grid-item-content') //Traverses to content container of the new div
.fadeIn(); //Shows content div
break;
case 39: $(this)
.removeClass('open-grid-item') //Same as before, but traverses to next .grid-item
.find('.grid-item-content')
.fadeOut()
.parent()
.next('.grid-item')
.addClass('open-grid-item')
.find('.grid-item-content')
.fadeIn();
break;
}
}
});
});
У меня есть jsfiddle с рабочим демо здесь: https://jsfiddle.net/wuzrcnus/4/
Как я могу изменить свой код, чтобы позволить пользователю перемещаться по всей сетке предметы со стрелками? Благодарю.
спасибо! работает как шарм! – Erzei
Вы тестировали его в Chrome или Safari? – ElChiniNet
У меня нет Chrome или Safari, но согласно [this] (http://stackoverflow.com/questions/6311290/keypress-event-not-working-in-ie-and-chrome-but-working- in-ff) 'keypress' не работает в chrome или Safari на некоторых клавишах, поэтому меняйте' keypress' на 'keyup' и он должен работать во всех браузерах. – razzak