Как использовать селекторы jQuery для независимой итерации по неупорядоченным спискам? - PullRequest
0 голосов
/ 05 февраля 2020

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

У меня работает функциональная идея - перебирать список и отображать по одному элементу за раз, но до сих пор он работал только при выборе jQuery по идентификатору.

Поскольку будет несколько продуктов отображаемые в одно время, они должны работать независимо друг от друга.

Таким образом, вес отображается следующим образом:

<div class="prev"><i class="fas fa-chevron-left fa-lg"></i></div>
          <div class="p-0 text-center"><ul class='weightList' style="list-style-type:none;padding-left:0">
            <li>$15.00<br><div class="grey-text">Gram (1g)</div></li>
            <li>$50.00<br><div class="grey-text">Eighth (3.5g)</div></li>
            <li>$100.00<br><div class="grey-text">Quarter (7g)</div></li>
            <li>$200.00<br><div class="grey-text">Half Ounce (14g)</div></li>
            <li>$350.00<br><div class="grey-text">Ounce (28g)</div></li>
            </ul>
          </div>
          <div class="p-0"><div class="next"><i class="fas fa-chevron-right fa-lg"></i>
</div>
</div>

Мой jQuery (пока - это где Мне нужна помощь) выглядит следующим образом:

var $lis = $(".weightList li").hide();
$lis.slice(0, 1).show();
var size_li = $lis.length;
var x = 1,
    start = 0;

$('.next').click(function () {
  if (start + x < size_li) {
    $lis.slice(start, start + x).hide();
    start += x;
    $lis.slice(start, start + x).show();
  }
});
$('.prev').click(function () {
  if (start - x >= 0) {
    $lis.slice(start, start + x).hide();
    start -= x;
    $lis.slice(start, start + x).show();
  }
});

Я подумал о создании div'ов 'prev', 'next' и неупорядоченного списка 'weightList' с идентификаторами, которые содержат идентификатор продукта, а затем с использованием идентификатор продукта, чтобы определить, с каким списком работать, но я не совсем уверен, как его настроить, и он кажется неэффективным / игнорирует некоторые функции jQuery.

Я настроил скрипку с тем, что я начали с: https://jsfiddle.net/qy2hb7sd/

Первое, что вы увидите, это то, что отображается только список весов под первым продуктом, второй список скрыт (оба должны начинаться с $ 15,00 с Грамм (1 г) ниже).

Во-вторых, вы увидите, что предыдущая и следующая стрелки не работают независимо и что списки веса под обоими продуктами действуют как один список, при этом список отображается на второй продукт только после того, как вы перебрали первый продукт (цена и вес перепрыгнули между продуктами).

Может быть несколько десятков товаров, загруженных на страницу одновременно (я выбрал 2 как простой пример).

Я надеюсь, что объяснил себя и свой желаемый результат, и я с нетерпением жду, чтобы изучить некоторые хорошие jQuery трюки.

1 Ответ

1 голос
/ 05 февраля 2020

По сути, вам нужно следить за каждым списком как для текущего элемента списка, так и для длины списка. Когда вы нажимаете «Далее», вам нужно увидеть, находитесь ли вы в конце списка, и если да, сбросить видимость первого элемента. И наоборот, когда вы нажимаете предыдущий, если вы находитесь на первом элементе, вам нужно скрыть его и показать элемент списка. В первой строке jQuery ниже, $(".weightList").find("li:gt(0)").hide(); скрываются все веса, кроме первой, в каждом списке. Две другие части кода контролируют, что происходит, когда вы нажимаете кнопки «Предыдущая / Следующая»:

