Использование клавиш со стрелками в jQuery scrollTo

Я успешно реализовал подключаемый модуль scrollTo jQuery, который при нажатии на ссылку выполняет прокрутку к следующему div с классом «новый». Однако я также хотел бы иметь возможность использовать клавиши со стрелками для прокрутки вверх и вниз к следующему / предыдущему div того же класса.

Я просмотрел весь Интернет, но не смог найти, как это сделать. Я новичок в JS, поэтому очень простые инструкции будут оценены!

Вот соответствующий код:

<script type="text/javascript">
jQuery(function($){

 $('<div id="next_arrow"></div>') 
  .prependTo("body") //append the Next arrow div to the bottom of the document
  .click(function(){ 
   scrollTop = $(window).scrollTop();
   $('.new').each(function(i, h2){ // loop through article headings
    h2top = $(h2).offset().top; // get article heading top
    if (scrollTop < h2top) { // compare if document is below heading
     $.scrollTo(h2, 800); // scroll to in .8 of a second
     return false; // exit function
    }
   });
  });

});
</script>

Что мне нужно добавить к этому, чтобы клавиши со стрелками работали?

Спасибо, Тед


person Ted    schedule 30.01.2010    source источник


Ответы (3)


Вы можете использовать прослушиватель событий keydown для прослушивания нажатий клавиш. Вы можете использовать это в &lt;input&gt; полях и т.п. Поскольку события нажатия клавиш всплывают вверх по DOM, вы можете использовать их на объекте document, чтобы поймать любое нажатие клавиши на страница:

$(function () {
  $(document).keydown(function (evt) {
    alert("Key pressed: " + evt.keyCode);
  });
});

Каждое нажатие клавиши имеет код. Если вы используете приведенный выше код на своей веб-странице, вы увидите, что код клавиши для стрелки вниз - 40. Вы можете выделить это с помощью оператора if или switch в обработчике:

jQuery(function () {

  $(document).keydown(function (evt) {
    if (evt.keyCode == 40) { // down arrow
      alert("You pressed down.");
    }
  });

});

Теперь вам нужно привязать код, который фактически переходит к следующему заголовку. Я рекомендую абстрагировать код в функции, чтобы вы могли использовать его как для нажатия клавиш, так и для щелчков. Вот функция вместе с вариантом исходного кода, который ее использует:

// Here is the function:

function scrollToNew () {
  scrollTop = $(window).scrollTop();
  $('.new').each(function(i, h2){ // loop through article headings
    h2top = $(h2).offset().top; // get article heading top
    if (scrollTop < h2top) { // compare if document is below heading
      $.scrollTo(h2, 800); // scroll to in .8 of a second
      return false; // exit function
    }
  });
}

// Here is your original code, modified to use the function:

jQuery(function () {

  $("#next").click(scrollToNew);

});

Наконец, вы можете добавить код нажатия клавиш и вызвать функцию оттуда:

function scrollToNew () {
  scrollTop = $(window).scrollTop();
  $('.new').each(function(i, h2){ // loop through article headings
    h2top = $(h2).offset().top; // get article heading top
    if (scrollTop < h2top) { // compare if document is below heading
      $.scrollTo(h2, 800); // scroll to in .8 of a second
      return false; // exit function
    }
  });
}

jQuery(function () {

  $("#next").click(scrollToNew);

  $(document).keydown(function (evt) {
    if (evt.keyCode == 40) { // down arrow
      evt.preventDefault(); // prevents the usual scrolling behaviour
      scrollToNew(); // scroll to the next new heading instead
    }
  });

});

Обновление. Чтобы прокрутить вверх, выполните два действия. Измените обработчик keydown на:

  $(document).keydown(function (evt) {
    if (evt.keyCode == 40) { // down arrow
      evt.preventDefault(); // prevents the usual scrolling behaviour
      scrollToNew(); // scroll to the next new heading instead
    } else if (evt.keyCode == 38) { // up arrow
      evt.preventDefault();
      scrollToLast();
    }
  }

и напишите scrollToLast() функцию на основе scrollToNew(), которая находит последний новый заголовок, которого нет на странице:

function scrollToLast () {
  scrollTop = $(window).scrollTop();

  var scrollToThis = null;

  // Find the last element with class 'new' that isn't on-screen:
  $('.new').each(function(i, h2) {
    h2top = $(h2).offset().top;
    if (scrollTop > h2top) {
      // This one's not on-screen - make a note and keep going:
      scrollToThis = h2;
    } else {
      // This one's on-screen - the last one is the one we want:
      return false;
    }
  });

  // If we found an element in the loop above, scroll to it:
  if(scrollToThis != null) {
    $.scrollTo(scrollToThis, 800);
  }
}
person davegurnell    schedule 30.01.2010
comment
Большое спасибо, это работает! Что мне нужно добавить, чтобы пользоваться клавишами со стрелками вверх? - person Ted; 30.01.2010
comment
Большое спасибо! Прекрасно работает. - person Ted; 31.01.2010

Просто для большего понимания работы с массивами.

var panel_arr = new Array();
$(document).ready(function(e) {

    $('.parallax-panel-wrapper').each(function(i, element){ 
        panel_arr.push( $(this).attr("id") );
    });

    var current_parallax_panel_no   = 0;
    $(document).keydown(function (evt) {
        if (evt.keyCode == 40) { // down arrow
            evt.preventDefault(); // prevents the usual scrolling behaviour
            if(current_parallax_panel_no < (panel_arr.length-1)) current_parallax_panel_no++;
            scrollByArrowKeys(1);               
        } else if (evt.keyCode == 38) { // up arrow
            evt.preventDefault(); // prevents the usual scrolling behaviour
            if(current_parallax_panel_no >= 1) current_parallax_panel_no--;
            scrollByArrowKeys(0); 
        }
    });

    function scrollByArrowKeys(add_more){
        scrollToThis = (($("#" + panel_arr[current_parallax_panel_no]).offset().top)  + add_more ; // get element top
        $.scrollTo(scrollToThis, 800);      
    }

});
person user1418777    schedule 26.05.2012

Вам нужно зафиксировать событие нажатия клавиши и решить, какой код клавиши был нажат.

$(document).keypress(function(e) {
    switch(e.keyCode) { 
        case 37:
            //left arrow pressed
        break;
        case 39:
            //right arrow pressed
        break;
    }
});
person PetersenDidIt    schedule 30.01.2010