Почему Ternary Operator не работает с использованием hasClass? - PullRequest
0 голосов
/ 22 декабря 2018

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

Я ожидал, что он должен переместиться вправо, когда пользователь нажимает кнопку next, но кнопка next полностью сломана.

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

Как бы я решил эту проблему?

Блок кода:

(function($) {
  $.fn.sliderModule = function(options) {
    const defaults = {
      myGallery: $(this)
    };
    var settings = $.extend({
      myItems: null,
      trigger: null,
      current: null
    }, defaults, options);
    $(settings.trigger).on('click', function() {
      if (!(defaults.myGallery.is(':animated'))) {
        var movement = settings.trigger.hasClass('prev') ? -1 : 1
        defaults.myGallery.animate({left: "+=" + (100 / settings.current) * movement  + '%'}); // It doesn't respond the `next` button.
      };
    });
  };
})(jQuery);
$(function() {
  $('#slide-list').sliderModule({
    myItems: '#img-slider',
    trigger: $('#buttons').find('#button'),
    current: 4
  });
})
li {
  list-style-type: none;
}

#slide-container {
  position: relative !important;
  width: 1170px;
  margin: 0 auto;
  overflow: hidden;
  height: auto;
}
#slide-list {
  margin: 0 auto;
  position: relative;
  display: flex;
  width: 1170px;
}
#buttons {
  width: 1170px;
  margin: 0 auto;
  display: flex;
  justify-content: center;
}
#buttons li {
  margin: 0 20px;
}
.slide-l-quarter {
  flex-shrink: 0;
  position: relative;
  white-space: nowrap;
  width: calc(100% / 4);
}
.slide-l-quarter img {
  width: 100%;
  height: auto;
}
<div id="slide-container">
  <ul id="slide-list">
    <li class="slide-l-quarter" id="image-slider">
      <img src="https://i.imgur.com/PVsHlX9.jpg" alt="">
    </li>
    <li class="slide-l-quarter" id="image-slider">
      <img src="https://i.imgur.com/WfWhNnU.jpg" alt="">
    </li>
    <li class="slide-l-quarter" id="image-slider">
      <img src="https://i.imgur.com/eqHdnNs.jpg" alt="">
    </li>
    <li class="slide-l-quarter" id="image-slider">
      <img src="https://i.imgur.com/0jziABY.jpg" alt="">
    </li>
  </ul>
</div>
<ul id="buttons">
  <li id="button" class="prev">Prev</li>
  <li id="button" class="next">Next</li>
</ul>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>

1 Ответ

0 голосов
/ 22 декабря 2018

Нет проблем с использованием троичных операторов.Но на этом пути вы допустили некоторые ошибки.

Идентификаторы должны быть уникальными

Вы не можете иметь это в своем HTML:

<li id="button" class="prev">Prev</li>
<li id="button" class="next">Next</li>

Если вам нужно несколько элементов, чтобы иметьтот же селектор, используйте вместо него класс:

<li class="button prev">Prev</li>
<li class="button next">Next</li>

settings.trigger выбирает обе кнопки

Когда вы делаете это:

settings.trigger.hasClass('prev')

Вы ссылаетесь на обе кнопки,Вам нужен только тот, который нажал пользователь:

$(this).hasClass('prev')

Фиксированная версия

(function($) {
  $.fn.sliderModule = function(options) {
    const defaults = {
      myGallery: $(this)
    };
    var settings = $.extend({
      myItems: null,
      trigger: null,
      current: null
    }, defaults, options);
    $(settings.trigger).on('click', function() {
      if (!(defaults.myGallery.is(':animated'))) {
        var movement = $(this).hasClass('prev') ? -1 : 1;
        defaults.myGallery.animate({left: "+=" + (100 / settings.current) * movement  + '%'});
      };
    });
  };
})(jQuery);
$(function() {
  $('#slide-list').sliderModule({
    myItems: '#img-slider',
    trigger: $('#buttons').find('.button'),
    current: 4
  });
})
li {
  list-style-type: none;
}

#slide-container {
  position: relative !important;
  width: 1170px;
  margin: 0 auto;
  overflow: hidden;
  height: auto;
}
#slide-list {
  margin: 0 auto;
  position: relative;
  display: flex;
  width: 1170px;
}
#buttons {
  width: 1170px;
  margin: 0 auto;
  display: flex;
  justify-content: center;
}
#buttons li {
  margin: 0 20px;
}
.slide-l-quarter {
  flex-shrink: 0;
  position: relative;
  white-space: nowrap;
  width: calc(100% / 4);
}
.slide-l-quarter img {
  width: 100%;
  height: auto;
}
<div id="slide-container">
  <ul id="slide-list">
    <li class="slide-l-quarter" id="image-slider">
      <img src="https://i.imgur.com/PVsHlX9.jpg" alt="">
    </li>
    <li class="slide-l-quarter" id="image-slider">
      <img src="https://i.imgur.com/WfWhNnU.jpg" alt="">
    </li>
    <li class="slide-l-quarter" id="image-slider">
      <img src="https://i.imgur.com/eqHdnNs.jpg" alt="">
    </li>
    <li class="slide-l-quarter" id="image-slider">
      <img src="https://i.imgur.com/0jziABY.jpg" alt="">
    </li>
  </ul>
</div>
<ul id="buttons">
  <li class="button prev">Prev</li>
  <li class="button next">Next</li>
</ul>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...