$(".weightList").find("li:gt(0)").hide();
$('.next').click(function() {
  var vis_idx = $(this).parent().prev().find('li:visible').index();
  var list_length = $(this).parent().prev().find('li').length;
  if (vis_idx == list_length - 1) {
    $(this).parent().prev().find('li').eq(0).show();
    $(this).parent().prev().find('li').eq(list_length - 1).hide();
    vis_idx = 0;
  } else {
    $(this).parent().prev().find('li').eq(vis_idx).hide();
    $(this).parent().prev().find('li').eq(vis_idx + 1).show();
  }
})
$('.prev').click(function() {
  var vis_idx = $(this).parent().next().find('li:visible').index();
  var list_length = $(this).parent().next().find('li').length;
  if (vis_idx == 0) {
    $(this).parent().next().find('li').eq(list_length - 1).show();
    $(this).parent().next().find('li').eq(0).hide();
    vis_idx = 0;
  } else {
    $(this).parent().next().find('li').eq(vis_idx).hide();
    $(this).parent().next().find('li').eq(vis_idx - 1).show();
  }
})
<script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.4.1/jquery.min.js"></script>
<link rel="stylesheet" type="text/css" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.12.0/css/all.min.css">
<link rel="stylesheet" type="text/css" href="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/css/bootstrap.min.css">
<div class="row">

  <div class="col-lg-4 col-md-12 mb-4">

    <!-- Card -->
    <div class="card card-ecommerce">


      <div class="card-body">

        <h5 class="card-title mb-1"><strong><a href="#" class="dark-grey-text">Head Master Kush Flower - RedBud Roots</a></strong></h5><span class="badge badge-pill badge-light mb-3">Flower</span>

        <div class="card-footer p-0 m-0">
          <div class="d-flex justify-content-between pt-4">
            <div class="p-0">
              <div class="prev"><i class="fas fa-chevron-left fa-lg"></i></div>
            </div>
            <div class="p-0 text-center">
              <ul class='weightList' style="list-style-type:none;padding-left:0">
                <li>$15.00<br>
                  <div class="grey-text">Gram (1g)</div>
                </li>
                <li>$50.00<br>
                  <div class="grey-text">Eighth (3.5g)</div>
                </li>
                <li>$100.00<br>
                  <div class="grey-text">Quarter (7g)</div>
                </li>
                <li>$200.00<br>
                  <div class="grey-text">Half Ounce (14g)</div>
                </li>
                <li>$350.00<br>
                  <div class="grey-text">Ounce (28g)</div>
                </li>
              </ul>
            </div>
            <div class="p-0">
              <div class="next"><i class="fas fa-chevron-right fa-lg"></i></div>
            </div>
          </div>

        </div>

      </div>

    </div>

  </div>
  <div class="col-lg-4 col-md-12 mb-4">

    <!-- Card -->
    <div class="card card-ecommerce">


      <div class="card-body">

        <h5 class="card-title mb-1"><strong><a href="#" class="dark-grey-text">High Life OG Kush Flower</a></strong></h5><span class="badge badge-pill badge-light mb-3">Flower</span>

        <div class="card-footer p-0 m-0">
          <div class="d-flex justify-content-between pt-4">
            <div class="p-0">
              <div class="prev"><i class="fas fa-chevron-left fa-lg"></i></div>
            </div>
            <div class="p-0 text-center">
              <ul class='weightList' style="list-style-type:none;padding-left:0">
                <li>$15.00<br>
                  <div class="grey-text">Gram (1g)</div>
                </li>
                <li>$50.00<br>
                  <div class="grey-text">Eighth (3.5g)</div>
                </li>
                <li>$100.00<br>
                  <div class="grey-text">Quarter (7g)</div>
                </li>
                <li>$200.00<br>
                  <div class="grey-text">Half Ounce (14g)</div>
                </li>
                <li>$350.00<br>
                  <div class="grey-text">Ounce (28g)</div>
                </li>
              </ul>
            </div>
            <div class="p-0">
              <div class="next"><i class="fas fa-chevron-right fa-lg"></i></div>
            </div>
          </div>

        </div>

      </div>

    </div>

  </div>
</div>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...