Запуск функции jQuery в отдельных классах

#html #jquery

#HTML #jquery

Вопрос:

У меня есть несколько элементов HTML, которые имеют одинаковую разметку. У каждого div есть уникальный родительский класс.

Поэтому, когда я пытаюсь написать некоторый jQuery для таргетинга на каждый элемент по отдельности, он срабатывает во всех экземплярах независимо от того, указываю ли я, на какой класс ориентироваться. Я думал, что при использовании (this) он будет нацелен только на содержимое внутри div ‘box__wrapper—before’.

Кто-нибудь знает, где я ошибаюсь?

 $('.box__wrapper--before').each(function() {
  $(this).find('.box__random').insertBefore('.box__item:nth-child(3');
}); 
 html {
  box-sizing: border-box;
  font-size: 62.5%;
}

*,
*:before,
*:after {
  box-sizing: inherit;
}

body {
  background: #282828;
  color: white;
  font-family: "Montserrat", sans-serif;
  font-size: 1.6rem;
  font-weight: 500;
  line-height: 1;
  margin: 0;
}

h1 {
  color: white;
  font-size: 20px;
  font-weight: 600;
  margin-bottom: 20px;
  margin-top: 0;
}

.box__wrapper {
  color: #111;
  padding-bottom: 20px;
  padding-top: 20px;
}

.box__wrapper:nth-child(odd) {
  background: green;
}

.box__wrapper:nth-child(even) {
  background: blue;
}

.box__container {
  margin-left: auto;
  margin-right: auto;
  max-width: 1200px;
}

.box__flex__wrapper {
  display: flex;
  justify-content: center;
  margin-left: -60px;
}

.box__item {
  padding-left: 60px;
  flex-basis: 20%;
  max-width: 20%;
}

.box__item span {
  align-items: center;
  border: 4px solid white;
  border-radius: 100px;
  display: flex;
  height: 60px;
  justify-content: center;
}

.box__one span,
.box__three span {
  background: #58b2eb;
}

.box__two span,
.box__four span {
  background: #ffa770;
}

.box__random span {
  background: #7fd28c;
}

.prod__cta__msg {
  background: red;
  bottom: 0;
  position: absolute;
  width: 100%;
} 
 <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<section class="box__wrapper box__wrapper--before">
  <div class="box__container">
    <div class="box__flex__wrapper">
      <div class="box__item box__one">
        <span>Div One</span>
      </div>

      <div class="box__item box__two">
        <span>Div Two</span>
      </div>

      <div class="box__item box__three">
        <span>Div Three</span>
      </div>

      <div class="box__item box__four">
        <span>Div Four</span>
      </div>

      <div class="box__item box__random">
        <span>Dynamic Div 1</span>
      </div>
    </div>
  </div>
</section>

<section class="box__wrapper box__wrapper--after">
  <div class="box__container">
    <div class="box__flex__wrapper">
      <div class="box__item box__one">
        <span>Div One</span>
      </div>

      <div class="box__item box__two">
        <span>Div Two</span>
      </div>

      <div class="box__item box__three">
        <span>Div Three</span>
      </div>

      <div class="box__item box__four">
        <span>Div Four</span>
      </div>

      <div class="box__item box__random">
        <span>Dynamic Div 2</span>
      </div>
    </div>
  </div>
</section> 

Пример Codepen: https://codepen.io/nickelse/pen/MWbdvPw

Комментарии:

1. Не совсем понятно, какая цель более высокого уровня здесь

2. Ну, я только хочу, чтобы jQuery запускался на любом div с классом ‘box__wrapper—before’, но он нацелен на все divs, поскольку разметка одинакова внутри обоих divs. Таким образом, он находит каждый экземпляр ‘box__random’, а не только те, что находятся внутри ‘box__wrapper—before’.

3. Я вижу только один раздел с этим классом. Все еще не ясно. Пожалуйста, предоставьте правильное объяснение полного ожидаемого поведения и того, как показанный код отличается от него

4. Есть два divs с точно такой же разметкой. У одного есть родительский класс ‘box__wrapper—before’, а у другого есть ‘box__wrapper—after’, поэтому я хочу настроить таргетинг только на разметку внутри ‘box__wrapper—before’, но jQuery, как он есть, нацелен на все, поэтому нет никакой специфики.

5. OK Может использовать $(this).find... то же самое, что и способ, которым вы находите случайный класс

Ответ №1:

Проблема заключается в:

 .insertBefore('.box__item:nth-child(3)')
 

который добавляет box_random во все разделы.

.insertBefore Может принимать объект jquery (а не просто селектор строк), который указывает точку вставки, поэтому вы можете использовать this для поиска только соответствующего n-го дочернего элемента:

 $('.box__wrapper--before').each(function() {
  var third = $('.box__item:nth-child(3)', this);
  $(this).find('.box__random').insertBefore(third);
});
 

(переменная не требуется, показана для наглядности)

Оригинал мог быть написан как:

 $('.box__wrapper--before').each(function() {

  var third = $('.box__item:nth-child(3)');

  $(this).find('.box__random').insertBefore(third);
});
 

где вы можете видеть, что

   var third = $('.box__item:nth-child(3)');
 

выбирает все элементы для всех родителей — поэтому необходимо добавить эту специфику.

Ниже приведен обновленный фрагмент. Здесь поле__random во 2-м div не перемещается, потому что его нет в .box__wrapper—before .

 $('.box__wrapper--before').each(function() {
  $(this).find('.box__random').insertBefore($('.box__item:nth-child(3)', this));
}); 
 html {
  box-sizing: border-box;
  font-size: 62.5%;
}

*,
*:before,
*:after {
  box-sizing: inherit;
}

body {
  background: #282828;
  color: white;
  font-family: "Montserrat", sans-serif;
  font-size: 1.6rem;
  font-weight: 500;
  line-height: 1;
  margin: 0;
}

h1 {
  color: white;
  font-size: 20px;
  font-weight: 600;
  margin-bottom: 20px;
  margin-top: 0;
}

.box__wrapper {
  color: #111;
  padding-bottom: 20px;
  padding-top: 20px;
}

.box__wrapper:nth-child(odd) {
  background: green;
}

.box__wrapper:nth-child(even) {
  background: blue;
}

.box__container {
  margin-left: auto;
  margin-right: auto;
  max-width: 1200px;
}

.box__flex__wrapper {
  display: flex;
  justify-content: center;
  margin-left: -60px;
}

.box__item {
  padding-left: 60px;
  flex-basis: 20%;
  max-width: 20%;
}

.box__item span {
  align-items: center;
  border: 4px solid white;
  border-radius: 100px;
  display: flex;
  height: 60px;
  justify-content: center;
}

.box__one span,
.box__three span {
  background: #58b2eb;
}

.box__two span,
.box__four span {
  background: #ffa770;
}

.box__random span {
  background: #7fd28c;
}

.prod__cta__msg {
  background: red;
  bottom: 0;
  position: absolute;
  width: 100%;
} 
 <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<section class="box__wrapper box__wrapper--before">
  <div class="box__container">
    <div class="box__flex__wrapper">
      <div class="box__item box__one">
        <span>Div One</span>
      </div>

      <div class="box__item box__two">
        <span>Div Two</span>
      </div>

      <div class="box__item box__three">
        <span>Div Three</span>
      </div>

      <div class="box__item box__four">
        <span>Div Four</span>
      </div>

      <div class="box__item box__random">
        <span>Dynamic Div 1</span>
      </div>
    </div>
  </div>
</section>

<section class="box__wrapper box__wrapper--after">
  <div class="box__container">
    <div class="box__flex__wrapper">
      <div class="box__item box__one">
        <span>Div One</span>
      </div>

      <div class="box__item box__two">
        <span>Div Two</span>
      </div>

      <div class="box__item box__three">
        <span>Div Three</span>
      </div>

      <div class="box__item box__four">
        <span>Div Four</span>
      </div>

      <div class="box__item box__random">
        <span>Dynamic Div 2</span>
      </div>
    </div>
  </div>
</section>