Передайте уникальные идентификаторы в Javascript для горизонтальной прокрутки

0

Я пытаюсь разработать интерфейс, который прокручивает по горизонтали аналогично Netflix

Изображение 174551.

Все отображается и работает должным образом, но по какой-то причине Javascript просматривает только первые книги издателей на странице INDEX PAGE. И когда я пытаюсь навести курсор и прокрутить любые другие книги издателей, он будет только горизонтально прокручивать первые книги издателей.

Я знаю, что у меня есть # scroll, появляющийся много раз, поэтому JQuery видит только первый.

Кто-нибудь знает, как я могу передать уникальный publisher_id или класс, чтобы он работал со всеми издателями?

модели

class Publisher < ActiveRecord::Base

  has_many :characters
  has_many :books, :through => :characters

end


class Character < ActiveRecord::Base

  belongs_to :publisher
  has_many :books

end

class Book < ActiveRecord::Base

  belongs_to :character

end

Просмотры

books.html.erb

  <%# This lists all the publishers %>
  <div class="publisherbubble">

    <% @publishers.each do |publisher| %>

      <div class = "publisherbox">
        <div class = "slider triangleBtns">

          ###renders all the books
          <%= render :partial => 'static_pages/books', :locals =>{:publisher => publisher} %>

        </div>  
      </div>

    <% end %>

  </div>

_books.html.erb

  ###How can I pass/use a unique ID or class to make this work?
  <div class="scroll-container">

      <ul class="scrollertitle">     

        <% publisher.characters.sort_by{|character| character.created_at }.each do |character|%>
          <% character.books.each do |book| %>
            <li>
              <%= link_to (image_tag book.photo(:small)), 
                  publisher_character_book_issues_path(:publisher_id => publisher.id, 
                  :character_id => character.id, :book_id => book.id ) %>
            </li>
          <% end %>
        <% end %>

      </ul>

      <span class="previous sliderButton" data-scroll-modifier='-1'>
        <div class="arrow">
        </div>
      </span>

      <span class="next sliderButton" data-scroll-modifier='1'>
        <div class="arrow">
        </div>
      </span>

  </div>

Javascript

$(function () {

    var scrollHandle = 0,
        scrollStep = 5,

        ###How can I pass/use a unique ID or class to make this work?
        parent = $(this).closest('.scroll-container');

    //Start the scrolling process
    $(".sliderButton").on("mouseenter", function () {
        var data = $(this).data('scrollModifier'),
            direction = parseInt(data, 10);

        $(this).addClass('active');

        startScrolling(direction, scrollStep, parent);
    });

    //Kill the scrolling
    $(".sliderButton").on("mouseleave", function () {
        stopScrolling();
        $(this).removeClass('active');
    });

    //Actual handling of the scrolling
    function startScrolling(modifier, step, parent) {
        if (scrollHandle === 0) {
            scrollHandle = setInterval(function () {
                var newOffset = parent.scrollLeft() + (scrollStep * modifier);

                parent.scrollLeft(newOffset);
            }, 10);
        }
    }

    function stopScrolling() {
        clearInterval(scrollHandle);
        scrollHandle = 0;
    }

});

CSS

.scroll-container {
  width:auto;
  height: 100%;
  background: transparent;
  overflow-y: hidden;
  overflow-x: scroll;
  -webkit-overflow-scrolling: touch;
  margin-top: 5px;
}
  • 0
    Горизонтальная прокрутка! Я должен был реализовать это один раз. Это внизу этой страницы: dabble.co

1 ответ

1
Лучший ответ

Во-первых, я бы предоставил родительскому div класс, например scroll-container.

Затем я передал родительский div как аргумент startScrolling.

parent = $(this).closest('.scroll-container')
startScrolling(direction, scrollStep, parent)

Затем у вас есть доступ к родительскому объекту и не нужно устанавливать его в верхней части js.

В стороне, если вы устанавливаете scrollStep наверху как своего рода настраиваемую константу, вам не нужно передавать ее в качестве аргумента. startScrolling выглядит так, как будто он отлично работает без него.

В другом случае я мог видеть, что startScrolling просто принимает один аргумент: родительский div. И data-modifier мог просто жить там вместо того, чтобы жить в 2-х местах. И вы можете просто получить модификатор от родителя в функции startScrolling.

Обновить

$(function () {

    var scrollHandle = 0,
        scrollStep = 5;

    //Start the scrolling process
    $(".sliderButton").on("mouseenter", function () {
        var data = $(this).data('scrollModifier'),
            direction = parseInt(data, 10);

        $(this).addClass('active');
        parent = $(this).closest('.scroll-container');
        startScrolling(direction, scrollStep, parent);
    });

    //Kill the scrolling
    $(".sliderButton").on("mouseleave", function () {
        stopScrolling();
        $(this).removeClass('active');
    });

    //Actual handling of the scrolling
    function startScrolling(modifier, step, parent) {
        if (scrollHandle === 0) {
            scrollHandle = setInterval(function () {
                var newOffset = parent.scrollLeft() + (scrollStep * modifier);

                parent.scrollLeft(newOffset);
            }, 10);
        }
    }

    function stopScrolling() {
        clearInterval(scrollHandle);
        scrollHandle = 0;
    }

});
  • 0
    Я обновил ответ выше как предложено, у меня было два вопроса, это потребовало бы, чтобы я изменил css? Нужно ли мне также передавать publisher_id, чтобы функция прокрутки точно знала, какого издателя прокручивать?
  • 1
    Да, измените css с #scroll на .scroll-container или любой другой класс, который вы выберете. Вам не нужно передавать идентификатор издателя, поскольку вы находите правильного родителя на основе конкретного элемента, над которым вы наводите курсор (ближайший). Вы также должны удалить #scroll из div; Это плохо, когда HTML имеет более одного идентичного идентификатора на странице.
Показать ещё 3 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню